diff --git a/.github/docker/Dockerfile b/.github/docker/Dockerfile index de960c8703..b4b1bc3c89 100644 --- a/.github/docker/Dockerfile +++ b/.github/docker/Dockerfile @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, Arm Limited and Contributors +# Copyright (c) 2022-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -80,7 +80,7 @@ ENV PATH="$PATH:$ANDROID_HOME/platform-tools:${ANDROID_SDK_TOOLS}/tools/bin:$AND RUN mkdir -p $ANDROID_HOME # Configure Android NDK -ENV NDK_VERSION=r25b +ENV NDK_VERSION=r28c RUN set -x && wget -q https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux.zip -O /tmp/android-ndk.zip \ && unzip -qq /tmp/android-ndk.zip -d /usr/local \ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 76ad81c0a4..03993f25fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: name: "Build ${{ matrix.platform }} in ${{ matrix.build_type }}" strategy: matrix: - platform: [windows, ubuntu, macos] + platform: [windows, ubuntu] build_type: [Debug, Release] env: PARALLEL: -j 2 @@ -52,7 +52,58 @@ jobs: - if: ${{ matrix.platform != 'windows' }} name: Configure and build run: | - cmake -B"build/${{ matrix.platform }}" -DVKB_BUILD_TESTS=ON -DVKB_BUILD_SAMPLES=ON + cmake -B"build/${{ matrix.platform }}" -DVKB_BUILD_TESTS=ON -DVKB_BUILD_SAMPLES=ON -DGLFW_BUILD_WAYLAND=OFF + cmake --build "build/${{ matrix.platform }}" --target vulkan_samples --config ${{ matrix.build_type }} ${{ env.PARALLEL }} + + build_v2: + name: "Build ${{ matrix.platform }} in ${{ matrix.build_type }}" + strategy: + matrix: + platform: [windows, ubuntu] + build_type: [Release] + env: + PARALLEL: -j 2 + runs-on: "${{ matrix.platform }}-latest" + steps: + - uses: actions/checkout@v4 + with: + submodules: "recursive" + + - if: ${{ matrix.platform == 'ubuntu' }} + name: Install RandR headers + run: | + sudo apt-get update + sudo apt install xorg-dev libglu1-mesa-dev + + - name: Configure + run: cmake -B"build/${{ matrix.platform }}" -DVKB_BUILD_TESTS=ON -DGLFW_BUILD_WAYLAND=OFF + + - name: "Build Components ${{ matrix.platform }} in ${{ matrix.build_type }}" + run: cmake --build "build/${{ matrix.platform }}" --target vkb__components --config ${{ matrix.build_type }} ${{ env.PARALLEL }} + + build_macos: + needs: build + name: "Build ${{ matrix.platform }} in ${{ matrix.build_type }}" + strategy: + # masoc is 10x expensive to run on GitHub machines, so only build simplest variations + matrix: + platform: [macos] + # Release builds are about 3 times faster than debug builds + build_type: [Release] + env: + PARALLEL: -j 2 + runs-on: "${{ matrix.platform }}-latest" + steps: + - uses: actions/checkout@v4 + with: + submodules: "recursive" + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2.9 + with: + key: ${{ github.job }}-${{ matrix.os }} + - name: Configure and build + run: | + cmake -B"build/${{ matrix.platform }}" -DVKB_BUILD_TESTS=ON -DVKB_BUILD_SAMPLES=ON -DCMAKE_OSX_SYSROOT=macosx -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 cmake --build "build/${{ matrix.platform }}" --target vulkan_samples --config ${{ matrix.build_type }} ${{ env.PARALLEL }} build_d2d: @@ -89,11 +140,11 @@ jobs: with: submodules: "recursive" - - name: set up JDK 11 - uses: actions/setup-java@v3 + - name: set up JDK + uses: actions/setup-java@v4 with: - java-version: "11" - distribution: "temurin" + java-version: "21" + distribution: "zulu" cache: gradle - name: ccache uses: hendrikmuhs/ccache-action@v1.2.9 @@ -108,11 +159,13 @@ jobs: run: NDK_CCACHE=1 NDK_CCACHE_BIN=ccache ./gradlew app:assemble${{ matrix.build_type }} --info build_ios: + # iOS is 10x expensive to run on GitHub machines, so only run if we know something else fast/simple passed as well + needs: build name: "Build ios in ${{ matrix.build_type }}" runs-on: macos-latest strategy: matrix: - build_type: [Debug] + build_type: [Release] steps: - uses: actions/checkout@v4 @@ -126,7 +179,7 @@ jobs: - name: Load VulkanSDK from cache id: VulkanSDK - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: VulkanSDK key: vulkan @@ -134,13 +187,12 @@ jobs: - name: retrieve VulkanSDK if: steps.VulkanSDK.outputs.cache-hit != 'true' run: | - wget https://sdk.lunarg.com/sdk/download/1.3.290.0/mac/vulkansdk-macos-1.3.290.0.dmg - sudo hdiutil attach vulkansdk-macos-1.3.290.0.dmg - sudo /Volumes/vulkansdk-macos-1.3.290.0/InstallVulkan.app/Contents/MacOS/InstallVulkan --root ~/VulkanSDK --accept-licenses --default-answer --confirm-command install com.lunarg.vulkan.ios - sudo hdiutil detach /Volumes/vulkansdk-macos-1.3.290.0 + wget https://sdk.lunarg.com/sdk/download/1.4.304.1/mac/vulkansdk-macos-1.4.304.1.zip + unzip vulkansdk-macos-1.4.304.1.zip + sudo InstallVulkan-1.4.304.1.app/Contents/MacOS/InstallVulkan-1.4.304.1 --root ~/VulkanSDK --accept-licenses --default-answer --confirm-command install com.lunarg.vulkan.ios - name: build_ios run: | source ~/VulkanSDK/iOS/setup-env.sh - cmake -H"." -B"build/ios" -DVKB_BUILD_TESTS=ON -DVKB_BUILD_SAMPLES=ON -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO - cmake --build "build/ios" --target vulkan_samples --config ${{ matrix.build_type }} -- -sdk iphoneos -allowProvisioningUpdates + cmake -H"." -B"build/ios" -DVKB_BUILD_TESTS=ON -DVKB_BUILD_SAMPLES=ON -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_DEPLOYMENT_TARGET=16.3 -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO + cmake --build "build/ios" --target vulkan_samples --config ${{ matrix.build_type }} -- -allowProvisioningUpdates diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c6f07435c8..02fae70b50 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -99,7 +99,7 @@ jobs: with: submodules: "recursive" - run: git config --global --add safe.directory /__w/Vulkan-Samples/Vulkan-Samples - - run: cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -Bbuild/clang + - run: cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DGLFW_BUILD_WAYLAND=OFF -Bbuild/clang - run: | /usr/bin/run-clang-tidy -j $(($(nproc)/2+1)) -p build/clang -header-filter=framework,samples,app -checks=-*,google-*,-google-runtime-references -quiet ${{ needs.changed-files.outputs.all }} diff --git a/.github/workflows/v2.yml b/.github/workflows/v2.yml deleted file mode 100644 index dc2f9bde9f..0000000000 --- a/.github/workflows/v2.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Build and Test v2 - -on: - pull_request: - types: [opened, synchronize, reopened] - push: - branches: [main] - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} - cancel-in-progress: true - -jobs: - build: - name: "Build ${{ matrix.platform }} in ${{ matrix.build_type }}" - strategy: - matrix: - platform: [windows, ubuntu, macos] - build_type: [Debug, Release] - env: - PARALLEL: -j 2 - runs-on: "${{ matrix.platform }}-latest" - steps: - - uses: actions/checkout@v4 - with: - submodules: "recursive" - - - if: ${{ matrix.platform == 'ubuntu' }} - name: Install RandR headers - run: | - sudo apt-get update - sudo apt install xorg-dev libglu1-mesa-dev - - - name: Configure - run: cmake -B"build/${{ matrix.platform }}" -DVKB_BUILD_TESTS=ON - - - name: "Build Components ${{ matrix.platform }} in ${{ matrix.build_type }}" - run: cmake --build "build/${{ matrix.platform }}" --target vkb__components --config ${{ matrix.build_type }} ${{ env.PARALLEL }} - - - name: "Build Tests ${{ matrix.platform }} in ${{ matrix.build_type }}" - run: cmake --build "build/${{ matrix.platform }}" --target vkb__tests --config ${{ matrix.build_type }} ${{ env.PARALLEL }} - - - name: "Run Tests ${{ matrix.platform }} in ${{ matrix.build_type }}" - run: ctest -C ${{ matrix.build_type }} --test-dir "build/${{ matrix.platform }}" --output-on-failure diff --git a/.gitignore b/.gitignore index 6dd763603a..ae7eb7f68f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ assets/scenes +cache build .vs .vscode diff --git a/.gitmodules b/.gitmodules index 375b9368a9..d3bfb3ed65 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,9 +16,6 @@ [submodule "third_party/glfw"] path = third_party/glfw url = https://github.com/glfw/glfw -[submodule "third_party/glslang"] - path = third_party/glslang - url = https://github.com/KhronosGroup/glslang [submodule "third_party/spirv-cross"] path = third_party/spirv-cross url = https://github.com/KhronosGroup/SPIRV-Cross @@ -37,9 +34,6 @@ [submodule "third_party/astc"] path = third_party/astc url = https://github.com/ARM-software/astc-encoder -[submodule "third_party/CTPL"] - path = third_party/CTPL - url = https://github.com/vit-vit/CTPL [submodule "third_party/vulkan"] path = third_party/vulkan url = https://github.com/KhronosGroup/Vulkan-Headers @@ -47,15 +41,9 @@ path = assets url = https://github.com/KhronosGroup/Vulkan-Samples-Assets shallow = true -[submodule "third_party/cli11"] - path = third_party/cli11 - url = https://github.com/CLIUtils/CLI11.git [submodule "third_party/opencl"] path = third_party/opencl url = https://github.com/KhronosGroup/OpenCL-Headers.git -[submodule "third_party/catch2"] - path = third_party/catch2 - url = https://github.com/catchorg/Catch2.git [submodule "third_party/fmt"] path = third_party/fmt url = https://github.com/fmtlib/fmt diff --git a/CMakeLists.txt b/CMakeLists.txt index 067e5804e5..f40039a3ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ -# Copyright (c) 2020-2024, Arm Limited and Contributors -# Copyright (c) 2024, Mobica Limited +# Copyright (c) 2020-2025, Arm Limited and Contributors +# Copyright (c) 2024-2025, Mobica Limited +# Copyright (c) 2024-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -36,6 +37,9 @@ cmake_minimum_required(VERSION 3.16) project(vulkan_samples) +if(VKB_GENERATE_ANTORA_SITE) + add_subdirectory(antora) +else () # search for Vulkan SDK find_package(Vulkan) @@ -53,11 +57,57 @@ if(Vulkan_FOUND) else() message(STATUS "Couldn't find DirectX Shader Compiler executable, make sure it is present in Vulkan SDK or add it manually via Vulkan_dxc_EXECUTABLE cmake variable. HLSL shaders won't be compiled.") endif() + # slang compiler + if(NOT Vulkan_slang_exe_FOUND) + find_program(Vulkan_slang_EXECUTABLE + NAMES slangc + HINTS + "$ENV{VULKAN_SDK}/Bin" + "$ENV{VULKAN_SDK}/bin" + ) + endif() + if(Vulkan_slang_EXECUTABLE) + message(STATUS "Found slang Shader Compiler under ${Vulkan_slang_EXECUTABLE}") + else() + message(STATUS "Couldn't find slang Shader Compiler executable, make sure it is present in Vulkan SDK or add it manually via Vulkan_slang_EXECUTABLE cmake variable. Slang shaders won't be compiled.") + endif() + # glsl compiler + if(NOT Vulkan_glslc_exe_FOUND) + find_program(Vulkan_glslc_EXECUTABLE + NAMES glslc + HINTS + "$ENV{VULKAN_SDK}/Bin" + "$ENV{VULKAN_SDK}/bin" + ) + endif() + if(Vulkan_glslc_EXECUTABLE) + message(STATUS "Found glslc Shader Compiler under ${Vulkan_glslc_EXECUTABLE}") + else() + message(STATUS "Couldn't find glslc Shader Compiler executable, make sure it is present in Vulkan SDK or add it manually via Vulkan_glslc_EXECUTABLE cmake variable. GLSL shaders won't be compiled.") + endif() + # spvasm compiler + if(NOT Vulkan_spirvas_exe_FOUND) + find_program(Vulkan_spirvas_EXECUTABLE + NAMES spirv-as + HINTS + "$ENV{VULKAN_SDK}/Bin" + "$ENV{VULKAN_SDK}/bin" + ) + endif() + if(Vulkan_spirvas_EXECUTABLE) + message(STATUS "Found spirv-as Shader Compiler under ${Vulkan_spirvas_EXECUTABLE}") + else() + message(STATUS "Couldn't find spirv-as Shader Compiler executable, make sure it is present in Vulkan SDK or add it manually via Vulkan_spirvas_EXECUTABLE cmake variable. SPIR-V assembly shaders won't be compiled.") + endif() + endif() # globally add VKB_DEBUG for the debug build add_compile_definitions($<$:VKB_DEBUG>) +#globally define VULKAN_HPP_NO_STRUCT_CONSTRUCTORS to have designated initializers for the vk-structs +add_compile_definitions(VULKAN_HPP_NO_STRUCT_CONSTRUCTORS) + # globally set -fno-strict-aliasing, needed due to using reinterpret_cast if (NOT MSVC) add_compile_options(-fno-strict-aliasing) @@ -89,8 +139,6 @@ include(component_helper) # Add third party libraries add_subdirectory(third_party) -vkb__enable_testing() - # Framework v2.0 components directory add_subdirectory(components) @@ -104,5 +152,4 @@ endif() # Add vulkan app (runs all samples) add_subdirectory(app) - -add_subdirectory(antora) +endif () \ No newline at end of file diff --git a/README.adoc b/README.adoc index a4ec7d9771..70452c0ced 100644 --- a/README.adoc +++ b/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -52,11 +52,14 @@ endif::[] xref:samples/performance/README.adoc[Performance samples] show the recommended best practice together with real-time profiling information. They are more advanced but also contain a detailed tutorial with more in-detail explanations. +=== Requirements + +The samples are written in C{pp} and require a compiler that supports at least C{pp}20. To run the samples, a device that supports at least Vulkan 1.1 or newer is required. Some samples might require a higher Vulkan version and/or support for certain extensions. + === Goals * Create a collection of resources that demonstrate best-practice recommendations in Vulkan * Create tutorials that explain the implementation of best-practices and include performance analysis guides -* Create a xref:framework/README.adoc[framework] that can be used as reference material and also as a sandbox for advanced experimentation with Vulkan == Samples diff --git a/antora/CMakeLists.txt b/antora/CMakeLists.txt index e1441c1c1e..93d9214e18 100644 --- a/antora/CMakeLists.txt +++ b/antora/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2022-2024 The Khronos Group Inc. +# Copyright 2022-2025 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 # Configure Vulkan Guide Antora tree with transformed markup files. @@ -14,16 +14,15 @@ function(gatherAntoraAssets) samples scripts shaders - third_party ) set(PAGES_DIR_SEARCH) set(IMAGES_DIR_SEARCH) foreach (DIR ${DIRS_TO_SEARCH}) list(APPEND PAGES_DIR_SEARCH ${CMAKE_SOURCE_DIR}/${DIR}/*.adoc) - list(APPEND IMAGES_DIR_SEARCH ${CMAKE_SOURCE_DIR}/${DIR}/*.jpg ${CMAKE_SOURCE_DIR}/${DIR}/*.png ${CMAKE_SOURCE_DIR}/${DIR}/*.gif) + list(APPEND IMAGES_DIR_SEARCH ${CMAKE_SOURCE_DIR}/${DIR}/*.jpg ${CMAKE_SOURCE_DIR}/${DIR}/*.png ${CMAKE_SOURCE_DIR}/${DIR}/*.gif ${CMAKE_SOURCE_DIR}/*.svg) endforeach () file(GLOB PAGES ${CMAKE_SOURCE_DIR}/*.adoc) - file(GLOB IMAGES ${CMAKE_SOURCE_DIR}/*.jpg ${CMAKE_SOURCE_DIR}/*.png ${CMAKE_SOURCE_DIR}/*.gif) + file(GLOB IMAGES ${CMAKE_SOURCE_DIR}/*.jpg ${CMAKE_SOURCE_DIR}/*.png ${CMAKE_SOURCE_DIR}/*.gif ${CMAKE_SOURCE_DIR}/*.svg) file(GLOB_RECURSE PAGES_R ${PAGES_DIR_SEARCH}) file(GLOB_RECURSE IMAGES_R ${IMAGES_DIR_SEARCH}) diff --git a/antora/modules/ROOT/nav.adoc b/antora/modules/ROOT/nav.adoc index 4e2eba4474..cfe1df8e5e 100644 --- a/antora/modules/ROOT/nav.adoc +++ b/antora/modules/ROOT/nav.adoc @@ -1,6 +1,7 @@ //// -- Copyright (c) 2023-2024, Holochip Inc -- Copyright (c) 2023-2024, Sascha Willems +- Copyright (c) 2023-2025, Holochip Inc +- Copyright (c) 2023-2025, Sascha Willems +- Copyright (c) 2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -31,8 +32,8 @@ *** xref:samples/api/hpp_hdr/README.adoc[HDR (Vulkan-Hpp)] ** xref:samples/api/hello_triangle/README.adoc[Hello Triangle] *** xref:samples/api/hpp_hello_triangle/README.adoc[Hello Triangle (Vulkan-Hpp)] -** xref:samples/api/hlsl_shaders/README.adoc[HLSL Shaders] -*** xref:samples/api/hpp_hlsl_shaders/README.adoc[HLSL Shaders (Vulkan-Hpp)] +** xref:samples/api/hello_triangle_1_3/README.adoc[Hello Triangle 1.3] +*** xref:samples/api/hpp_hello_triangle_1_3/README.adoc[Hello Triangle 1.3(Vulkan-Hpp)] ** xref:samples/api/instancing/README.adoc[Instancing] *** xref:samples/api/hpp_instancing/README.adoc[Instancing (Vulkan-Hpp)] ** xref:samples/api/separate_image_sampler/README.adoc[Separate image sampler] @@ -62,6 +63,7 @@ ** xref:samples/extensions/dynamic_rendering/README.adoc[Dynamic rendering] ** xref:samples/extensions/dynamic_rendering_local_read/README.adoc[Dynamic rendering local read] ** xref:samples/extensions/extended_dynamic_state2/README.adoc[Extended dynamic state2] +** xref:samples/extensions/fragment_density_map/README.adoc[Fragment density map] ** xref:samples/extensions/fragment_shader_barycentric/README.adoc[Fragment shader barycentric] ** xref:samples/extensions/fragment_shading_rate/README.adoc[Fragment shading rate] ** xref:samples/extensions/fragment_shading_rate_dynamic/README.adoc[Fragment shading rate dynamic] @@ -89,8 +91,11 @@ ** xref:samples/extensions/shader_debugprintf/README.adoc[Shader Debug Printf] ** xref:samples/extensions/sparse_image/README.adoc[Sparse Image] ** xref:samples/extensions/synchronization_2/README.adoc[Synchronization 2] +** xref:samples/extensions/tensor_and_data_graph/README.adoc[Tensor and Data Graph] +*** xref:samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/README.adoc[Simple Tensor and Data Graph] ** xref:samples/extensions/timeline_semaphore/README.adoc[Timeline semaphore] ** xref:samples/extensions/vertex_dynamic_state/README.adoc[Vertex dynamic state] +** xref:samples/extensions/dynamic_multisample_rasterization/README.adoc[Dynamic multisample rasterization] * xref:samples/performance/README.adoc[Performance samples] ** xref:samples/performance/16bit_arithmetic/README.adoc[16bit arithmetic] ** xref:samples/performance/16bit_storage_input_output/README.adoc[16bit storage input output] @@ -126,3 +131,4 @@ ** xref:docs/build.adoc[Build guide] ** xref:docs/memory_limits.adoc[Memory limits] ** xref:docs/misc.adoc[Miscellaneous] +* link:https://github.com/KhronosGroup/Vulkan-Samples[GitHub Repository, window=_blank] \ No newline at end of file diff --git a/app/android/AndroidManifest.xml b/app/android/AndroidManifest.xml index 48aca63e72..ab89fde8b9 100644 --- a/app/android/AndroidManifest.xml +++ b/app/android/AndroidManifest.xml @@ -1,6 +1,6 @@ (argv)); _context = (vkb::IosPlatformContext*)context.get(); _context->view = self.vulkan_view; @@ -58,16 +60,17 @@ - (void)viewDidLoad { -(void) renderLoop { if(!_displayLink.isPaused && [UIApplication sharedApplication].applicationState == UIApplicationStateActive) { - _code = ((vkb::IosPlatform*)_context->userPlatform)->main_loop_frame(); - } -} + if(_code == vkb::ExitCode::Success) { + _code = ((vkb::IosPlatform*)_context->userPlatform)->main_loop_frame(); + } + else { + // On ExitCode error, remove displayLink from run loop and terminate any active sample or batch run + [_displayLink invalidate]; + ((vkb::IosPlatform*)_context->userPlatform)->terminate(_code); -- (void)dealloc { - [_displayLink invalidate]; - [_displayLink release]; - ((vkb::IosPlatform*)_context->userPlatform)->terminate(_code); - - [self.vulkan_view release]; - [super dealloc]; + // Not typically allowed for iOS apps, but exit here given this is an Xcode-controlled dev application + exit(0); + } + } } @end diff --git a/app/plugins/batch_mode/batch_mode.cpp b/app/plugins/batch_mode/batch_mode.cpp index 44ece26442..98a56f291a 100644 --- a/app/plugins/batch_mode/batch_mode.cpp +++ b/app/plugins/batch_mode/batch_mode.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,15 +17,10 @@ */ #include "batch_mode.h" - #include "vulkan_sample.h" -#include "platform/parser.h" - namespace plugins { -using BatchModeSampleIter = std::vector::const_iterator; - BatchMode::BatchMode() : BatchModeTags("Batch Mode", "Run a collection of samples in sequence.", @@ -32,57 +28,123 @@ BatchMode::BatchMode() : vkb::Hook::OnUpdate, vkb::Hook::OnAppError, }, - {&batch_cmd}) + {{"batch", "Enable batch mode"}}, + {{"category", "Filter samples by categories"}, + {"duration", "The duration which a configuration should run for in seconds"}, + {"skip", "Skip a sample by id"}, + {"tag", "Filter samples by tags"}, + {"wrap-to-start", "Once all configurations have run wrap to the start"}}) { } -bool BatchMode::is_active(const vkb::CommandParser &parser) +bool BatchMode::handle_command(std::deque &arguments) const { - return parser.contains(&batch_cmd); + assert(!arguments.empty()); + if (arguments[0] == "batch") + { + arguments.pop_front(); + return true; + } + return false; } -void BatchMode::init(const vkb::CommandParser &parser) +bool BatchMode::handle_option(std::deque &arguments) { - if (parser.contains(&duration_flag)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "category") { - sample_run_time_per_configuration = std::chrono::duration{parser.as(&duration_flag)}; - } + if (arguments.size() < 2) + { + LOGE("Option \"category\" is missing the actual category!"); + return false; + } + std::string category = arguments[1]; + if (std::ranges::any_of(categories, [&category](auto const &c) { return c == category; })) + { + LOGW("Option \"category\" lists category \"{}\" multiple times!", category) + } + else + { + categories.push_back(category); + } - if (parser.contains(&wrap_flag)) - { - wrap_to_start = true; + arguments.pop_front(); + arguments.pop_front(); + return true; } - - std::vector tags; - if (parser.contains(&tags_flag)) + else if (option == "duration") { - tags = parser.as>(&tags_flag); - } + if (arguments.size() < 2) + { + LOGE("Option \"duration\" is missing the actual duration!"); + return false; + } + duration = std::chrono::duration{std::stof(arguments[1])}; - std::vector categories; - if (parser.contains(&categories_flag)) + arguments.pop_front(); + arguments.pop_front(); + return true; + } + else if (option == "skip") { - categories = parser.as>(&categories_flag); + if (arguments.size() < 2) + { + LOGE("Option \"skip\" is missing the sample_id to skip!"); + return false; + } + std::string sample_id = arguments[1]; + if (!skips.insert(sample_id).second) + { + LOGW("Option \"skip\" lists sample_id \"{}\" multiple times!", sample_id) + } + + arguments.pop_front(); + arguments.pop_front(); + return true; } + else if (option == "tag") + { + if (arguments.size() < 2) + { + LOGE("Option \"tag\" is missing the actual to tag!"); + return false; + } + std::string tag = arguments[1]; + if (std::ranges::any_of(tags, [&tag](auto const &t) { return t == tag; })) + { + LOGW("Option \"tag\" lists tag \"{}\" multiple times!", tag) + } + else + { + tags.push_back(tag); + } - std::unordered_set skips; - if (parser.contains(&skip_flag)) + arguments.pop_front(); + arguments.pop_front(); + return true; + } + else if (option == "wrap-to-start") { - skips = parser.as>(&skip_flag); + wrap_to_start = true; + + arguments.pop_front(); + return true; } + return false; +} +void BatchMode::trigger_command() +{ sample_list = apps::get_samples(categories, tags); + if (!skips.empty()) { std::vector filtered_list; - filtered_list.reserve(sample_list.size()); + filtered_list.reserve(sample_list.size() - skips.size()); std::copy_if( - sample_list.begin(), sample_list.end(), - std::back_inserter(filtered_list), - [&](const apps::AppInfo *app) { - return skips.find(app->id) == skips.end(); - }); + sample_list.begin(), sample_list.end(), std::back_inserter(filtered_list), [&](const apps::AppInfo *app) { return !skips.count(app->id); }); if (filtered_list.size() != sample_list.size()) { @@ -111,7 +173,7 @@ void BatchMode::on_update(float delta_time) elapsed_time += delta_time; // When the runtime for the current configuration is reached, advance to the next config or next sample - if (elapsed_time >= sample_run_time_per_configuration.count()) + if (elapsed_time >= duration.count()) { elapsed_time = 0.0f; diff --git a/app/plugins/batch_mode/batch_mode.h b/app/plugins/batch_mode/batch_mode.h index f7ab9e5b24..3e7808b376 100644 --- a/app/plugins/batch_mode/batch_mode.h +++ b/app/plugins/batch_mode/batch_mode.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -45,43 +46,25 @@ class BatchMode : public BatchModeTags virtual ~BatchMode() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; + void on_update(float delta_time) override; + void on_app_error(const std::string &app_id) override; - virtual void init(const vkb::CommandParser &parser) override; - - virtual void on_update(float delta_time) override; - - virtual void on_app_error(const std::string &app_id) override; - - // TODO: Could this be replaced by the stop after plugin? - vkb::FlagCommand duration_flag{vkb::FlagType::OneValue, "duration", "", "The duration which a configuration should run for in seconds"}; - - vkb::FlagCommand wrap_flag{vkb::FlagType::FlagOnly, "wrap-to-start", "", "Once all configurations have run wrap to the start"}; - - vkb::FlagCommand tags_flag{vkb::FlagType::ManyValues, "tag", "T", "Filter samples by tags"}; - - vkb::FlagCommand categories_flag{vkb::FlagType::ManyValues, "category", "C", "Filter samples by categories"}; - - vkb::FlagCommand skip_flag{vkb::FlagType::ManyValues, "skip", "", "Skip a sample by id"}; - - vkb::SubCommand batch_cmd{"batch", "Enable batch mode", {&duration_flag, &wrap_flag, &tags_flag, &categories_flag, &skip_flag}}; + bool handle_command(std::deque &arguments) const override; + bool handle_option(std::deque &arguments) override; + void trigger_command() override; private: - /// The list of suitable samples to be run in conjunction with batch mode - std::vector sample_list{}; - - /// An iterator to the current batch mode sample info object - std::vector::const_iterator sample_iter; - - /// The amount of time run per configuration for each sample - std::chrono::duration sample_run_time_per_configuration{3s}; - - float elapsed_time{0.0f}; - - bool wrap_to_start = false; - void request_app(); - void load_next_app(); + + private: + std::vector categories; + std::chrono::duration duration = 3s; + float elapsed_time = 0.0f; + std::set skips; + std::vector::const_iterator sample_iter; // An iterator to the current batch mode sample info object + std::vector sample_list; // The list of suitable samples to be run in conjunction with batch mode + std::vector tags; + bool wrap_to_start = false; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/benchmark_mode/benchmark_mode.cpp b/app/plugins/benchmark_mode/benchmark_mode.cpp index 95174ecb23..a4ab29b58a 100644 --- a/app/plugins/benchmark_mode/benchmark_mode.cpp +++ b/app/plugins/benchmark_mode/benchmark_mode.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -25,21 +26,26 @@ BenchmarkMode::BenchmarkMode() : BenchmarkModeTags("Benchmark Mode", "Log frame averages after running an app.", {vkb::Hook::OnUpdate, vkb::Hook::OnAppStart, vkb::Hook::OnAppClose}, - {&benchmark_flag}) + {}, + {{"benchmark", "Enable benchmark mode"}}) { } -bool BenchmarkMode::is_active(const vkb::CommandParser &parser) +bool BenchmarkMode::handle_option(std::deque &arguments) { - return parser.contains(&benchmark_flag); -} + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "benchmark") + { + // Whilst in benchmark mode fix the fps so that separate runs are consistently simulated + // This will effect the graph outputs of framerate + platform->force_simulation_fps(60.0f); + platform->force_render(true); -void BenchmarkMode::init(const vkb::CommandParser &parser) -{ - // Whilst in benchmark mode fix the fps so that separate runs are consistently simulated - // This will effect the graph outputs of framerate - platform->force_simulation_fps(60.0f); - platform->force_render(true); + arguments.pop_front(); + return true; + } + return false; } void BenchmarkMode::on_update(float delta_time) diff --git a/app/plugins/benchmark_mode/benchmark_mode.h b/app/plugins/benchmark_mode/benchmark_mode.h index d78a3cafc7..4e75d315d2 100644 --- a/app/plugins/benchmark_mode/benchmark_mode.h +++ b/app/plugins/benchmark_mode/benchmark_mode.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -27,11 +28,11 @@ using BenchmarkModeTags = vkb::PluginBase; /** * @brief Benchmark Mode - * + * * When enabled frame time statistics of a samples run will be printed to the console when an application closes. The simulation frame time (delta time) is also locked to 60FPS so that statistics can be compared more accurately across different devices. - * + * * Usage: vulkan_samples sample afbc --benchmark - * + * */ class BenchmarkMode : public BenchmarkModeTags { @@ -40,21 +41,14 @@ class BenchmarkMode : public BenchmarkModeTags virtual ~BenchmarkMode() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - virtual void on_update(float delta_time) override; - virtual void on_app_start(const std::string &app_info) override; - virtual void on_app_close(const std::string &app_info) override; - vkb::FlagCommand benchmark_flag = {vkb::FlagType::FlagOnly, "benchmark", "", "Enable benchmark mode"}; + bool handle_option(std::deque &arguments) override; private: - uint32_t total_frames{0}; - - float elapsed_time{0.0f}; + float elapsed_time = 0.0f; + uint32_t total_frames = 0; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/data_path/data_path.cpp b/app/plugins/data_path/data_path.cpp index 26a5e9f2a2..5a31caac96 100644 --- a/app/plugins/data_path/data_path.cpp +++ b/app/plugins/data_path/data_path.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2022-2024, Arm Limited and Contributors +/* Copyright (c) 2022-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,22 +25,32 @@ namespace plugins DataPath::DataPath() : DataPathTags("Data Path Override", "Specify the folder containing the sample data folders.", - {vkb::Hook::OnAppStart}, {&data_path_flag}) + {vkb::Hook::OnAppStart}, + {}, + {{"data-path", "Folder containing data files"}}) { } -bool DataPath::is_active(const vkb::CommandParser &parser) +bool DataPath::handle_option(std::deque &arguments) { - return parser.contains(&data_path_flag); -} - -void DataPath::init(const vkb::CommandParser &parser) -{ - if (parser.contains(&data_path_flag)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "data-path") { + if (arguments.size() < 2) + { + LOGE("Option \"data-path\" is missing the actual data path!"); + return false; + } + std::string data_path = arguments[1]; + auto fs = vkb::filesystem::get(); - fs->set_external_storage_directory(parser.as(&data_path_flag) + "/"); + fs->set_external_storage_directory(data_path + "/"); + + arguments.pop_front(); + arguments.pop_front(); + return true; } + return false; } - } // namespace plugins \ No newline at end of file diff --git a/app/plugins/data_path/data_path.h b/app/plugins/data_path/data_path.h index 46e6e20ee0..59846d5d7d 100644 --- a/app/plugins/data_path/data_path.h +++ b/app/plugins/data_path/data_path.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2022, Arm Limited and Contributors +/* Copyright (c) 2022-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +19,7 @@ #pragma once #include "platform/plugins/plugin_base.h" + namespace plugins { using DataPathTags = vkb::PluginBase; @@ -37,10 +39,6 @@ class DataPath : public DataPathTags virtual ~DataPath() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - - vkb::FlagCommand data_path_flag = {vkb::FlagType::OneValue, "data-path", "", "Folder containing data files"}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/file_logger/file_logger.cpp b/app/plugins/file_logger/file_logger.cpp index 46dd137a28..0e70d8d9dc 100644 --- a/app/plugins/file_logger/file_logger.cpp +++ b/app/plugins/file_logger/file_logger.cpp @@ -1,5 +1,6 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors - * Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2021-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -27,26 +28,29 @@ namespace plugins { FileLogger::FileLogger() : - FileLoggerTags("File Logger", - "Enable log output to a file.", - {}, {&log_file_flag}) + FileLoggerTags("File Logger", "Enable log output to a file.", {}, {}, {{"log-file", "Write log messages to the given file name"}}) { } -bool FileLogger::is_active(const vkb::CommandParser &parser) +bool FileLogger::handle_option(std::deque &arguments) { - return parser.contains(&log_file_flag); -} - -void FileLogger::init(const vkb::CommandParser &parser) -{ - if (parser.contains(&log_file_flag)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "log-file") { - if (spdlog::default_logger()) + if (arguments.size() < 2) { - std::string log_file_name = parser.as(&log_file_flag); - spdlog::default_logger()->sinks().push_back(std::make_shared(log_file_name, true)); + LOGE("Option \"log-file\" is missing the actual log file name!"); + return false; } + std::string log_file = arguments[1]; + + spdlog::default_logger()->sinks().push_back(std::make_shared(log_file, true)); + + arguments.pop_front(); + arguments.pop_front(); + return true; } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/file_logger/file_logger.h b/app/plugins/file_logger/file_logger.h index a9e336a70e..89bbdc9597 100644 --- a/app/plugins/file_logger/file_logger.h +++ b/app/plugins/file_logger/file_logger.h @@ -1,5 +1,6 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors - * Copyright (c) 2021, Sascha Willems +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2021-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -39,10 +40,6 @@ class FileLogger : public FileLoggerTags virtual ~FileLogger() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - - vkb::FlagCommand log_file_flag = {vkb::FlagType::OneValue, "log-file", "", "Write log messages to the given file name"}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins diff --git a/app/plugins/force_close/force_close.cpp b/app/plugins/force_close/force_close.cpp index 550e1b352a..c1cd37ca04 100644 --- a/app/plugins/force_close/force_close.cpp +++ b/app/plugins/force_close/force_close.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,16 +25,21 @@ namespace plugins ForceClose::ForceClose() : ForceCloseTags("Force Close", "Force the application to close if it has been halted before exiting", - {}, {&stop_cmd}) + {}, + {}, + {{"force-close", "Force the close of the application if halted before exiting"}}) { } -bool ForceClose::is_active(const vkb::CommandParser &parser) -{ - return parser.contains(&stop_cmd); -} - -void ForceClose::init(const vkb::CommandParser &parser) +bool ForceClose::handle_option(std::deque &arguments) { + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "force-close") + { + arguments.pop_front(); + return true; + } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/force_close/force_close.h b/app/plugins/force_close/force_close.h index 184f8a7cbd..bb113f0466 100644 --- a/app/plugins/force_close/force_close.h +++ b/app/plugins/force_close/force_close.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -28,13 +29,13 @@ using ForceCloseTags = vkb::PluginBase; /** * @brief Force Close - * + * * Force the close of the application if halted before exiting - * + * * The plugin is used as a boolean with platform->using_plugin(); - * + * * Usage: vulkan_sample sample afbc --force-close - * + * */ class ForceClose : public ForceCloseTags { @@ -43,10 +44,6 @@ class ForceClose : public ForceCloseTags virtual ~ForceClose() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - - vkb::FlagCommand stop_cmd = {vkb::FlagType::FlagOnly, "force-close", "", "Force the close of the application if halted before exiting"}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/fps_logger/fps_logger.cpp b/app/plugins/fps_logger/fps_logger.cpp index 02c04bc09c..a4a9ab3754 100644 --- a/app/plugins/fps_logger/fps_logger.cpp +++ b/app/plugins/fps_logger/fps_logger.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,19 +21,20 @@ namespace plugins { FpsLogger::FpsLogger() : - FpsLoggerTags("FPS Logger", - "Enable FPS logging.", - {vkb::Hook::OnUpdate, vkb::Hook::OnAppStart}, {&fps_flag}) + FpsLoggerTags("FPS Logger", "Enable FPS logging.", {vkb::Hook::OnUpdate, vkb::Hook::OnAppStart}, {}, {{"log-fps", "Log FPS"}}) { } -bool FpsLogger::is_active(const vkb::CommandParser &parser) -{ - return parser.contains(&fps_flag); -} - -void FpsLogger::init(const vkb::CommandParser &parser) +bool FpsLogger::handle_option(std::deque &arguments) { + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "log-fps") + { + arguments.pop_front(); + return true; + } + return false; } void FpsLogger::on_update(float delta_time) diff --git a/app/plugins/fps_logger/fps_logger.h b/app/plugins/fps_logger/fps_logger.h index d42973bbb0..07dd76de60 100644 --- a/app/plugins/fps_logger/fps_logger.h +++ b/app/plugins/fps_logger/fps_logger.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,17 +19,18 @@ #pragma once #include "platform/plugins/plugin_base.h" + namespace plugins { using FpsLoggerTags = vkb::PluginBase; /** * @brief FPS Logger - * + * * Control when FPS should be logged. Declutters the log output by removing FPS logs when not enabled - * + * * Usage: vulkan_sample sample afbc --log-fps - * + * */ class FpsLogger : public FpsLoggerTags { @@ -37,19 +39,13 @@ class FpsLogger : public FpsLoggerTags virtual ~FpsLogger() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - void on_update(float delta_time) override; - vkb::FlagCommand fps_flag = {vkb::FlagType::FlagOnly, "log-fps", "", "Log FPS"}; + bool handle_option(std::deque &arguments) override; private: + size_t frame_count = 0; + size_t last_frame_count = 0; vkb::Timer timer; - - size_t frame_count{0}; - - size_t last_frame_count{0}; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/gpu_selection/gpu_selection.cpp b/app/plugins/gpu_selection/gpu_selection.cpp index 47a782cab7..524869888b 100644 --- a/app/plugins/gpu_selection/gpu_selection.cpp +++ b/app/plugins/gpu_selection/gpu_selection.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2023, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,33 +17,41 @@ */ #include "gpu_selection.h" +#include "core/instance.h" #include -#include "core/hpp_instance.h" -#include "core/instance.h" - namespace plugins { GpuSelection::GpuSelection() : GpuSelectionTags("GPU selection", "A collection of flags to select the GPU to run the samples on", - {}, {&gpu_selection_options_group}) -{ -} - -bool GpuSelection::is_active(const vkb::CommandParser &parser) + {}, + {}, + {{"gpu", "Zero-based index of the GPU that the sample should use"}}) { - return true; } -void GpuSelection::init(const vkb::CommandParser &parser) +bool GpuSelection::handle_option(std::deque &arguments) { - // @todo: required? - if (parser.contains(&selected_gpu_index)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "gpu") { - vkb::Instance::selected_gpu_index = parser.as(&selected_gpu_index); - vkb::core::HPPInstance::selected_gpu_index = parser.as(&selected_gpu_index); + if (arguments.size() < 2) + { + LOGE("Option \"gpu\" is missing the actual gpu index!"); + return false; + } + uint32_t gpu_index = static_cast(std::stoul(arguments[1])); + + vkb::core::InstanceC::selected_gpu_index = gpu_index; + vkb::core::InstanceCpp::selected_gpu_index = gpu_index; + + arguments.pop_front(); + arguments.pop_front(); + return true; } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/gpu_selection/gpu_selection.h b/app/plugins/gpu_selection/gpu_selection.h index 0eb850daf9..9586284d22 100644 --- a/app/plugins/gpu_selection/gpu_selection.h +++ b/app/plugins/gpu_selection/gpu_selection.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2023, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -38,12 +39,6 @@ class GpuSelection : public GpuSelectionTags virtual ~GpuSelection() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &options) override; - - vkb::FlagCommand selected_gpu_index = {vkb::FlagType::OneValue, "gpu", "", "Zero-based index of the GPU that the sample should use"}; - - vkb::CommandGroup gpu_selection_options_group = {"GPU selection Options", {&selected_gpu_index}}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/real_time_shader_selection/real_time_shader_selection.cpp b/app/plugins/real_time_shader_selection/real_time_shader_selection.cpp deleted file mode 100644 index 58483fefd8..0000000000 --- a/app/plugins/real_time_shader_selection/real_time_shader_selection.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2024, Mobica Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "real_time_shader_selection.h" - -#include "platform/platform.h" - -namespace plugins -{ -RealTimeShaderSelection::RealTimeShaderSelection() : - RealTimeShaderSelectionTags("Real Time Shader Selection", - "Enable dynamic shader selection for samples.", - {vkb::Hook::OnAppStart, vkb::Hook::OnUpdateUi}, - {&realtimeshaderselection_flag}), - active_shader(0), - min_size_for_shaders(2) -{ -} - -bool RealTimeShaderSelection::is_active(const vkb::CommandParser &parser) -{ - return parser.contains(&realtimeshaderselection_flag); -} - -void RealTimeShaderSelection::init(const vkb::CommandParser &parser) -{ -} - -void RealTimeShaderSelection::on_app_start(const std::string &app_info) -{ - if (platform->get_app().get_available_shaders().size() < min_size_for_shaders) - { - LOGE("Sample doesn't support RealTimeShaderSelection plugin, sample should add available shaders please see Application::store_shaders."); - LOGE("Sample, defined {} shaders, minimum number of defined shaders is {}", platform->get_app().get_available_shaders().size(), min_size_for_shaders); - return; - } - - for (auto const &shader : platform->get_app().get_available_shaders()) - { - switch (shader.first) - { - case vkb::ShaderSourceLanguage::GLSL: - language_names.emplace_back("GLSL"); - break; - case vkb::ShaderSourceLanguage::HLSL: - language_names.emplace_back("HLSL"); - break; - case vkb::ShaderSourceLanguage::SPV: - language_names.emplace_back("SPV"); - break; - default: - LOGE("Not supported shader language"); - assert(false); - } - } -} - -void RealTimeShaderSelection::on_update_ui_overlay(vkb::Drawer &drawer) -{ - if (platform->get_app().get_available_shaders().size() >= min_size_for_shaders) - { - if (drawer.header("Real Time Shader Selection")) - { - if (drawer.combo_box("Shader language", &active_shader, language_names)) - { - std::string selectedShader = language_names[active_shader]; - vkb::ShaderSourceLanguage shaderType = vkb::ShaderSourceLanguage::GLSL; - if (selectedShader == "GLSL") - { - shaderType = vkb::ShaderSourceLanguage::GLSL; - } - else if (selectedShader == "HLSL") - { - shaderType = vkb::ShaderSourceLanguage::HLSL; - } - else if (selectedShader == "SPV") - { - shaderType = vkb::ShaderSourceLanguage::SPV; - } - else - { - LOGE("Not supported shader language"); - assert(false); - } - auto it = platform->get_app().get_available_shaders().find(shaderType); - platform->get_app().change_shader(it->first); - } - } - } -} - -} // namespace plugins \ No newline at end of file diff --git a/app/plugins/real_time_shader_selection/real_time_shader_selection.h b/app/plugins/real_time_shader_selection/real_time_shader_selection.h deleted file mode 100644 index 624fb8729d..0000000000 --- a/app/plugins/real_time_shader_selection/real_time_shader_selection.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2024, Mobica Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "common/vk_common.h" -#include "platform/plugins/plugin_base.h" -#include -#include - -namespace plugins -{ -class RealTimeShaderSelection; - -// Passive behaviour -using RealTimeShaderSelectionTags = vkb::PluginBase; - -/** - * @brief Real Time Shader Selection - * - * When this option is enabled, the samples get the ability to dynamically choose which shaders are available for a given sample. - * - * Usage: vulkan_samples sample afbc --realtimeshaderselection - * - */ -class RealTimeShaderSelection : public RealTimeShaderSelectionTags -{ - public: - RealTimeShaderSelection(); - - virtual ~RealTimeShaderSelection() = default; - - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - - virtual void on_app_start(const std::string &app_info) override; - - virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; - - vkb::FlagCommand realtimeshaderselection_flag = {vkb::FlagType::FlagOnly, "realtimeshaderselection", "", "Enable dynamic shader selection"}; - - private: - std::vector language_names; - int active_shader; - const int min_size_for_shaders; -}; -} // namespace plugins \ No newline at end of file diff --git a/app/plugins/screenshot/screenshot.cpp b/app/plugins/screenshot/screenshot.cpp index 897716b8d3..0c677d2b8b 100644 --- a/app/plugins/screenshot/screenshot.cpp +++ b/app/plugins/screenshot/screenshot.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,6 +21,7 @@ #include #include +#include "common/utils.h" #include "rendering/render_context.h" namespace plugins @@ -28,27 +30,43 @@ Screenshot::Screenshot() : ScreenshotTags("Screenshot", "Save a screenshot of a specific frame", {vkb::Hook::OnUpdate, vkb::Hook::OnAppStart, vkb::Hook::PostDraw}, - {&screenshot_flag, &screenshot_output_flag}) + {}, + {{"screenshot", "Take a screenshot at a given frame"}, {"screenshot-output", "Declare an output name for the image"}}) { } -bool Screenshot::is_active(const vkb::CommandParser &parser) +bool Screenshot::handle_option(std::deque &arguments) { - return parser.contains(&screenshot_flag); -} - -void Screenshot::init(const vkb::CommandParser &parser) -{ - if (parser.contains(&screenshot_flag)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "screenshot") { - frame_number = parser.as(&screenshot_flag); + if (arguments.size() < 2) + { + LOGE("Option \"screenshot\" is missing the frame index to take a screenshot!"); + return false; + } + frame_number = static_cast(std::stoul(arguments[1])); - if (parser.contains(&screenshot_output_flag)) + arguments.pop_front(); + arguments.pop_front(); + return true; + } + else if (option == "screenshot-output") + { + if (arguments.size() < 2) { - output_path = parser.as(&screenshot_output_flag); - output_path_set = true; + LOGE("Option \"screenshot-output\" is missing the filename to store the screenshot!"); + return false; } + output_path = arguments[1]; + output_path_set = true; + + arguments.pop_front(); + arguments.pop_front(); + return true; } + return false; } void Screenshot::on_update(float delta_time) @@ -62,7 +80,7 @@ void Screenshot::on_app_start(const std::string &name) current_frame = 0; } -void Screenshot::on_post_draw(vkb::RenderContext &context) +void Screenshot::on_post_draw(vkb::rendering::RenderContextC &context) { if (current_frame == frame_number) { @@ -82,7 +100,7 @@ void Screenshot::on_post_draw(vkb::RenderContext &context) output_path = stream.str(); } - screenshot(context, output_path); + vkb::screenshot(context, output_path); } } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/screenshot/screenshot.h b/app/plugins/screenshot/screenshot.h index 3a11f83194..6b42d89658 100644 --- a/app/plugins/screenshot/screenshot.h +++ b/app/plugins/screenshot/screenshot.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -41,18 +42,11 @@ class Screenshot : public ScreenshotTags virtual ~Screenshot() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; + void on_update(float delta_time) override; + void on_app_start(const std::string &app_info) override; + void on_post_draw(vkb::rendering::RenderContextC &context) override; - virtual void init(const vkb::CommandParser &parser) override; - - virtual void on_update(float delta_time) override; - - virtual void on_app_start(const std::string &app_info) override; - - virtual void on_post_draw(vkb::RenderContext &context) override; - - vkb::FlagCommand screenshot_flag = {vkb::FlagType::OneValue, "screenshot", "", "Take a screenshot at a given frame"}; - vkb::FlagCommand screenshot_output_flag = {vkb::FlagType::OneValue, "screenshot-output", "", "Declare an output name for the image"}; + bool handle_option(std::deque &arguments) override; private: uint32_t current_frame = 0; diff --git a/app/plugins/shading_language_selection/shading_language_selection.cpp b/app/plugins/shading_language_selection/shading_language_selection.cpp index a3096cdc7a..d7b63fa9b9 100644 --- a/app/plugins/shading_language_selection/shading_language_selection.cpp +++ b/app/plugins/shading_language_selection/shading_language_selection.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -25,22 +26,27 @@ namespace plugins { ShadingLanguageSelection::ShadingLanguageSelection() : ShadingLanguageSelectionTags("Shading language selection", - "A collection of flags to select shader from different shading languages (glsl, hlsl)", - {}, {&shading_language_selection_options_group}) + "A collection of flags to select shader from different shading languages (glsl, hlsl or slang)", + {}, + {}, + {{"shading-language", "Shading language to use (glsl, hlsl or slang)"}}) { } -bool ShadingLanguageSelection::is_active(const vkb::CommandParser &parser) +bool ShadingLanguageSelection::handle_option(std::deque &arguments) { - return true; -} - -void ShadingLanguageSelection::init(const vkb::CommandParser &parser) -{ - if (parser.contains(&selected_shading_language)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "shading-language") { + if (arguments.size() < 2) + { + LOGE("Option \"shading-language\" is missing the actual shading language to use!"); + return false; + } + // Make sure it's one of the supported shading languages - std::string shading_language = parser.as(&selected_shading_language); + std::string shading_language = arguments[1]; std::transform(shading_language.begin(), shading_language.end(), shading_language.begin(), ::tolower); if (shading_language == "glsl") { @@ -49,13 +55,23 @@ void ShadingLanguageSelection::init(const vkb::CommandParser &parser) } else if (shading_language == "hlsl") { - LOGI("Shading langauge selection: HLSL") + LOGI("Shading language selection: HLSL") vkb::Application::set_shading_language(vkb::ShadingLanguage::HLSL); } + else if (shading_language == "slang") + { + LOGI("Shading language selection: slang") + vkb::Application::set_shading_language(vkb::ShadingLanguage::SLANG); + } else { LOGE("Invalid shading language selection, defaulting to glsl"); } + + arguments.pop_front(); + arguments.pop_front(); + return true; } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/shading_language_selection/shading_language_selection.h b/app/plugins/shading_language_selection/shading_language_selection.h index d346e71c20..6349d331d9 100644 --- a/app/plugins/shading_language_selection/shading_language_selection.h +++ b/app/plugins/shading_language_selection/shading_language_selection.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -38,12 +39,6 @@ class ShadingLanguageSelection : public ShadingLanguageSelectionTags virtual ~ShadingLanguageSelection() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &options) override; - - vkb::FlagCommand selected_shading_language = {vkb::FlagType::OneValue, "shading-language", "", "Shading language to use (glsl or hlsl)"}; - - vkb::CommandGroup shading_language_selection_options_group = {"Shading langauge selection Options", {&selected_shading_language}}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/start_sample/start_sample.cpp b/app/plugins/start_sample/start_sample.cpp index a4ef97effb..1d1d3cf7ef 100644 --- a/app/plugins/start_sample/start_sample.cpp +++ b/app/plugins/start_sample/start_sample.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2023, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -22,61 +23,77 @@ namespace plugins { StartSample::StartSample() : - StartSampleTags("Apps", + StartSampleTags("StartSample", "A collection of flags to samples and apps.", - {}, {&sample_subcmd, &samples_subcmd, &samples_oneline_subcmd}) + {}, + {{"sample", "Run a specific sample"}, + {"samples", "List available samples with descriptions"}, + {"samples-oneline", "List available samples, one per line"}}) { } -bool StartSample::is_active(const vkb::CommandParser &parser) +void StartSample::launch_sample(apps::SampleInfo const *sample) const { - return parser.contains(&sample_cmd) || - parser.contains(&samples_subcmd) || - parser.contains(&samples_oneline_subcmd); + vkb::Window::OptionalProperties properties; + properties.title = "Vulkan Samples: " + sample->name; + platform->set_window_properties(properties); + platform->request_application(sample); } -void StartSample::init(const vkb::CommandParser &parser) +void StartSample::list_samples(bool one_per_line) const { - if (parser.contains(&sample_cmd)) + auto samples = apps::get_samples(); + + LOGI(""); + LOGI("Available Samples"); + LOGI(""); + + for (auto *app : samples) { - // Launch Sample - auto *sample = apps::get_sample(parser.as(&sample_cmd)); - if (sample != nullptr) + auto sample = reinterpret_cast(app); + if (one_per_line) + { + LOGI("{}", sample->id.c_str()); + } + else { - vkb::Window::OptionalProperties properties; - std::string title = "Vulkan Samples: " + sample->name; - properties.title = title; - platform->set_window_properties(properties); - platform->request_application(sample); + LOGI("{}", sample->name.c_str()); + LOGI("\tid: {}", sample->id.c_str()); + LOGI("\tdescription: {}", sample->description.c_str()); + LOGI(""); } } - else if (parser.contains(&samples_subcmd) || parser.contains(&samples_oneline_subcmd)) - { - // List samples - - auto samples = apps::get_samples(); - LOGI(""); - LOGI("Available Samples"); - LOGI(""); + platform->close(); +} - for (auto *app : samples) +bool StartSample::handle_command(std::deque &arguments) const +{ + assert(!arguments.empty()); + if (arguments[0] == "sample") + { + if (arguments.size() < 2) { - auto sample = reinterpret_cast(app); - if (parser.contains(&samples_subcmd)) - { - LOGI("{}", sample->name.c_str()); - LOGI("\tid: {}", sample->id.c_str()); - LOGI("\tdescription: {}", sample->description.c_str()); - LOGI(""); - } - else - { - LOGI("{}", sample->id.c_str()); - } + LOGE("Command \"sample\" is missing the actual sample_id to launch!"); + return false; } - - platform->close(); + auto *sample = apps::get_sample(arguments[1]); + if (!sample) + { + LOGE("Command \"sample\" is called with an unknown sample_id \"{}\"!", arguments[1]); + return false; + } + launch_sample(sample); + arguments.pop_front(); + arguments.pop_front(); + return true; + } + if ((arguments[0] == "samples") || (arguments[0] == "samples-oneline")) + { + list_samples(arguments[0] == "samples-oneline"); + arguments.pop_front(); + return true; } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/start_sample/start_sample.h b/app/plugins/start_sample/start_sample.h index 6dbb5a5640..6055362a1c 100644 --- a/app/plugins/start_sample/start_sample.h +++ b/app/plugins/start_sample/start_sample.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2023, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,6 +18,7 @@ #pragma once +#include "platform/platform.h" #include "platform/plugins/plugin_base.h" namespace plugins @@ -25,11 +27,11 @@ using StartSampleTags = vkb::PluginBase; /** * @brief Start App - * + * * Loads a given sample - * + * * Usage: vulkan_sample sample afbc - * + * * TODO: Could this be extended to allow configuring a sample from the command line? Currently options are set explicitly by the UI */ class StartSample : public StartSampleTags @@ -39,13 +41,10 @@ class StartSample : public StartSampleTags virtual ~StartSample() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; + bool handle_command(std::deque &arguments) const override; - vkb::PositionalCommand sample_cmd = {"sample_id", "ID of the sample to run"}; - vkb::SubCommand sample_subcmd = {"sample", "Run a specific sample", {&sample_cmd}}; - vkb::SubCommand samples_subcmd = {"samples", "List available samples with descriptions", {}}; - vkb::SubCommand samples_oneline_subcmd = {"samples-oneline", "List available samples, one per line", {}}; + private: + void launch_sample(apps::SampleInfo const *sample) const; + void list_samples(bool one_per_line) const; }; } // namespace plugins diff --git a/app/plugins/start_test/start_test.cpp b/app/plugins/start_test/start_test.cpp index 9889399083..ce46568d0e 100644 --- a/app/plugins/start_test/start_test.cpp +++ b/app/plugins/start_test/start_test.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -22,26 +23,32 @@ namespace plugins { StartTest::StartTest() : - StartTestTags("Tests", - "A collection of flags to run tests.", - {}, {&test_subcmd}) + StartTestTags("Tests", "A collection of flags to run tests.", {}, {{"test", "Run a specific test"}}) { } -bool StartTest::is_active(const vkb::CommandParser &parser) +bool StartTest::handle_command(std::deque &arguments) const { - return parser.contains(&test_cmd); -} - -void StartTest::init(const vkb::CommandParser &parser) -{ - if (parser.contains(&test_cmd)) + assert(!arguments.empty()); + if (arguments[0] == "test") { - auto test = apps::get_app(parser.as(&test_cmd)); - if (test != nullptr) + if (arguments.size() < 2) { - platform->request_application(test); + LOGE("Command \"test\" is missing the actual test_id to launch!"); + return false; } + auto *test = apps::get_app(arguments[1]); + if (!test) + { + LOGE("Command \"test\" is called with an unknown test_id \"{}\"!", arguments[1]); + return false; + } + platform->request_application(test); + + arguments.pop_front(); + arguments.pop_front(); + return true; } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/start_test/start_test.h b/app/plugins/start_test/start_test.h index 9c3053c29b..353e6bdb10 100644 --- a/app/plugins/start_test/start_test.h +++ b/app/plugins/start_test/start_test.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -25,11 +26,11 @@ using StartTestTags = vkb::PluginBase; /** * @brief Start Test - * + * * Start a given test. Used by system_test.py - * + * * Usage: vulkan_sample test bonza - * + * */ class StartTest : public StartTestTags { @@ -38,11 +39,6 @@ class StartTest : public StartTestTags virtual ~StartTest() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - - vkb::PositionalCommand test_cmd = {"test_id", "An ID of the test to run"}; - vkb::SubCommand test_subcmd = {"test", "Run a specific test", {&test_cmd}}; + bool handle_command(std::deque &arguments) const override; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/stop_after/stop_after.cpp b/app/plugins/stop_after/stop_after.cpp index 96cd3ba680..3a17e0ddf9 100644 --- a/app/plugins/stop_after/stop_after.cpp +++ b/app/plugins/stop_after/stop_after.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -22,18 +23,30 @@ namespace plugins StopAfter::StopAfter() : StopAfterTags("Stop After X", "A collection of flags to stop the running application after a set period.", - {vkb::Hook::OnUpdate}, {&stop_after_frame_flag}) + {vkb::Hook::OnUpdate}, + {}, + {{"stop-after-frame", "Stop the application after a certain number of frames"}}) { } -bool StopAfter::is_active(const vkb::CommandParser &parser) +bool StopAfter::handle_option(std::deque &arguments) { - return parser.contains(&stop_after_frame_flag); -} + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "stop-after-frame") + { + if (arguments.size() < 2) + { + LOGE("Option \"stop-after-frame\" is missing the actual frame index to stop after!"); + return false; + } + remaining_frames = static_cast(std::stoul(arguments[1])); -void StopAfter::init(const vkb::CommandParser &parser) -{ - remaining_frames = parser.as(&stop_after_frame_flag); + arguments.pop_front(); + arguments.pop_front(); + return true; + } + return false; } void StopAfter::on_update(float delta_time) diff --git a/app/plugins/stop_after/stop_after.h b/app/plugins/stop_after/stop_after.h index 6ecc17e088..cc1005537a 100644 --- a/app/plugins/stop_after/stop_after.h +++ b/app/plugins/stop_after/stop_after.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -25,13 +26,13 @@ using StopAfterTags = vkb::PluginBase; /** * @brief Stop After - * + * * Stop the execution of the app after a specific frame. - * + * * Usage: vulkan_sample sample afbc --stop-after-frame 100 - * + * * TODO: Add stop after duration - * + * */ class StopAfter : public StopAfterTags { @@ -40,13 +41,9 @@ class StopAfter : public StopAfterTags virtual ~StopAfter() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &parser) override; - - virtual void on_update(float delta_time) override; + void on_update(float delta_time) override; - vkb::FlagCommand stop_after_frame_flag = {vkb::FlagType::OneValue, "stop-after-frame", "", "Stop the application after a certain number of frames"}; + bool handle_option(std::deque &arguments) override; private: uint32_t remaining_frames{0}; diff --git a/app/plugins/user_interface_options/user_interface_options.cpp b/app/plugins/user_interface_options/user_interface_options.cpp index 799cb7432a..b450f13f94 100644 --- a/app/plugins/user_interface_options/user_interface_options.cpp +++ b/app/plugins/user_interface_options/user_interface_options.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2023, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,28 +21,30 @@ #include #include "gui.h" -#include "hpp_gui.h" namespace plugins { UserInterfaceOptions::UserInterfaceOptions() : UserInterfaceOptionsTags("User interface options", "A collection of flags to configure the user interface", - {}, {&user_interface_options_group}) + {}, + {}, + {{"hideui", "If flag is set, hides the user interface at startup"}}) { } -bool UserInterfaceOptions::is_active(const vkb::CommandParser &parser) +bool UserInterfaceOptions::handle_option(std::deque &arguments) { - return true; -} - -void UserInterfaceOptions::init(const vkb::CommandParser &parser) -{ - if (parser.contains(&hide_ui_flag)) + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); + if (option == "hideui") { - vkb::Gui::visible = false; - vkb::HPPGui::visible = false; + vkb::GuiC::visible = false; + vkb::GuiCpp::visible = false; + + arguments.pop_front(); + return true; } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/user_interface_options/user_interface_options.h b/app/plugins/user_interface_options/user_interface_options.h index 0cc3e8c611..c958a95840 100644 --- a/app/plugins/user_interface_options/user_interface_options.h +++ b/app/plugins/user_interface_options/user_interface_options.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2023, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -38,12 +39,6 @@ class UserInterfaceOptions : public UserInterfaceOptionsTags virtual ~UserInterfaceOptions() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &options) override; - - vkb::FlagCommand hide_ui_flag = {vkb::FlagType::FlagOnly, "hideui", "", "If flag is set, hides the user interface at startup"}; - - vkb::CommandGroup user_interface_options_group = {"User interface Options", {&hide_ui_flag}}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins \ No newline at end of file diff --git a/app/plugins/window_options/window_options.cpp b/app/plugins/window_options/window_options.cpp index 868b34ca00..75158aa263 100644 --- a/app/plugins/window_options/window_options.cpp +++ b/app/plugins/window_options/window_options.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2022, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -27,61 +28,84 @@ namespace plugins WindowOptions::WindowOptions() : WindowOptionsTags("Window Options", "A collection of flags to configure window used when running the application. Implementation may differ between platforms", - {}, {&window_options_group}) + {}, + {}, + {{"borderless", "Run in borderless mode"}, + {"fullscreen", "Run in fullscreen mode"}, + {"headless-surface", "Run in headless surface mode. A Surface and swap-chain is still created using VK_EXT_headless_surface."}, + {"height", "Initial window height"}, + {"stretch", "Stretch window to fullscreen (direct-to-display only)"}, + {"vsync", "Force vsync {ON | OFF}. If not set samples decide how vsync is set"}, + {"width", "Initial window width"}}) { } -bool WindowOptions::is_active(const vkb::CommandParser &parser) +bool WindowOptions::handle_option(std::deque &arguments) { - return true; -} + assert(!arguments.empty() && (arguments[0].substr(0, 2) == "--")); + std::string option = arguments[0].substr(2); -void WindowOptions::init(const vkb::CommandParser &parser) -{ vkb::Window::OptionalProperties properties; + if (option == "borderless") + { + properties.mode = vkb::Window::Mode::FullscreenBorderless; + platform->set_window_properties(properties); - if (parser.contains(&width_flag)) + arguments.pop_front(); + return true; + } + else if (option == "fullscreen") { - auto width = parser.as(&width_flag); - if (width < platform->MIN_WINDOW_WIDTH) - { - LOGD("[Window Options] {} is smaller than the minimum width {}, resorting to minimum width", width, platform->MIN_WINDOW_WIDTH); - width = platform->MIN_WINDOW_WIDTH; - } - properties.extent.width = width; + properties.mode = vkb::Window::Mode::Fullscreen; + platform->set_window_properties(properties); + + arguments.pop_front(); + return true; } + else if (option == "headless-surface") + { + properties.mode = vkb::Window::Mode::Headless; + platform->set_window_properties(properties); - if (parser.contains(&height_flag)) + arguments.pop_front(); + return true; + } + else if (option == "height") { - auto height = parser.as(&height_flag); + if (arguments.size() < 2) + { + LOGE("Option \"height\" is missing the actual height!"); + return false; + } + uint32_t height = static_cast(std::stoul(arguments[1])); if (height < platform->MIN_WINDOW_HEIGHT) { LOGD("[Window Options] {} is smaller than the minimum height {}, resorting to minimum height", height, platform->MIN_WINDOW_HEIGHT); height = platform->MIN_WINDOW_HEIGHT; } properties.extent.height = height; - } + platform->set_window_properties(properties); - if (parser.contains(&headless_flag)) - { - properties.mode = vkb::Window::Mode::Headless; + arguments.pop_front(); + arguments.pop_front(); + return true; } - else if (parser.contains(&fullscreen_flag)) - { - properties.mode = vkb::Window::Mode::Fullscreen; - } - else if (parser.contains(&borderless_flag)) - { - properties.mode = vkb::Window::Mode::FullscreenBorderless; - } - else if (parser.contains(&stretch_flag)) + else if (option == "stretch") { properties.mode = vkb::Window::Mode::FullscreenStretch; - } + platform->set_window_properties(properties); - if (parser.contains(&vsync_flag)) + arguments.pop_front(); + return true; + } + else if (option == "vsync") { - std::string value = parser.as(&vsync_flag); + if (arguments.size() < 2) + { + LOGE("Option \"vsync\" is missing the actual setting!"); + return false; + } + std::string value = arguments[1]; std::transform(value.begin(), value.end(), value.begin(), ::tolower); if (value == "on") { @@ -91,8 +115,32 @@ void WindowOptions::init(const vkb::CommandParser &parser) { properties.vsync = vkb::Window::Vsync::OFF; } + platform->set_window_properties(properties); + + arguments.pop_front(); + arguments.pop_front(); + return true; } + else if (option == "width") + { + if (arguments.size() < 2) + { + LOGE("Option \"width\" is missing the actual width!"); + return false; + } + uint32_t width = static_cast(std::stoul(arguments[1])); + if (width < platform->MIN_WINDOW_WIDTH) + { + LOGD("[Window Options] {} is smaller than the minimum width {}, resorting to minimum width", width, platform->MIN_WINDOW_WIDTH); + width = platform->MIN_WINDOW_WIDTH; + } + properties.extent.width = width; + platform->set_window_properties(properties); - platform->set_window_properties(properties); + arguments.pop_front(); + arguments.pop_front(); + return true; + } + return false; } } // namespace plugins \ No newline at end of file diff --git a/app/plugins/window_options/window_options.h b/app/plugins/window_options/window_options.h index 574f26e545..9c6b49d780 100644 --- a/app/plugins/window_options/window_options.h +++ b/app/plugins/window_options/window_options.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -27,11 +28,11 @@ using WindowOptionsTags = vkb::PluginBase; /** * @brief Window Options - * + * * Configure the window used when running Vulkan Samples. - * + * * Usage: vulkan_samples sample instancing --width 500 --height 500 --vsync OFF - * + * */ class WindowOptions : public WindowOptionsTags { @@ -40,18 +41,6 @@ class WindowOptions : public WindowOptionsTags virtual ~WindowOptions() = default; - virtual bool is_active(const vkb::CommandParser &parser) override; - - virtual void init(const vkb::CommandParser &options) override; - - vkb::FlagCommand width_flag = {vkb::FlagType::OneValue, "width", "", "Initial window width"}; - vkb::FlagCommand height_flag = {vkb::FlagType::OneValue, "height", "", "Initial window height"}; - vkb::FlagCommand fullscreen_flag = {vkb::FlagType::FlagOnly, "fullscreen", "", "Run in fullscreen mode"}; - vkb::FlagCommand headless_flag = {vkb::FlagType::FlagOnly, "headless_surface", "", "Run in headless surface mode. A Surface and swap-chain is still created using VK_EXT_headless_surface."}; - vkb::FlagCommand borderless_flag = {vkb::FlagType::FlagOnly, "borderless", "", "Run in borderless mode"}; - vkb::FlagCommand stretch_flag = {vkb::FlagType::FlagOnly, "stretch", "", "Stretch window to fullscreen (direct-to-display only)"}; - vkb::FlagCommand vsync_flag = {vkb::FlagType::OneValue, "vsync", "", "Force vsync {ON | OFF}. If not set samples decide how vsync is set"}; - - vkb::CommandGroup window_options_group = {"Window Options", {&width_flag, &height_flag, &vsync_flag, &fullscreen_flag, &borderless_flag, &stretch_flag, &headless_flag}}; + bool handle_option(std::deque &arguments) override; }; } // namespace plugins \ No newline at end of file diff --git a/bldsys/cmake/android_sync_folder.cmake b/bldsys/cmake/android_sync_folder.cmake index a0d8ada505..2936148044 100644 --- a/bldsys/cmake/android_sync_folder.cmake +++ b/bldsys/cmake/android_sync_folder.cmake @@ -1,5 +1,5 @@ #[[ - Copyright (c) 2019-2023, Arm Limited and Contributors + Copyright (c) 2019-2024, Arm Limited and Contributors SPDX-License-Identifier: Apache-2.0 diff --git a/bldsys/cmake/component_helper.cmake b/bldsys/cmake/component_helper.cmake index c7d0b96b55..80c5885ba2 100644 --- a/bldsys/cmake/component_helper.cmake +++ b/bldsys/cmake/component_helper.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Thomas Atkinson +# Copyright (c) 2023-2025, Thomas Atkinson # # SPDX-License-Identifier: Apache-2.0 # @@ -30,7 +30,7 @@ function(vkb__register_component) cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(TARGET_NAME STREQUAL "") - message(FATAL_ERROR "NAME must be defined in vkb__register_tests") + message(FATAL_ERROR "NAME must be defined in vkb__register_comoponents") endif() set(TARGET "vkb__${TARGET_NAME}") @@ -81,83 +81,3 @@ function(vkb__register_component) add_dependencies(vkb__components ${TARGET}) endfunction() - -# Enable testing within the components -macro(vkb__enable_testing) - if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING) OR VKB_BUILD_TESTS) - include(CTest) - enable_testing() - endif() -endmacro() - -# Bucket target for all tests -add_custom_target(vkb__tests) -set_target_properties(vkb__tests PROPERTIES FOLDER "CMake/CustomTargets") - -# Register a new test -# Adds the test to the vkb__tests target -# Uses Catch2 by default. If NO_CATCH2 is set, then the test must provide its own main function -function(vkb__register_tests) - set(options NO_CATCH2) - set(oneValueArgs COMPONENT NAME) - set(multiValueArgs SRC HEADERS LINK_LIBS INCLUDE_DIRS) - - if(NOT((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING) OR VKB_BUILD_TESTS)) - return() # testing not enabled - endif() - - cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if(TARGET_NAME STREQUAL "") - message(FATAL_ERROR "NAME must be defined in vkb__register_tests") - endif() - - if(NOT TARGET_SRC) - message(FATAL_ERROR "One or more source files must be added to vkb__register_tests") - endif() - - set(TARGET_FOLDER "components") - set(TARGET_NAME "test__${TARGET_NAME}") - - message(STATUS "TEST: ${TARGET_NAME}") - - if(TARGET_NO_CATCH2 AND WIN32) - add_executable(${TARGET_NAME} WIN32 ${TARGET_SRC}) - else() - add_executable(${TARGET_NAME} ${TARGET_SRC}) - endif() - - if(NOT NO_CATCH2) - target_link_libraries(${TARGET_NAME} PUBLIC Catch2::Catch2WithMain) - endif() - - target_compile_definitions(${TARGET_NAME} PUBLIC VKB_BUILD_TESTS) - - set_property(TARGET ${TARGET_NAME} PROPERTY FOLDER ${TARGET_FOLDER}) - - set_target_properties(${TARGET_NAME} - PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests/${CMAKE_BUILD_TYPE}" - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests/${CMAKE_BUILD_TYPE}" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests/${CMAKE_BUILD_TYPE}" - ) - - if(TARGET_LINK_LIBS) - target_link_libraries(${TARGET_NAME} PUBLIC ${TARGET_LINK_LIBS}) - endif() - - if(${VKB_WARNINGS_AS_ERRORS}) - message(STATUS "Warnings as Errors Enabled") - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - target_compile_options(${TARGET_NAME} PRIVATE -Werror) - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - target_compile_options(${TARGET_NAME} PRIVATE /W3 /WX) - endif() - endif() - - add_test(NAME ${TARGET_NAME} - COMMAND ${TARGET_NAME} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) - - add_dependencies(vkb__tests ${TARGET_NAME}) -endfunction() \ No newline at end of file diff --git a/bldsys/cmake/global_options.cmake b/bldsys/cmake/global_options.cmake index 96c7addbfb..5fecb25154 100644 --- a/bldsys/cmake/global_options.cmake +++ b/bldsys/cmake/global_options.cmake @@ -1,5 +1,5 @@ #[[ - Copyright (c) 2019-2024, Arm Limited and Contributors + Copyright (c) 2019-2025, Arm Limited and Contributors SPDX-License-Identifier: Apache-2.0 @@ -36,8 +36,8 @@ if(APPLE) set(VKB_ENABLE_PORTABILITY ON CACHE BOOL "Enable portability enumeration and subset features in the framework. This is required to be set when running on Apple platforms." FORCE) find_package(Vulkan QUIET OPTIONAL_COMPONENTS MoltenVK) - if(USE_MoltenVK OR (IOS AND (NOT Vulkan_MoltenVK_FOUND OR (${CMAKE_OSX_SYSROOT} STREQUAL "iphonesimulator" AND ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")))) - # if using MoltenVK, or MoltenVK for iOS was not found, or using iOS Simulator on x86_64, look for MoltenVK in the Vulkan SDK and MoltenVK project locations + if(USE_MoltenVK OR (IOS AND (NOT Vulkan_MoltenVK_FOUND OR ${CMAKE_OSX_SYSROOT} STREQUAL "iphonesimulator"))) + # if using MoltenVK, or MoltenVK for iOS was not found, or using iOS Simulator, look for MoltenVK in the Vulkan SDK and MoltenVK project locations if(NOT Vulkan_MoltenVK_LIBRARY) # since both are available in the Vulkan SDK and MoltenVK github project, make sure we look for MoltenVK framework on iOS and dylib on macOS set(_saved_cmake_find_framework ${CMAKE_FIND_FRAMEWORK}) @@ -117,18 +117,17 @@ set(VKB_WSI_SELECTION "XCB" CACHE STRING "Select WSI target (XCB, XLIB, WAYLAND, set(VKB_CLANG_TIDY OFF CACHE STRING "Use CMake Clang Tidy integration") set(VKB_CLANG_TIDY_EXTRAS "-header-filter=framework,samples,app;-checks=-*,google-*,-google-runtime-references;--fix;--fix-errors" CACHE STRING "Clang Tidy Parameters") set(VKB_PROFILING OFF CACHE BOOL "Enable Tracy profiling") +set(VKB_SKIP_SLANG_SHADER_COMPILATION OFF CACHE BOOL "Skips compilation for Slang shader") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin/${CMAKE_BUILD_TYPE}/${TARGET_ARCH}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib/${CMAKE_BUILD_TYPE}/${TARGET_ARCH}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "lib/${CMAKE_BUILD_TYPE}/${TARGET_ARCH}") -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) -string(LENGTH "${CMAKE_SOURCE_DIR}/" ROOT_PATH_SIZE) -add_definitions(-DROOT_PATH_SIZE=${ROOT_PATH_SIZE}) - set(CMAKE_C_FLAGS_DEBUG "-DDEBUG=0 ${CMAKE_C_FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG=0 ${CMAKE_CXX_FLAGS_DEBUG}") diff --git a/bldsys/cmake/sample_helper.cmake b/bldsys/cmake/sample_helper.cmake index 2bd36e6d87..1d07985691 100644 --- a/bldsys/cmake/sample_helper.cmake +++ b/bldsys/cmake/sample_helper.cmake @@ -1,7 +1,7 @@ #[[ - Copyright (c) 2019-2024, Arm Limited and Contributors - Copyright (c) 2024, Mobica Limited - Copyright (c) 2024, Sascha Willems + Copyright (c) 2019-2025, Arm Limited and Contributors + Copyright (c) 2024-2025, Mobica Limited + Copyright (c) 2024-2025, Sascha Willems SPDX-License-Identifier: Apache-2.0 @@ -22,9 +22,9 @@ set(SCRIPT_DIR ${CMAKE_CURRENT_LIST_DIR}) function(add_sample) - set(options) - set(oneValueArgs ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS) - set(multiValueArgs FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL) + set(options) + set(oneValueArgs ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS GLSLC_ADDITIONAL_ARGUMENTS) + set(multiValueArgs FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL SHADER_FILES_SLANG) cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -35,7 +35,7 @@ function(add_sample) AUTHOR ${TARGET_AUTHOR} NAME ${TARGET_NAME} DESCRIPTION ${TARGET_DESCRIPTION} - TAGS + TAGS "any" FILES ${TARGET_FILES} @@ -45,13 +45,16 @@ function(add_sample) ${TARGET_SHADER_FILES_GLSL} SHADER_FILES_HLSL ${TARGET_SHADER_FILES_HLSL} - DXC_ADDITIONAL_ARGUMENTS ${TARGET_DXC_ADDITIONAL_ARGUMENTS}) + SHADER_FILES_SLANG + ${TARGET_SHADER_FILES_SLANG} + DXC_ADDITIONAL_ARGUMENTS ${TARGET_DXC_ADDITIONAL_ARGUMENTS} + GLSLC_ADDITIONAL_ARGUMENTS ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS}) endfunction() function(add_sample_with_tags) set(options) - set(oneValueArgs ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS) - set(multiValueArgs TAGS FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL) + set(oneValueArgs ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS GLSLC_ADDITIONAL_ARGUMENTS) + set(multiValueArgs TAGS FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL SHADER_FILES_SLANG SHADER_FILES_SPVASM) cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -77,6 +80,16 @@ function(add_sample_with_tags) list(APPEND SHADERS_HLSL "${PROJECT_SOURCE_DIR}/shaders/${SHADER_FILE_HLSL}") endforeach() + # Add slang shader files for this sample + foreach(SHADER_FILE_SLANG ${TARGET_SHADER_FILES_SLANG}) + list(APPEND SHADERS_SLANG "${PROJECT_SOURCE_DIR}/shaders/${SHADER_FILE_SLANG}") + endforeach() + + # Add spvasm shader files for this sample + foreach(SHADER_FILE_SPVASM ${TARGET_SHADER_FILES_SPVASM}) + list(APPEND SHADERS_SPVASM "${PROJECT_SOURCE_DIR}/shaders/${SHADER_FILE_SPVASM}") + endforeach() + add_project( TYPE "Sample" ID ${TARGET_ID} @@ -84,7 +97,7 @@ function(add_sample_with_tags) AUTHOR ${TARGET_AUTHOR} NAME ${TARGET_NAME} DESCRIPTION ${TARGET_DESCRIPTION} - TAGS + TAGS ${TARGET_TAGS} FILES ${SRC_FILES} @@ -94,38 +107,18 @@ function(add_sample_with_tags) ${SHADERS_GLSL} SHADERS_HLSL ${SHADERS_HLSL} - DXC_ADDITIONAL_ARGUMENTS ${TARGET_DXC_ADDITIONAL_ARGUMENTS}) - -endfunction() - -function(vkb_add_test) - set(options) - set(oneValueArgs ID) - set(multiValueArgs) - - cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - set(SRC_FILES - ${TARGET_ID}.h - ${TARGET_ID}.cpp - ) - - add_project( - TYPE "Test" - ID ${TARGET_ID} - CATEGORY "Tests" - AUTHOR " " - NAME ${TARGET_ID} - DESCRIPTION " " - TAGS " " - FILES ${SRC_FILES} - LIBS test_framework) + SHADERS_SLANG + ${SHADERS_SLANG} + SHADERS_SPVASM + ${SHADERS_SPVASM} + DXC_ADDITIONAL_ARGUMENTS ${TARGET_DXC_ADDITIONAL_ARGUMENTS} + GLSLC_ADDITIONAL_ARGUMENTS ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS}) endfunction() function(add_project) - set(options) - set(oneValueArgs TYPE ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS) - set(multiValueArgs TAGS FILES LIBS SHADERS_GLSL SHADERS_HLSL) + set(options) + set(oneValueArgs TYPE ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS GLSLC_ADDITIONAL_ARGUMENTS) + set(multiValueArgs TAGS FILES LIBS SHADERS_GLSL SHADERS_HLSL SHADERS_SLANG SHADERS_SPVASM) cmake_parse_arguments(TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -152,13 +145,19 @@ function(add_project) if (TARGET_SHADERS_HLSL) source_group("\\Shaders\\hlsl" FILES ${TARGET_SHADERS_HLSL}) # Disable automatic compilation of HLSL shaders for MSVC - set_source_files_properties(SOURCE ${SHADERS_HLSL} PROPERTIES VS_SETTINGS "ExcludedFromBuild=true") + set_source_files_properties(SOURCE ${SHADERS_HLSL} PROPERTIES VS_SETTINGS "ExcludedFromBuild=true") + endif() + if (TARGET_SHADERS_SLANG) + source_group("\\Shaders\\slang" FILES ${TARGET_SHADERS_SLANG}) + endif() + if (TARGET_SHADERS_SPVASM) + source_group("\\Shaders\\spvasm" FILES ${TARGET_SHADERS_SPVASM}) endif() if(${TARGET_TYPE} STREQUAL "Sample") - add_library(${PROJECT_NAME} OBJECT ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL}) + add_library(${PROJECT_NAME} OBJECT ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL} ${SHADERS_SLANG} ${SHADERS_SPVASM}) elseif(${TARGET_TYPE} STREQUAL "Test") - add_library(${PROJECT_NAME} STATIC ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL}) + add_library(${PROJECT_NAME} STATIC ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL} ${SHADERS_SLANG} ${SHADERS_SPVASM}) endif() set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) @@ -171,7 +170,7 @@ endif() target_link_libraries(${PROJECT_NAME} PUBLIC ${TARGET_LIBS}) endif() - # capitalise the first letter of the category (performance -> Performance) + # capitalise the first letter of the category (performance -> Performance) string(SUBSTRING ${TARGET_CATEGORY} 0 1 FIRST_LETTER) string(TOUPPER ${FIRST_LETTER} FIRST_LETTER) string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" CATEGORY "${TARGET_CATEGORY}") @@ -179,7 +178,7 @@ endif() if(${TARGET_TYPE} STREQUAL "Sample") # set sample properties set_target_properties(${PROJECT_NAME} - PROPERTIES + PROPERTIES SAMPLE_CATEGORY ${TARGET_CATEGORY} SAMPLE_AUTHOR ${TARGET_AUTHOR} SAMPLE_NAME ${TARGET_NAME} @@ -197,7 +196,10 @@ endif() set_target_properties(${PROJECT_NAME} PROPERTIES CXX_CLANG_TIDY "${VKB_DO_CLANG_TIDY}") endif() + # HLSL compilation via DXC if(Vulkan_dxc_EXECUTABLE AND DEFINED SHADERS_HLSL) + set(OUTPUT_FILES "") + set(HLSL_TARGET_NAME ${PROJECT_NAME}-HLSL) foreach(SHADER_FILE_HLSL ${TARGET_SHADERS_HLSL}) get_filename_component(HLSL_SPV_FILE ${SHADER_FILE_HLSL} NAME_WLE) get_filename_component(bare_name ${HLSL_SPV_FILE} NAME_WLE) @@ -236,21 +238,138 @@ endif() if(NOT "${TARGET_DXC_ADDITIONAL_ARGUMENTS}" STREQUAL "") string(REPLACE " " ";" TARGET_DXC_ADDITIONAL_ARGUMENTS "${TARGET_DXC_ADDITIONAL_ARGUMENTS}") endif () - add_custom_command( PRE_BUILD - OUTPUT ${OUTPUT_FILE} - COMMAND ${Vulkan_dxc_EXECUTABLE} -spirv -T ${DXC_PROFILE} -E main ${TARGET_DXC_ADDITIONAL_ARGUMENTS} ${SHADER_FILE_HLSL} -Fo ${OUTPUT_FILE} - COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory} - MAIN_DEPENDENCY ${SHADER_FILE_HLSL} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${Vulkan_dxc_EXECUTABLE} -spirv -T ${DXC_PROFILE} -E main ${TARGET_DXC_ADDITIONAL_ARGUMENTS} ${SHADER_FILE_HLSL} -Fo ${OUTPUT_FILE} + COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory} + MAIN_DEPENDENCY ${SHADER_FILE_HLSL} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + list(APPEND OUTPUT_FILES ${OUTPUT_FILE}) + set_source_files_properties(${OUTPUT_FILE} PROPERTIES + MACOSX_PACKAGE_LOCATION Resources ) - if(NOT TARGET ${bare_name}-${extension}) - add_custom_target(${bare_name}-${extension} DEPENDS ${OUTPUT_FILE}) + endforeach() + add_custom_target(${HLSL_TARGET_NAME} DEPENDS ${OUTPUT_FILES}) + set_property(TARGET ${HLSL_TARGET_NAME} PROPERTY FOLDER "Shaders-HLSL") + add_dependencies(${PROJECT_NAME} ${HLSL_TARGET_NAME}) + endif() + + # Slang shader compilation + # Skip on MacOS/iOS due to CI/CD using potentially broken slang compiler versions from the SDK + # Might revisit once Slang shipped with the SDK is usable + set(SLANG_SKIP_COMPILE false) + if (($ENV{CI} MATCHES true) AND ((CMAKE_SYSTEM_NAME MATCHES "Darwin") OR (CMAKE_SYSTEM_NAME MATCHES "iOS"))) + set(SLANG_SKIP_COMPILE true) + endif() + if(VKB_SKIP_SLANG_SHADER_COMPILATION) + set(SLANG_SKIP_COMPILE true) + endif() + if(NOT SLANG_SKIP_COMPILE AND Vulkan_slang_EXECUTABLE AND DEFINED SHADERS_SLANG) + set(OUTPUT_FILES "") + set(SLANG_TARGET_NAME ${PROJECT_NAME}-SLANG) + foreach(SHADER_FILE_SLANG ${TARGET_SHADERS_SLANG}) + get_filename_component(SLANG_SPV_FILE ${SHADER_FILE_SLANG} NAME_WLE) + get_filename_component(bare_name ${SLANG_SPV_FILE} NAME_WLE) + get_filename_component(extension ${SLANG_SPV_FILE} LAST_EXT) + get_filename_component(directory ${SHADER_FILE_SLANG} DIRECTORY) + string(REGEX REPLACE "[.]+" "" extension ${extension}) + set(OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/shader-slang-spv") + set(OUTPUT_FILE ${OUTPUT_DIR}/${bare_name}.${extension}.spv) + file(MAKE_DIRECTORY ${OUTPUT_DIR}) + set(SLANG_PROFILE "spirv_1_4") + set(SLANG_ENTRY_POINT "main") + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${Vulkan_slang_EXECUTABLE} ${SHADER_FILE_SLANG} -profile ${SLANG_PROFILE} -matrix-layout-column-major -target spirv -o ${OUTPUT_FILE} -entry ${SLANG_ENTRY_POINT} + COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory} + MAIN_DEPENDENCY ${SHADER_FILE_SLANG} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + list(APPEND OUTPUT_FILES ${OUTPUT_FILE}) + set_source_files_properties(${OUTPUT_FILE} PROPERTIES + MACOSX_PACKAGE_LOCATION Resources + ) + endforeach() + add_custom_target(${SLANG_TARGET_NAME} DEPENDS ${OUTPUT_FILES}) + set_property(TARGET ${SLANG_TARGET_NAME} PROPERTY FOLDER "Shaders-SLANG") + add_dependencies(${PROJECT_NAME} ${SLANG_TARGET_NAME}) + endif() + + # GLSL shader compilation + if(Vulkan_glslc_EXECUTABLE AND DEFINED SHADERS_GLSL) + set(GLSL_TARGET_NAME ${PROJECT_NAME}-GLSL) + set(OUTPUT_FILES "") + foreach(SHADER_FILE_GLSL ${TARGET_SHADERS_GLSL}) + get_filename_component(GLSL_SPV_FILE ${SHADER_FILE_GLSL} NAME_WLE) + get_filename_component(bare_name ${GLSL_SPV_FILE} NAME_WLE) + get_filename_component(extension ${SHADER_FILE_GLSL} LAST_EXT) + get_filename_component(directory ${SHADER_FILE_GLSL} DIRECTORY) + # Skip extensions that can't be compiled (cl, inlcudes) + if(${extension} STREQUAL ".cl" OR ${extension} STREQUAL ".h") + continue() + endif() + set(OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/shader-glsl-spv") + set(OUTPUT_FILE ${OUTPUT_DIR}/${bare_name}${extension}.spv) + file(MAKE_DIRECTORY ${OUTPUT_DIR}) + + # NOTE: Vulkan SDK has old glslc but new glslang. We must use glslang to compile shaders from `tensor_and_data_graph`. + # TODO: Remove workaround once glslc is updated. + if ("${CMAKE_CURRENT_BINARY_DIR}" MATCHES "tensor_and_data_graph" AND NOT ${SHADER_FILE_GLSL} MATCHES "base") + # glslang (NOT glslangValidator, as that also seems to be old) + string(REPLACE "glslangValidator" "glslang" GLSLANG_EXECUTABLE ${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE}) + SET(COMPILE_COMMAND ${GLSLANG_EXECUTABLE} ${SHADER_FILE_GLSL} -o ${OUTPUT_FILE} -V -I"${CMAKE_SOURCE_DIR}/shaders/includes/glsl" ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS}) + else() + # glslc + SET(COMPILE_COMMAND ${Vulkan_glslc_EXECUTABLE} ${SHADER_FILE_GLSL} -o ${OUTPUT_FILE} -I "${CMAKE_SOURCE_DIR}/shaders/includes/glsl" ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS}) endif() - add_dependencies(${PROJECT_NAME} ${bare_name}-${extension}) + + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${COMPILE_COMMAND} + COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory} + MAIN_DEPENDENCY ${SHADER_FILE_GLSL} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + list(APPEND OUTPUT_FILES ${OUTPUT_FILE}) set_source_files_properties(${OUTPUT_FILE} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources + MACOSX_PACKAGE_LOCATION Resources ) - set_property(TARGET ${bare_name}-${extension} PROPERTY FOLDER "HLSL_Shaders") endforeach() + add_custom_target(${GLSL_TARGET_NAME} DEPENDS ${OUTPUT_FILES}) + set_property(TARGET ${GLSL_TARGET_NAME} PROPERTY FOLDER "Shaders-GLSL") + add_dependencies(${PROJECT_NAME} ${GLSL_TARGET_NAME}) endif() + + # spvasm shader compilation + if(Vulkan_spirvas_EXECUTABLE AND DEFINED SHADERS_SPVASM) + set(SPVASM_TARGET_NAME ${PROJECT_NAME}-SPVASM) + set(OUTPUT_FILES "") + foreach(SHADER_FILE_SPVASM ${TARGET_SHADERS_SPVASM}) + get_filename_component(SPVASM_FILE ${SHADER_FILE_SPVASM} NAME_WLE) + get_filename_component(bare_name ${SPVASM_FILE} NAME_WLE) + get_filename_component(extension ${SHADER_FILE_SPVASM} LAST_EXT) + get_filename_component(directory ${SHADER_FILE_SPVASM} DIRECTORY) + set(OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/shader-spvasm-spv") + set(OUTPUT_FILE ${OUTPUT_DIR}/${bare_name}${extension}.spv) + file(MAKE_DIRECTORY ${OUTPUT_DIR}) + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${Vulkan_spirvas_EXECUTABLE} ${SHADER_FILE_SPVASM} -o ${OUTPUT_FILE} ${TARGET_SPVASM_ADDITIONAL_ARGUMENTS} + COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory} + MAIN_DEPENDENCY ${SHADER_FILE_SPVASM} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + list(APPEND OUTPUT_FILES ${OUTPUT_FILE}) + set_source_files_properties(${OUTPUT_FILE} PROPERTIES + MACOSX_PACKAGE_LOCATION Resources + ) + endforeach() + add_custom_target(${SPVASM_TARGET_NAME} DEPENDS ${OUTPUT_FILES}) + set_property(TARGET ${SPVASM_TARGET_NAME} PROPERTY FOLDER "Shaders-SPVASM") + add_dependencies(${PROJECT_NAME} ${SPVASM_TARGET_NAME}) + + endif() + endfunction() \ No newline at end of file diff --git a/bldsys/cmake/template/gradle/app.build.gradle.in b/bldsys/cmake/template/gradle/app.build.gradle.in index 88be1d6b6c..217166a998 100644 --- a/bldsys/cmake/template/gradle/app.build.gradle.in +++ b/bldsys/cmake/template/gradle/app.build.gradle.in @@ -2,18 +2,18 @@ plugins { id 'com.android.application' } -ext.vvl_version='1.3.275.0' +ext.vvl_version='1.4.321.0' apply from: "./download_vvl.gradle" android { - compileSdk 33 - buildToolsVersion "33.0.0" - ndkVersion "25.2.9519653" + ndkVersion '28.2.13676358' + compileSdk 35 defaultConfig { - applicationId "com.khronos.vulkan_samples" + applicationId 'com.khronos.vulkan_samples' + namespace "com.khronos.vulkan_samples" @MIN_SDK_VERSION@ - targetSdk 33 + targetSdk 35 versionCode 1 versionName "1.0" @@ -43,8 +43,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } sourceSets { @@ -64,11 +64,11 @@ android { } } - lintOptions { - checkReleaseBuilds false + lint { abortOnError false + checkReleaseBuilds false } - + buildFeatures { viewBinding true prefab true @@ -76,9 +76,9 @@ android { } dependencies { - implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.8.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core:1.9.0' - implementation 'androidx.games:games-activity:2.0.0' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'com.google.android.material:material:1.12.0' + implementation 'androidx.constraintlayout:constraintlayout:2.2.0' + implementation 'androidx.core:core:1.15.0' + implementation 'androidx.games:games-activity:3.0.5' } diff --git a/bldsys/cmake/template/gradle/build.gradle.in b/bldsys/cmake/template/gradle/build.gradle.in index f979c64312..1684e9f6e1 100644 --- a/bldsys/cmake/template/gradle/build.gradle.in +++ b/bldsys/cmake/template/gradle/build.gradle.in @@ -1,8 +1,8 @@ plugins { - id 'com.android.application' version '7.4.2' apply false - id 'com.android.library' version '7.4.2' apply false + id 'com.android.application' version '8.7.2' apply false + id 'com.android.library' version '8.7.2' apply false } -task clean(type: Delete) { - delete rootProject.buildDir +tasks.register('clean', Delete) { + delete rootProject.layout.buildDirectory } diff --git a/bldsys/cmake/template/gradle/download_vvl.gradle b/bldsys/cmake/template/gradle/download_vvl.gradle index fa029770a9..bfa51f35b4 100644 --- a/bldsys/cmake/template/gradle/download_vvl.gradle +++ b/bldsys/cmake/template/gradle/download_vvl.gradle @@ -36,7 +36,7 @@ apply plugin: 'com.android.application' */ // get the validation layer version. -def VVL_VER = "1.3.275.0" +def VVL_VER = "1.4.321.0" if (ext.has("vvl_version")) { VVL_VER = ext.vvl_version } @@ -76,5 +76,6 @@ dependencies { } project.afterEvaluate{ + project.getTasks().getByName("mergeDebugJniLibFolders").dependsOn(unzip) project.getTasks().getByName("mergeReleaseJniLibFolders").dependsOn(unzip) } diff --git a/bldsys/cmake/template/gradle/gradle-wrapper.jar b/bldsys/cmake/template/gradle/gradle-wrapper.jar index 41d9927a4d..2c3521197d 100644 Binary files a/bldsys/cmake/template/gradle/gradle-wrapper.jar and b/bldsys/cmake/template/gradle/gradle-wrapper.jar differ diff --git a/bldsys/cmake/template/gradle/gradle-wrapper.properties.in b/bldsys/cmake/template/gradle/gradle-wrapper.properties.in index 8049c684f0..2fa91c5f85 100644 --- a/bldsys/cmake/template/gradle/gradle-wrapper.properties.in +++ b/bldsys/cmake/template/gradle/gradle-wrapper.properties.in @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/bldsys/cmake/template/gradle/gradlew b/bldsys/cmake/template/gradle/gradlew index 1b6c787337..f5feea6d6b 100755 --- a/bldsys/cmake/template/gradle/gradlew +++ b/bldsys/cmake/template/gradle/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,12 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +134,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +217,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/bldsys/cmake/template/gradle/gradlew.bat b/bldsys/cmake/template/gradle/gradlew.bat index ac1b06f938..9b42019c79 100644 --- a/bldsys/cmake/template/gradle/gradlew.bat +++ b/bldsys/cmake/template/gradle/gradlew.bat @@ -13,8 +13,10 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +27,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/bldsys/cmake/template/sample/CMakeLists.txt.in b/bldsys/cmake/template/sample/CMakeLists.txt.in index d516d00a09..1d287ec03a 100644 --- a/bldsys/cmake/template/sample/CMakeLists.txt.in +++ b/bldsys/cmake/template/sample/CMakeLists.txt.in @@ -1,4 +1,4 @@ -# Copyright (c) 2019, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -24,4 +24,10 @@ add_sample( CATEGORY ${CATEGORY_NAME} AUTHOR "Khronos" NAME "@SAMPLE_NAME@" - DESCRIPTION "Sample description") + DESCRIPTION "Sample description" + # Important note: Shaders are compiled offline via CMake, so all shaders + # used by this sample need to be put here + # The framework also supports HLSL (SHADER_FILES_HLSL) and Slang (SHADER_FILES_SLANG) + SHADER_FILES_GLSL + "triangle.vert" + "triangle.frag") diff --git a/bldsys/cmake/template/sample/sample.cpp.in b/bldsys/cmake/template/sample/sample.cpp.in index 2362e7bb79..c27ac767c3 100644 --- a/bldsys/cmake/template/sample/sample.cpp.in +++ b/bldsys/cmake/template/sample/sample.cpp.in @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -44,8 +44,8 @@ bool @SAMPLE_NAME@::prepare(const vkb::ApplicationOptions &options) auto camera = &camera_node.get_component(); // Example Scene Render Pipeline - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); render_pipeline->add_subpass(std::move(scene_subpass)); diff --git a/bldsys/cmake/template/sample_api/CMakeLists.txt.in b/bldsys/cmake/template/sample_api/CMakeLists.txt.in index 4fec7e70e8..cf2e0a5b45 100644 --- a/bldsys/cmake/template/sample_api/CMakeLists.txt.in +++ b/bldsys/cmake/template/sample_api/CMakeLists.txt.in @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Arm Limited and Contributors +# Copyright (c) 2023-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -25,6 +25,9 @@ add_sample( AUTHOR "<>" NAME "@SAMPLE_NAME@" DESCRIPTION "Sample description" + # Important note: Shaders are compiled offline via CMake, so all shaders + # used by this sample need to be put here + # The framework also supports HLSL (SHADER_FILES_HLSL) and Slang (SHADER_FILES_SLANG) SHADER_FILES_GLSL "triangle.vert" "triangle.frag") diff --git a/bldsys/cmake/template/sample_api/sample.cpp.in b/bldsys/cmake/template/sample_api/sample.cpp.in index d6e4337465..4096d8cce8 100644 --- a/bldsys/cmake/template/sample_api/sample.cpp.in +++ b/bldsys/cmake/template/sample_api/sample.cpp.in @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -80,8 +80,8 @@ void @SAMPLE_NAME@::prepare_pipelines() std::array shader_stages{}; // Vertex stage of the pipeline - shader_stages[0] = load_shader("triangle.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("triangle.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // We need to specify the pipeline layout and the render pass description up front as well. VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(sample_pipeline_layout, render_pass); diff --git a/components/README.adoc b/components/README.adoc index 8f33066d1d..57985312b1 100644 --- a/components/README.adoc +++ b/components/README.adoc @@ -1,6 +1,6 @@ //// -- Copyright (c) 2023-2024, Thomas Atkinson -- Copyright (c) 2024, The Khronos Group +- Copyright (c) 2023-2025, Thomas Atkinson +- Copyright (c) 2024-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -66,22 +66,6 @@ vkb__register_component( ) ---- -=== Add a Test - -Registering a test adds the `tests__` compile target. -This target is also linked as a dependency to `vkb__tests`. - -[,cmake] ----- -vkb__register_tests( - NAME - SRC - tests/.test.cpp - LINK_LIBS - -) ----- - === Compile Components * To compile all components run cmake with `--target vkb__components` diff --git a/components/core/CMakeLists.txt b/components/core/CMakeLists.txt index 43f7ac91e5..36be512357 100644 --- a/components/core/CMakeLists.txt +++ b/components/core/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Thomas Atkinson +# Copyright (c) 2023-2025, Thomas Atkinson # # SPDX-License-Identifier: Apache-2.0 # @@ -39,15 +39,6 @@ if (VKB_PROFILING) endif() -vkb__register_tests( - COMPONENT core - NAME utils - SRC - tests/strings.test.cpp - LINK_LIBS - vkb__core -) - if(ANDROID) target_compile_definitions(vkb__core PUBLIC VK_USE_PLATFORM_ANDROID_KHR PLATFORM__ANDROID) elseif(WIN32) diff --git a/components/core/include/core/util/error.hpp b/components/core/include/core/util/error.hpp index eadf723a9d..2012f3d9e4 100644 --- a/components/core/include/core/util/error.hpp +++ b/components/core/include/core/util/error.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Thomas Atkinson +/* Copyright (c) 2023-2025, Thomas Atkinson * * SPDX-License-Identifier: Apache-2.0 * @@ -58,7 +58,7 @@ template inline void ERRORF(const std::string &format, Args &&...args) { - throw std::runtime_error(fmt::format(format, std::forward(args)...)); + throw std::runtime_error(fmt::vformat(format, fmt::make_format_args(args...))); } inline void ERRORF(const std::string &message) diff --git a/components/core/tests/strings.test.cpp b/components/core/tests/strings.test.cpp deleted file mode 100644 index 14f35623ee..0000000000 --- a/components/core/tests/strings.test.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2024, Thomas Atkinson - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include - -using namespace vkb; - -TEST_CASE("vkb::replace_all", "[common]") -{ - REQUIRE(replace_all("/././", "./", "/") == "///"); - REQUIRE(replace_all("vulkanvulkanvulkan", "vulkan", "kan") == "kankankan"); -} - -TEST_CASE("vkb::trim_right", "[common]") -{ - REQUIRE(trim_right("hello ") == "hello"); // default case - REQUIRE(trim_right("hello ", " ") == "hello"); - REQUIRE(trim_right("hello ignore", " ") == "hello ignore"); - REQUIRE(trim_right("hellocomplex", "complex") == "h"); // remember we are trimming a set -} - -TEST_CASE("vkb::trim_left", "[common]") -{ - REQUIRE(trim_left(" hello") == "hello"); // default case - REQUIRE(trim_left(" hello", " ") == "hello"); - REQUIRE(trim_left("ignore hello", " ") == "ignore hello"); - REQUIRE(trim_left("complexhello", "complex") == "hello"); // remember we are trimming a set until the first non-match -} \ No newline at end of file diff --git a/components/filesystem/CMakeLists.txt b/components/filesystem/CMakeLists.txt index 65984f2880..5f1239ed8f 100644 --- a/components/filesystem/CMakeLists.txt +++ b/components/filesystem/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Thomas Atkinson +# Copyright (c) 2023-2025, Thomas Atkinson # # SPDX-License-Identifier: Apache-2.0 # @@ -35,12 +35,3 @@ vkb__register_component( if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0) target_link_libraries(vkb__filesystem PRIVATE stdc++fs) endif() - -vkb__register_tests( - COMPONENT filesystem - NAME filesystem - SRC - tests/filesystem.test.cpp - LINK_LIBS - vkb__filesystem -) diff --git a/components/filesystem/include/filesystem/legacy.h b/components/filesystem/include/filesystem/legacy.h index 76bf949845..25c91c0ad6 100644 --- a/components/filesystem/include/filesystem/legacy.h +++ b/components/filesystem/include/filesystem/legacy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -96,20 +96,20 @@ void create_path(const std::string &root, const std::string &path); std::vector read_asset(const std::string &filename); /** - * @brief Helper to read a shader file into a single string + * @brief Helper to read a text file into a single string * * @param filename The path to the file (relative to the assets directory) - * @return A string of the text in the shader file + * @return A string of the text the file */ -std::string read_shader(const std::string &filename); +std::string read_text_file(const std::string &filename); /** - * @brief Helper to read a shader file into a byte-array + * @brief Helper to read a shader file into an array of unsigned 32 bit integers * * @param filename The path to the file (relative to the assets directory) * @return A vector filled with data read from the file */ -std::vector read_shader_binary(const std::string &filename); +std::vector read_shader_binary_u32(const std::string &filename); /** * @brief Helper to read a temporary file into a byte-array diff --git a/components/filesystem/src/legacy.cpp b/components/filesystem/src/legacy.cpp index 8318c0dabb..3e1c60f8ed 100644 --- a/components/filesystem/src/legacy.cpp +++ b/components/filesystem/src/legacy.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -109,14 +109,17 @@ std::vector read_asset(const std::string &filename) return vkb::filesystem::get()->read_file_binary(path::get(path::Type::Assets) + filename); } -std::string read_shader(const std::string &filename) +std::string read_text_file(const std::string &filename) { return vkb::filesystem::get()->read_file_string(path::get(path::Type::Shaders) + filename); } -std::vector read_shader_binary(const std::string &filename) +std::vector read_shader_binary_u32(const std::string &filename) { - return vkb::filesystem::get()->read_file_binary(path::get(path::Type::Shaders) + filename); + auto buffer = vkb::filesystem::get()->read_file_binary(path::get(path::Type::Shaders) + filename); + assert(buffer.size() % sizeof(uint32_t) == 0); + auto spirv = std::vector(reinterpret_cast(buffer.data()), reinterpret_cast(buffer.data()) + buffer.size() / sizeof(uint32_t)); + return spirv; } std::vector read_temp(const std::string &filename) diff --git a/components/filesystem/tests/filesystem.test.cpp b/components/filesystem/tests/filesystem.test.cpp deleted file mode 100644 index 90222de552..0000000000 --- a/components/filesystem/tests/filesystem.test.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (c) 2023-2024, Thomas Atkinson - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "filesystem/filesystem.hpp" - -using namespace vkb::filesystem; - -Path create_test_directory(FileSystemPtr fs, const std::string &test_name) -{ - const auto test_dir = fs->temp_directory() / "vulkan_samples_tests" / test_name; - - REQUIRE(fs->create_directory(test_dir)); - REQUIRE(fs->exists(test_dir)); - REQUIRE(fs->is_directory(test_dir)); - - return test_dir; -} - -void delete_test_directory(FileSystemPtr fs, const Path &test_dir) -{ - REQUIRE(fs->exists(test_dir)); - fs->remove(test_dir); - REQUIRE_FALSE(fs->exists(test_dir)); -} - -void create_test_file(FileSystemPtr fs, const Path &path, const std::string &data) -{ - REQUIRE(fs); - REQUIRE_NOTHROW(fs->write_file(path, data)); - REQUIRE(fs->exists(path)); - REQUIRE(fs->is_file(path)); - - const auto written_data = fs->read_file_string(path); - REQUIRE(data == written_data); -} - -void delete_test_file(FileSystemPtr fs, const Path &path) -{ - REQUIRE(fs); - REQUIRE(fs->exists(path)); - REQUIRE(fs->is_file(path)); - REQUIRE_NOTHROW(fs->remove(path)); - REQUIRE_FALSE(fs->exists(path)); -} - -TEST_CASE("File read and write", "[filesystem]") -{ - vkb::filesystem::init(); - - auto fs = vkb::filesystem::get(); - - const auto test_dir = create_test_directory(fs, "file_test"); - const auto test_file = test_dir / "test.txt"; - const std::string test_data = "Hello, World!"; - - create_test_file(fs, test_file, test_data); - delete_test_file(fs, test_file); - delete_test_directory(fs, test_dir); -} - -TEST_CASE("Read file chunk", "[filesystem]") -{ - vkb::filesystem::init(); - - auto fs = vkb::filesystem::get(); - - const auto test_dir = create_test_directory(fs, "chunk_test"); - const auto test_file = test_dir / "chunk_test.txt"; - const std::string test_data = "Hello, World!"; - - create_test_file(fs, test_file, test_data); - - const auto chunk = fs->read_chunk(test_file, 0, 5); - std::string chunk_str(chunk.begin(), chunk.end()); - REQUIRE(chunk_str == "Hello"); - - delete_test_file(fs, test_file); - delete_test_directory(fs, test_dir); -} - -TEST_CASE("Read file chunk out of bounds", "[filesystem]") -{ - vkb::filesystem::init(); - - auto fs = vkb::filesystem::get(); - - const auto test_dir = create_test_directory(fs, "chunk_oob"); - const auto test_file = test_dir / "chunk_oob_test.txt"; - const std::string test_data = "Hello, World!"; - - create_test_file(fs, test_file, test_data); - - const auto chunk = fs->read_chunk(test_file, 0, 100); - REQUIRE(chunk.empty()); - - delete_test_file(fs, test_file); - delete_test_directory(fs, test_dir); -} - -TEST_CASE("Read file chunk with offset", "[filesystem]") -{ - vkb::filesystem::init(); - - auto fs = vkb::filesystem::get(); - - const auto test_dir = create_test_directory(fs, "chunk_offset"); - const auto test_file = test_dir / "chunk_offset_test.txt"; - const std::string test_data = "Hello, World!"; - - create_test_file(fs, test_file, test_data); - - const auto chunk = fs->read_chunk(test_file, 7, 5); - std::string chunk_str(chunk.begin(), chunk.end()); - REQUIRE(chunk_str == "World"); - - delete_test_file(fs, test_file); - delete_test_directory(fs, test_dir); -} - -TEST_CASE("Read binary file", "[filesystem]") -{ - vkb::filesystem::init(); - - auto fs = vkb::filesystem::get(); - - const auto test_dir = create_test_directory(fs, "binary_test"); - const auto test_file = test_dir / "binary_test.txt"; - const std::string test_data = "Hello, World!"; - - create_test_file(fs, test_file, test_data); - - const auto binary = fs->read_file_binary(test_file); - std::string binary_str(binary.begin(), binary.end()); - REQUIRE(binary_str == test_data); - - delete_test_file(fs, test_file); - delete_test_directory(fs, test_dir); -} - -TEST_CASE("Create Directory", "[filesystem]") -{ - vkb::filesystem::init(); - - auto fs = vkb::filesystem::get(); - - const auto test_dir = create_test_directory(fs, "create_directory_test"); - const auto test_sub_dir = test_dir / "test_dir"; - - REQUIRE(fs->create_directory(test_sub_dir)); - REQUIRE(fs->exists(test_sub_dir)); - REQUIRE(fs->is_directory(test_sub_dir)); - - std::vector data = {0, 1, 2, 3, 4, 5}; - for (uint8_t i : data) - { - // Create sub directories - const auto sub_dir = test_sub_dir / fmt::format("sub_dir_{}", i); - REQUIRE(fs->create_directory(sub_dir)); - } - - // Check in a separate pass to ensure create_directory called multiple times doesn't fail - for (uint8_t i : data) - { - // Check sub directories - const auto sub_dir = test_sub_dir / fmt::format("sub_dir_{}", i); - REQUIRE(fs->exists(sub_dir)); - REQUIRE(fs->is_directory(sub_dir)); - } - - // Remove both the directory and its parent - fs->remove(test_sub_dir); - - REQUIRE_FALSE(fs->exists(test_sub_dir)); - - delete_test_directory(fs, test_dir); -} diff --git a/components/ios/CMakeLists.txt b/components/ios/CMakeLists.txt index 5e7410daf8..697e98bc74 100644 --- a/components/ios/CMakeLists.txt +++ b/components/ios/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Thomas Atkinson +# Copyright (c) 2023-2025, Thomas Atkinson # # SPDX-License-Identifier: Apache-2.0 # @@ -27,16 +27,5 @@ vkb__register_component( vkb__core ) -vkb__register_tests( - NO_CATCH2 - COMPONENT ios_platform - NAME ios_platform - SRC - tests/entrypoint.test.cpp - LINK_LIBS - vkb__ios_platform -) - # attach to core target_link_libraries(vkb__core INTERFACE vkb__ios_platform) -target_compile_features(vkb__core PUBLIC cxx_std_17) diff --git a/components/unix/CMakeLists.txt b/components/unix/CMakeLists.txt index bc6aa89d7f..a95297d3b5 100644 --- a/components/unix/CMakeLists.txt +++ b/components/unix/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Thomas Atkinson +# Copyright (c) 2023-2025, Thomas Atkinson # # SPDX-License-Identifier: Apache-2.0 # @@ -25,15 +25,5 @@ vkb__register_component( vkb__core ) -vkb__register_tests( - NO_CATCH2 - COMPONENT unix_platform - NAME unix_platform - SRC - tests/entrypoint.test.cpp - LINK_LIBS - vkb__unix_platform -) - # attach to core target_link_libraries(vkb__core INTERFACE vkb__unix_platform) \ No newline at end of file diff --git a/components/windows/CMakeLists.txt b/components/windows/CMakeLists.txt index e0471238ed..fe399d391e 100644 --- a/components/windows/CMakeLists.txt +++ b/components/windows/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Thomas Atkinson +# Copyright (c) 2023-2025, Thomas Atkinson # # SPDX-License-Identifier: Apache-2.0 # @@ -25,15 +25,5 @@ vkb__register_component( vkb__core ) -vkb__register_tests( - NO_CATCH2 - COMPONENT windows_platform - NAME windows_platform - SRC - tests/entrypoint.test.cpp - LINK_LIBS - vkb__windows_platform -) - # attach to core target_link_libraries(vkb__core INTERFACE vkb__windows_platform) \ No newline at end of file diff --git a/docs/build.adoc b/docs/build.adoc index 4f817395a8..7b98330d19 100644 --- a/docs/build.adoc +++ b/docs/build.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -105,6 +105,14 @@ Tracy is not currently enabled for Android builds. In the future, we may add sup *Default:* `OFF` +=== VKB_SKIP_SLANG_SHADER_COMPILATION + +By default, Slang shaders are compiled if a Slang compiler is found on the system. In cases where this is undesirable, set this to `OFF` to disable Slang shader compilation. + +You can still select Slang as a shading language target for the samples since Slang shaders are included as precompiled SPIR-V files. + +*Default:* `OFF` + == Quality Assurance We use a small set of tools to provide a level of quality to the project. @@ -174,33 +182,14 @@ Please make sure, when running any sample, that you either: * Run Command Prompt or Visual Studio as administrator ____ -`Step 1.` The following command will generate the VS project - ----- -cmake -G "Visual Studio 15 2017 Win64" -S . -Bbuild/windows ----- - -(Prior to CMake v3.13) - ----- -cmake -G "Visual Studio 15 2017 Win64" . -Bbuild/windows ----- - -(New in CMake v3.14. -Visual Studio 2019 must be installed) - ----- - cmake -G "Visual Studio 16 2019" -A x64 -S . -Bbuild/windows ----- - -(New in CMake v3.21. -Visual Studio 2022 must be installed) +`Step 1.` Generate the VS solution from the root of the repository +(For other VS versions please refer to https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id15[CMake Generators]) ---- cmake -G "Visual Studio 17 2022" -A x64 -S . -Bbuild/windows ---- -Open the *vulkan_samples.sln* VS project inside build/windows and build with Ctrl-Shift-B. To run Vulkan Samples, use Visual Studio's Debug Properties selection and set the Debugging Command Arguments to --help. Click the "Local Windows Debugger" button and you should see the help output in the terminal. For convenience, the default setting is to run the hello_triangle sample; just edit that to your desired sample to run. +Open the *vulkan_samples.sln* or *vulkan_samples.slnx* VS solution inside *build/windows* and build with Ctrl-Shift-B. To run Vulkan Samples, use Visual Studio's Debug Properties selection and set the Debugging Command Arguments to --help. Click the "Local Windows Debugger" button and you should see the help output in the terminal. For convenience, the default setting is to run the hello_triangle sample; just edit that to your desired sample to run. Alternatively, for command line builds use the steps below: @@ -210,10 +199,10 @@ Alternatively, for command line builds use the steps below: cmake --build build/windows --config Release --target vulkan_samples ---- -`Step 3.` Run the *Vulkan Samples* application +`Step 3.` Run the *Vulkan Samples* application by specifying the name of the sample ---- -build\windows\app\bin\Release\AMD64\vulkan_samples.exe +build\windows\app\bin\Release\AMD64\vulkan_samples.exe sample ---- == Linux @@ -221,14 +210,34 @@ build\windows\app\bin\Release\AMD64\vulkan_samples.exe === Dependencies * CMake v3.12+ -* C{pp}17 Compiler +* C{pp}20 Compiler * <> * <<3d-models,3D models>> ---- -sudo apt-get install cmake g++ xorg-dev libglu1-mesa-dev +sudo apt-get install cmake g++ xorg-dev libglu1-mesa-dev libwayland-dev libxkbcommon-dev +---- + +=== Selecting the window system + +On Linux, the samples support different window systems. If not explicitly set, default is X11 Xcb. If you want to build with another window system, use the `VKB_WSI_SELECTION` CMake option like this: + +---- +cmake -G "Unix Makefiles" -Bbuild/linux -DCMAKE_BUILD_TYPE=Release -DVKB_WSI_SELECTION=WAYLAND ---- +Available Linux window systems: + +[cols="1,1"] +|=== +| VKB_WSI_SELECTION | Window system + +| XCB | X11 Xcb (Default) +| XLIB | X11 Xlib +| WAYLAND | Wayland +| D2D | Direct to Display (`VK_KHR_DISPLAY`) +|=== + === Build with CMake `Step 1.` The following command will generate the project @@ -271,7 +280,7 @@ source /PATH/TO/VULKAN/SDK/setup-env.sh `Step 1.` The following command will generate the project ---- -cmake -G Xcode -Bbuild/mac-xcode -DCMAKE_BUILD_TYPE=Release +cmake -G Xcode -Bbuild/mac-xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_SYSROOT=macosx -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 ---- Open the *vulkan_samples* Xcode project inside build/mac-xcode and build with command-B. To run Vulkan Samples, use Xcode's edit-scheme selection and set the arguments to --help. Click the "Play" button and you should see the help output in the terminal. For convenience, the default setting is to run the hello_triangle sample; just edit that to your desired sample to run. @@ -279,7 +288,7 @@ Open the *vulkan_samples* Xcode project inside build/mac-xcode and build with co Alternatively, for command line builds use the steps below: ---- -cmake -Bbuild/mac -DCMAKE_BUILD_TYPE=Release +cmake -Bbuild/mac -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_SYSROOT=macosx -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 ---- `Step 2.` Build the project @@ -318,14 +327,14 @@ source /PATH/TO/VULKAN/SDK/iOS/setup-env.sh `Step 1.` The following command will generate the project ---- -cmake -G Xcode -Bbuild/ios -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=YES -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_IOS_INSTALL_COMBINED=NO -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM="XXXX" -DMACOSX_BUNDLE_GUI_IDENTIFIER="com.YYYY.vulkansamples" +cmake -G Xcode -Bbuild/ios -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_DEPLOYMENT_TARGET=16.3 -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=YES -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_IOS_INSTALL_COMBINED=NO -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM="XXXX" -DMACOSX_BUNDLE_GUI_IDENTIFIER="com.YYYY.vulkansamples" ---- NB: You MUST change the XXXX in the above to your TeamID (or Organizational Unit identifier in your Apple Development certificate) for code signing, and YYYY to your bundle identifier. iOS will NOT allow the application to run without code signing and bundle identifier setup. -Alternatively, you can build for the iOS Simulator without code signing or specifying a bundle identifier (a default bundle id will be used). However, depending on your host architecture, you MUST select either arm64 (Apple Silicon) or x86_64 in the command below +Alternatively, you can build for the iOS Simulator (requires Vulkan SDK 1.4.321.0 or later) without code signing or specifying a bundle identifier (a default bundle id will be used). However, depending on your host architecture, you MUST select either arm64 (Apple Silicon) or x86_64 in the command below. _Note: On arm64 (Apple Silicon) hosts the Vulkan library may not load on iOS Simulator without specifying your TeamID and bundle identifier as shown above._ ---- -cmake -G Xcode -Bbuild/ios-sim -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=YES -DCMAKE_OSX_ARCHITECTURES= -DCMAKE_IOS_INSTALL_COMBINED=NO +cmake -G Xcode -Bbuild/ios-sim -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=16.3 -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=YES -DCMAKE_OSX_ARCHITECTURES= -DCMAKE_IOS_INSTALL_COMBINED=NO ---- `Step 2.` Build the project @@ -335,7 +344,7 @@ It's recommended to open the *vulkan_samples* Xcode project that is generated in Alternatively, you can build with cmake as shown here ---- -cmake --build build/ios --config Release --target vulkan_samples -j$(sysctl -n hw.ncpu) -- -sdk iphoneos -allowProvisioningUpdates +cmake --build build/ios --config Release --target vulkan_samples -j$(sysctl -n hw.ncpu) -- -allowProvisioningUpdates ---- `Step 3.` Run the *Vulkan Samples* application @@ -363,7 +372,10 @@ ____ We use this environment in the CI https://github.com/KhronosGroupActions/android-ndk-build[Android NDK Repository] ____ -It is highly recommended to install https://d.android.com/studio[Android Studio] to build, run and trace the sample project. +=== Android Studio (Recommended) + +It is highly recommended to install https://d.android.com/studio[Android Studio] to build, run and trace the sample project. Building via Android Studio requires at least Ladybug 2024.2.1. + Android Studio uses the following plugins/tools to build samples: * Android Gradle Plugin diff --git a/docs/misc.adoc b/docs/misc.adoc index 18b7dc2b26..ddf0b671c8 100644 --- a/docs/misc.adoc +++ b/docs/misc.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2023, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -61,7 +61,7 @@ image::./images/debug-window.png[Debug Window] == Driver version -The debug window shows the driver version of the GPU, which follows the https://registry.khronos.org/vulkan/specs/1.3-extensions/html/chap44.html#extendingvulkan-coreversions-versionnumbers[Vulkan semantics], with a major, minor, and patch number. +The debug window shows the driver version of the GPU, which follows the https://registry.khronos.org/vulkan/specs/latest/html/chap44.html#extendingvulkan-coreversions-versionnumbers[Vulkan semantics], with a major, minor, and patch number. New versions of the driver will increment these numbers. The framework is able to get these values by calling `vkGetPhysicalDeviceProperties(physical_device, &properties)`. diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index 3755930607..8d2386257a 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -1,4 +1,5 @@ -# Copyright (c) 2019-2024, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors +# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -23,7 +24,6 @@ set(FRAMEWORK_FILES # Header Files gui.h drawer.h - glsl_compiler.h spirv_reflection.h gltf_loader.h buffer_pool.h @@ -43,18 +43,14 @@ set(FRAMEWORK_FILES vulkan_type_mapping.h hpp_api_vulkan_sample.h hpp_fence_pool.h - hpp_glsl_compiler.h hpp_gltf_loader.h - hpp_gui.h hpp_resource_binding_state.h hpp_resource_cache.h hpp_resource_record.h hpp_resource_replay.h hpp_semaphore_pool.h # Source Files - gui.cpp drawer.cpp - glsl_compiler.cpp spirv_reflection.cpp gltf_loader.cpp debug_info.cpp @@ -69,7 +65,6 @@ set(FRAMEWORK_FILES timer.cpp camera_core.cpp hpp_api_vulkan_sample.cpp - hpp_gui.cpp hpp_resource_cache.cpp) set(COMMON_FILES @@ -115,8 +110,6 @@ set(RENDERING_FILES rendering/render_target.h rendering/subpass.h rendering/hpp_pipeline_state.h - rendering/hpp_render_context.h - rendering/hpp_render_frame.h rendering/hpp_render_pipeline.h rendering/hpp_render_target.h # Source files @@ -125,12 +118,8 @@ set(RENDERING_FILES rendering/postprocessing_pass.cpp rendering/postprocessing_renderpass.cpp rendering/postprocessing_computepass.cpp - rendering/render_context.cpp - rendering/render_frame.cpp rendering/render_pipeline.cpp rendering/render_target.cpp - rendering/hpp_render_context.cpp - rendering/hpp_render_frame.cpp rendering/hpp_render_target.cpp) set(RENDERING_SUBPASSES_FILES @@ -153,7 +142,6 @@ set(SCENE_GRAPH_FILES scene_graph/hpp_scene.h # Source Files scene_graph/component.cpp - scene_graph/node.cpp scene_graph/scene.cpp scene_graph/script.cpp) @@ -190,7 +178,6 @@ set(SCENE_GRAPH_COMPONENT_FILES scene_graph/components/material.cpp scene_graph/components/mesh.cpp scene_graph/components/pbr_material.cpp - scene_graph/components/sampler.cpp scene_graph/components/sub_mesh.cpp scene_graph/components/texture.cpp scene_graph/components/transform.cpp @@ -238,6 +225,7 @@ set(CORE_FILES core/descriptor_set.h core/queue.h core/command_pool.h + core/command_pool_base.h core/swapchain.h core/command_buffer.h core/allocated.h @@ -245,25 +233,18 @@ set(CORE_FILES core/image.h core/image_view.h core/sampled_image.h - core/instance.h core/sampler.h core/framebuffer.h core/render_pass.h core/query_pool.h core/acceleration_structure.h - core/hpp_allocated.h - core/hpp_command_buffer.h - core/hpp_command_pool.h core/hpp_debug.h core/hpp_descriptor_pool.h core/hpp_descriptor_set.h core/hpp_descriptor_set_layout.h - core/hpp_device.h core/hpp_framebuffer.h core/hpp_image.h core/hpp_image_view.h - core/hpp_instance.h - core/hpp_physical_device.h core/hpp_pipeline.h core/hpp_pipeline_layout.h core/hpp_query_pool.h @@ -274,9 +255,7 @@ set(CORE_FILES core/hpp_swapchain.h core/vulkan_resource.h # Source Files - core/instance.cpp - core/physical_device.cpp - core/device.cpp + core/command_pool_base.cpp core/debug.cpp core/image_core.cpp core/shader_module.cpp @@ -286,27 +265,19 @@ set(CORE_FILES core/descriptor_pool.cpp core/descriptor_set.cpp core/queue.cpp - core/command_pool.cpp core/swapchain.cpp - core/command_buffer.cpp core/allocated.cpp core/image_core.cpp core/image_view.cpp core/sampled_image.cpp - core/instance.cpp core/sampler_core.cpp core/framebuffer.cpp core/render_pass.cpp core/query_pool.cpp core/acceleration_structure.cpp - core/hpp_command_buffer.cpp - core/hpp_command_pool.cpp core/hpp_debug.cpp - core/hpp_device.cpp core/hpp_image_core.cpp core/hpp_image_view.cpp - core/hpp_instance.cpp - core/hpp_physical_device.cpp core/hpp_pipeline_layout.cpp core/hpp_queue.cpp core/hpp_sampler.cpp @@ -320,7 +291,6 @@ set(PLATFORM_FILES platform/window.h platform/input_events.h platform/configuration.h - platform/parser.h platform/headless_window.h platform/plugins/plugin.h platform/plugins/plugin_base.h @@ -332,7 +302,6 @@ set(PLATFORM_FILES platform/window.cpp platform/input_events.cpp platform/configuration.cpp - platform/parser.cpp platform/plugins/plugin.cpp) set(GLFW_FILES @@ -342,15 +311,6 @@ set(GLFW_FILES platform/glfw_window.cpp ) -set(PARSER_FILES - # Header Files - platform/parsers/CLI11.h - platform/parsers/help_formatter.h - # Source Files - platform/parsers/CLI11.cpp - platform/parsers/help_formatter.cpp -) - set(ANDROID_FILES # Header Files platform/android/android_platform.h @@ -393,7 +353,6 @@ source_group("\\" FILES ${FRAMEWORK_FILES}) source_group("common\\" FILES ${COMMON_FILES}) source_group("platform\\" FILES ${PLATFORM_FILES}) source_group("platform\\" FILES ${GLFW_FILES}) -source_group("platform\\parsers" FILES ${PARSER_FILES}) source_group("platform\\windows" FILES ${WINDOWS_FILES}) source_group("platform\\android" FILES ${ANDROID_FILES}) source_group("platform\\ios" FILES ${IOS_FILES}) @@ -410,7 +369,6 @@ source_group("stats\\" FILES ${STATS_FILES}) set(PROJECT_FILES ${PLATFORM_FILES} - ${PARSER_FILES} ${COMMON_FILES} ${FRAMEWORK_FILES} ${CORE_FILES} @@ -526,14 +484,9 @@ target_link_libraries(${PROJECT_NAME} PUBLIC imgui tinygltf glm - glslang - SPIRV vma spirv-cross-glsl - glslang-default-resource-limits spdlog - ctpl - CLI11::CLI11 plugins) if(${NEED_LINK_ATOMIC}) diff --git a/framework/README.adoc b/framework/README.adoc index e9e8a33c06..8d8471847b 100644 --- a/framework/README.adoc +++ b/framework/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Sascha Willems +- Copyright (c) 2023-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -75,7 +75,7 @@ There is no need to manually get extension pointer functions. === Changing the Vulkan api version -By default all samples create a Vulkan 1.0 instance. +By default all samples create a Vulkan 1.1 instance. Higher versions can be requested in the constructor of a sample: [,cpp] diff --git a/framework/api_vulkan_sample.cpp b/framework/api_vulkan_sample.cpp index 934c5744fb..3125ed0588 100644 --- a/framework/api_vulkan_sample.cpp +++ b/framework/api_vulkan_sample.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -26,6 +26,9 @@ #include "scene_graph/components/sub_mesh.h" #include "scene_graph/components/texture.h" +#define VMA_IMPLEMENTATION +#include + bool ApiVulkanSample::prepare(const vkb::ApplicationOptions &options) { if (!VulkanSample::prepare(options)) @@ -35,6 +38,10 @@ bool ApiVulkanSample::prepare(const vkb::ApplicationOptions &options) depth_format = vkb::get_suitable_depth_format(get_device().get_gpu().get_handle()); + // Update width and height from surface extent to reflect command line arguments + width = get_render_context().get_surface_extent().width; + height = get_render_context().get_surface_extent().height; + // Create synchronization objects VkSemaphoreCreateInfo semaphore_create_info = vkb::initializers::semaphore_create_info(); // Create a semaphore used to synchronize image presentation @@ -55,7 +62,7 @@ bool ApiVulkanSample::prepare(const vkb::ApplicationOptions &options) submit_info.signalSemaphoreCount = 1; submit_info.pSignalSemaphores = &semaphores.render_complete; - queue = get_device().get_suitable_graphics_queue().get_handle(); + queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0).get_handle(); create_swapchain_buffers(); create_command_pool(); @@ -66,9 +73,6 @@ bool ApiVulkanSample::prepare(const vkb::ApplicationOptions &options) create_pipeline_cache(); setup_framebuffer(); - width = get_render_context().get_surface_extent().width; - height = get_render_context().get_surface_extent().height; - prepare_gui(); return true; @@ -78,8 +82,8 @@ void ApiVulkanSample::prepare_gui() { create_gui(*window, nullptr, 15.0f, true); get_gui().prepare(pipeline_cache, render_pass, - {load_shader("uioverlay/uioverlay.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("uioverlay/uioverlay.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}); + {load_shader("uioverlay/uioverlay.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("uioverlay/uioverlay.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}); } void ApiVulkanSample::update(float delta_time) @@ -90,6 +94,7 @@ void ApiVulkanSample::update(float delta_time) view_changed(); } + assert(has_render_context()); render(delta_time); camera.update(delta_time); if (camera.moving()) @@ -424,12 +429,12 @@ void ApiVulkanSample::create_pipeline_cache() VK_CHECK(vkCreatePipelineCache(get_device().get_handle(), &pipeline_cache_create_info, nullptr, &pipeline_cache)); } -VkPipelineShaderStageCreateInfo ApiVulkanSample::load_shader(const std::string &file, VkShaderStageFlagBits stage, vkb::ShaderSourceLanguage src_language) +VkPipelineShaderStageCreateInfo ApiVulkanSample::load_shader(const std::string &file, VkShaderStageFlagBits stage) { VkPipelineShaderStageCreateInfo shader_stage = {}; shader_stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stage.stage = stage; - shader_stage.module = vkb::load_shader(file.c_str(), get_device().get_handle(), stage, src_language); + shader_stage.module = vkb::load_shader(file.c_str(), get_device().get_handle(), stage); shader_stage.pName = "main"; assert(shader_stage.module != VK_NULL_HANDLE); shader_modules.push_back(shader_stage.module); @@ -438,27 +443,12 @@ VkPipelineShaderStageCreateInfo ApiVulkanSample::load_shader(const std::string & VkPipelineShaderStageCreateInfo ApiVulkanSample::load_shader(const std::string &sample_folder_name, const std::string &shader_filename, VkShaderStageFlagBits stage) { - // Note: this can be reworked once offline compilation for GLSL shaders is added - - // Default to GLSL - std::string shader_folder{"glsl"}; - std::string shader_extension{""}; - vkb::ShaderSourceLanguage src_language = vkb::ShaderSourceLanguage::GLSL; - - if (get_shading_language() == vkb::ShadingLanguage::HLSL) - { - shader_folder = "hlsl"; - // HLSL shaders are offline compiled to SPIR-V, so source is SPV - src_language = vkb::ShaderSourceLanguage::SPV; - shader_extension = ".spv"; - } - - std::string full_file_name = sample_folder_name + "/" + shader_folder + "/" + shader_filename + shader_extension; + std::string full_file_name = sample_folder_name + "/" + get_shader_folder() + "/" + shader_filename; VkPipelineShaderStageCreateInfo shader_stage = {}; shader_stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stage.stage = stage; - shader_stage.module = vkb::load_shader(full_file_name, get_device().get_handle(), stage, src_language); + shader_stage.module = vkb::load_shader(full_file_name, get_device().get_handle(), stage); shader_stage.pName = "main"; assert(shader_stage.module != VK_NULL_HANDLE); shader_modules.push_back(shader_stage.module); @@ -543,7 +533,7 @@ void ApiVulkanSample::submit_frame() present_info.pImageIndices = ¤t_buffer; VkDisplayPresentInfoKHR disp_present_info{}; - if (get_device().is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && + if (get_device().get_gpu().is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && window->get_display_present_info(&disp_present_info, width, height)) { // Add display present info if supported and wanted @@ -678,7 +668,7 @@ void ApiVulkanSample::setup_depth_stencil() VkMemoryAllocateInfo memory_allocation{}; memory_allocation.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; memory_allocation.allocationSize = memReqs.size; - memory_allocation.memoryTypeIndex = get_device().get_memory_type(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation.memoryTypeIndex = get_device().get_gpu().get_memory_type(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation, nullptr, &depth_stencil.mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), depth_stencil.image, depth_stencil.mem, 0)); @@ -968,8 +958,10 @@ void ApiVulkanSample::handle_surface_changes() get_render_context().get_swapchain().get_surface(), &surface_properties)); - if (surface_properties.currentExtent.width != get_render_context().get_surface_extent().width || - surface_properties.currentExtent.height != get_render_context().get_surface_extent().height) + if ((surface_properties.currentExtent.width != get_render_context().get_surface_extent().width || + surface_properties.currentExtent.height != get_render_context().get_surface_extent().height) && + (surface_properties.currentExtent.width != 0xFFFFFFFF && + surface_properties.currentExtent.height != 0xFFFFFFFF)) { resize(surface_properties.currentExtent.width, surface_properties.currentExtent.height); } @@ -1344,13 +1336,13 @@ void ApiVulkanSample::with_command_buffer(const std::function &f) +void ApiVulkanSample::with_vkb_command_buffer(const std::function &f) { - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); - f(cmd); - cmd.end(); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + f(*cmd); + cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(cmd, get_device().request_fence()); + queue.submit(*cmd, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); } diff --git a/framework/api_vulkan_sample.h b/framework/api_vulkan_sample.h index ba6d704d32..2ba759e5d3 100644 --- a/framework/api_vulkan_sample.h +++ b/framework/api_vulkan_sample.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -58,7 +59,7 @@ struct SwapchainBuffer struct Texture { std::unique_ptr image; - VkSampler sampler; + VkSampler sampler = VK_NULL_HANDLE; }; /** @@ -147,7 +148,7 @@ class ApiVulkanSample : public vkb::VulkanSampleC std::vector draw_cmd_buffers; // Global render pass for frame buffer writes - VkRenderPass render_pass; + VkRenderPass render_pass = VK_NULL_HANDLE; // List of available frame buffers (same as number of swap chain images) std::vector framebuffers; @@ -257,7 +258,7 @@ class ApiVulkanSample : public vkb::VulkanSampleC * @brief Synchronously execute a block code within a command buffer vkb wrapper, then submit the command buffer and wait for completion. * @param f a block of code which is passed a command buffer which is already in the begin state. */ - void with_vkb_command_buffer(const std::function &f); + void with_vkb_command_buffer(const std::function &f); public: /** @@ -292,7 +293,7 @@ class ApiVulkanSample : public vkb::VulkanSampleC /** * @brief Creates a new (graphics) command pool object storing command buffers */ - void create_command_pool(); + virtual void create_command_pool(); /** * @brief Setup default depth and stencil views @@ -346,9 +347,8 @@ class ApiVulkanSample : public vkb::VulkanSampleC * @brief Load a SPIR-V shader * @param file The file location of the shader relative to the shaders folder * @param stage The shader stage - * @param src_language The shader language */ - VkPipelineShaderStageCreateInfo load_shader(const std::string &file, VkShaderStageFlagBits stage, vkb::ShaderSourceLanguage src_language = vkb::ShaderSourceLanguage::GLSL); + VkPipelineShaderStageCreateInfo load_shader(const std::string &file, VkShaderStageFlagBits stage); /** * @brief Load a SPIR-V shader based on current shader language selection @@ -439,11 +439,11 @@ class ApiVulkanSample : public vkb::VulkanSampleC std::string title = "Vulkan Example"; std::string name = "vulkanExample"; - struct + struct ImageData { - VkImage image; - VkDeviceMemory mem; - VkImageView view; + VkImage image{VK_NULL_HANDLE}; + VkDeviceMemory mem{VK_NULL_HANDLE}; + VkImageView view{VK_NULL_HANDLE}; } depth_stencil; struct diff --git a/framework/buffer_pool.h b/framework/buffer_pool.h index e9f2b3e06e..89b3e0cd71 100644 --- a/framework/buffer_pool.h +++ b/framework/buffer_pool.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,9 @@ #pragma once +#include "common/helpers.h" #include "core/buffer.h" #include "core/device.h" -#include "core/hpp_device.h" namespace vkb { @@ -36,9 +36,9 @@ class BufferAllocation public: BufferAllocation() = default; - BufferAllocation(const BufferAllocation &) = delete; + BufferAllocation(const BufferAllocation &) = default; BufferAllocation(BufferAllocation &&) = default; - BufferAllocation &operator=(const BufferAllocation &) = delete; + BufferAllocation &operator=(const BufferAllocation &) = default; BufferAllocation &operator=(BufferAllocation &&) = default; BufferAllocation(vkb::core::Buffer &buffer, DeviceSizeType size, DeviceSizeType offset); @@ -152,8 +152,6 @@ class BufferBlock using BufferUsageFlagsType = typename std::conditional::type; using DeviceSizeType = typename std::conditional::type; - using DeviceType = typename std::conditional::type; - public: BufferBlock() = delete; BufferBlock(BufferBlock const &rhs) = delete; @@ -161,7 +159,7 @@ class BufferBlock BufferBlock &operator=(BufferBlock const &rhs) = delete; BufferBlock &operator=(BufferBlock &&rhs) = default; - BufferBlock(DeviceType &device, DeviceSizeType size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage); + BufferBlock(vkb::core::Device &device, DeviceSizeType size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage); /** * @return An usable view on a portion of the underlying buffer @@ -196,7 +194,7 @@ using BufferBlockC = BufferBlock; using BufferBlockCpp = BufferBlock; template -BufferBlock::BufferBlock(DeviceType &device, DeviceSizeType size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage) : +BufferBlock::BufferBlock(vkb::core::Device &device, DeviceSizeType size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage) : buffer{device, size, usage, memory_usage} { if constexpr (bindingType == BindingType::Cpp) @@ -307,17 +305,16 @@ class BufferPool using BufferUsageFlagsType = typename std::conditional::type; using DeviceSizeType = typename std::conditional::type; - using DeviceType = typename std::conditional::type; - public: - BufferPool(DeviceType &device, DeviceSizeType block_size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU); + BufferPool( + vkb::core::Device &device, DeviceSizeType block_size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU); BufferBlock &request_buffer_block(DeviceSizeType minimum_size, bool minimal = false); void reset(); private: - vkb::core::HPPDevice &device; + vkb::core::DeviceCpp &device; std::vector> buffer_blocks; /// List of blocks requested (need to be pointers in order to keep their address constant on vector resizing) vk::DeviceSize block_size = 0; /// Minimum size of the blocks vk::BufferUsageFlags usage; @@ -328,8 +325,11 @@ using BufferPoolC = BufferPool; using BufferPoolCpp = BufferPool; template -BufferPool::BufferPool(DeviceType &device, DeviceSizeType block_size, BufferUsageFlagsType usage, VmaMemoryUsage memory_usage) : - device{reinterpret_cast(device)}, block_size{block_size}, usage{usage}, memory_usage{memory_usage} +BufferPool::BufferPool(vkb::core::Device &device, + DeviceSizeType block_size, + BufferUsageFlagsType usage, + VmaMemoryUsage memory_usage) : + device{reinterpret_cast(device)}, block_size{block_size}, usage{usage}, memory_usage{memory_usage} { } @@ -337,12 +337,10 @@ template BufferBlock &BufferPool::request_buffer_block(DeviceSizeType minimum_size, bool minimal) { // Find a block in the range of the blocks which can fit the minimum size - auto it = minimal ? std::find_if(buffer_blocks.begin(), - buffer_blocks.end(), - [&minimum_size](auto const &buffer_block) { return (buffer_block->get_size() == minimum_size) && buffer_block->can_allocate(minimum_size); }) : - std::find_if(buffer_blocks.begin(), - buffer_blocks.end(), - [&minimum_size](auto const &buffer_block) { return buffer_block->can_allocate(minimum_size); }); + auto it = minimal ? std::ranges::find_if(buffer_blocks, + [&minimum_size](auto const &buffer_block) { return (buffer_block->get_size() == minimum_size) && buffer_block->can_allocate(minimum_size); }) : + std::ranges::find_if(buffer_blocks, + [&minimum_size](auto const &buffer_block) { return buffer_block->can_allocate(minimum_size); }); if (it == buffer_blocks.end()) { diff --git a/framework/builder_base.h b/framework/builder_base.h index b70cb7b1db..bc84f4700a 100644 --- a/framework/builder_base.h +++ b/framework/builder_base.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Bradley Austin Davis. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2025, Bradley Austin Davis. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,6 +24,54 @@ namespace vkb { + +namespace allocated +{ + +/** + * @brief Many Vulkan resource types (most notably Images and to a lesser extent Buffers) + * and and their corresponding memory allocations have many parameters that need to be setup + * when creating them. Although many of these have reasonable defaults, constructors with + * numerous arguments, some or all of which may have default arguments, aren't well suited + * to partial customization. This is a common failing of languages that don't support named + * arguments and has led to the common use of the [builder pattern](https://en.wikipedia.org/wiki/Builder_pattern), + * where a helper class is used to store all the options that can be tweaked for an object + * when it's created. A builder class will have reasonable defaults where appropriate and only + * require arguments for the builder constructor when a value is always required for creation to occur + * (for example, the size of a buffer or the extent of an image). Remaining parameters can be set + * with methods on the builder class, which return a reference to the builder object, allowing + * chaining of the method calls. + * + * This builder class serves as a base containing options that are common to all + * [VMA](https://gpuopen.com/vulkan-memory-allocator/) allocated and managed resources. + * For instance, the VMA create and usage flags are set here, but the image or buffer + * usage flags are handled in the derived builder classes specific to those types. + * + * The following is an example of how the builder pattern is used in the codebase: + ```cpp + vkb::core::ImageBuilder(VkExtent3D{grid_width, grid_height, 1}) + .with_format(VK_FORMAT_R8G8B8A8_UNORM) + .with_usage(VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT) + .with_vma_usage(VMA_MEMORY_USAGE_GPU_ONLY) + .with_sample_count(VK_SAMPLE_COUNT_1_BIT) + .with_mip_levels(1) + .with_array_layers(1) + .with_tiling(VK_IMAGE_TILING_OPTIMAL) + .with_queue_families(static_cast(queue_families.size()), queue_families.data()) + .with_sharing_mode(sharing_mode)); + ``` + * The actual image can be created with `build()` which returns a `vkb::core::Image` or `buildPtr` which returns a `std::unique_ptr`. + * Alternatively, the builder can be used as an argument to the `Image` constructor, which will build the image for you in place. + * @note The builder pattern is intended to displace the currently used `vkb::core::Image` and `vkb::core::Buffer` constructors with numerous + * arguments, but this is a work in progress and not currently in wide use in the codebase. + * + * @tparam BuilderType Allow the same builder base class to be used + * with a variety of subclasses while using casting to return the corect dervied type + * from the modifier methods. + * @tparam bindingType A flag indicating whether this is being used with the C or C++ API + * @tparam CreateInfoType The type of the Vulkan create info structure. Either a `VkSomethingCreateInfo` + * or `vk::SomethingCreateInfo` for the C or C++ API respectively. + */ template class BuilderBase { @@ -69,8 +117,8 @@ template using BuilderBaseCpp = BuilderBase; template -inline BuilderBase::BuilderBase(const CreateInfoType &create_info) : - create_info(create_info) +inline BuilderBase::BuilderBase(const CreateInfoType &create_info_) : + create_info{reinterpret_cast(create_info_)} { alloc_create_info.usage = VMA_MEMORY_USAGE_AUTO; }; @@ -211,4 +259,5 @@ inline BuilderType &BuilderBase::with_ return *static_cast(this); } +} // namespace allocated } // namespace vkb diff --git a/framework/camera_core.cpp b/framework/camera_core.cpp index 1212441919..05a2261cf7 100644 --- a/framework/camera_core.cpp +++ b/framework/camera_core.cpp @@ -63,11 +63,13 @@ void Camera::set_perspective(float fov, float aspect, float znear, float zfar) this->znear = znear; this->zfar = zfar; matrices.perspective = glm::perspective(glm::radians(fov), aspect, znear, zfar); + updated = true; } void Camera::update_aspect_ratio(float aspect) { matrices.perspective = glm::perspective(glm::radians(fov), aspect, znear, zfar); + updated = true; } void Camera::set_position(const glm::vec3 &position) diff --git a/framework/common/hpp_resource_caching.h b/framework/common/hpp_resource_caching.h index d691f8657f..65ed958d55 100644 --- a/framework/common/hpp_resource_caching.h +++ b/framework/common/hpp_resource_caching.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,8 +17,14 @@ #pragma once +#include "common/hpp_vk_common.h" +#include "core/hpp_descriptor_set.h" +#include "core/hpp_image_view.h" +#include "core/hpp_render_pass.h" +#include "core/hpp_shader_module.h" +#include "hpp_resource_record.h" +#include "rendering/hpp_render_target.h" #include "resource_caching.h" -#include #include namespace std @@ -352,7 +358,7 @@ struct HPPRecordHelper } // namespace template -T &request_resource(vkb::core::HPPDevice &device, vkb::HPPResourceRecord *recorder, std::unordered_map &resources, A &...args) +T &request_resource(vkb::core::DeviceCpp &device, vkb::HPPResourceRecord *recorder, std::unordered_map &resources, A &...args) { HPPRecordHelper record_helper; diff --git a/framework/common/hpp_utils.h b/framework/common/hpp_utils.h index b8ec44d8c0..0c0b306936 100644 --- a/framework/common/hpp_utils.h +++ b/framework/common/hpp_utils.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,10 +17,8 @@ #pragma once -#include - -#include -#include +#include "common/utils.h" +#include "scene_graph/hpp_scene.h" /** * @brief facade helper functions around the functions in common/utils.h, providing a vulkan.hpp-based interface @@ -29,14 +27,15 @@ namespace vkb { namespace common { -inline sg::Node &add_free_camera(vkb::scene_graph::HPPScene &scene, const std::string &node_name, vk::Extent2D const &extent) +inline vkb::scene_graph::NodeCpp &add_free_camera(vkb::scene_graph::HPPScene &scene, const std::string &node_name, vk::Extent2D const &extent) { - return vkb::add_free_camera(reinterpret_cast(scene), node_name, static_cast(extent)); + return reinterpret_cast( + vkb::add_free_camera(reinterpret_cast(scene), node_name, static_cast(extent))); } -inline void screenshot(vkb::rendering::HPPRenderContext &render_context, const std::string &filename) +inline void screenshot(vkb::rendering::RenderContextCpp &render_context, const std::string &filename) { - vkb::screenshot(reinterpret_cast(render_context), filename); + vkb::screenshot(reinterpret_cast(render_context), filename); } } // namespace common } // namespace vkb diff --git a/framework/common/hpp_vk_common.h b/framework/common/hpp_vk_common.h index 3ea176ea03..23db9ad819 100644 --- a/framework/common/hpp_vk_common.h +++ b/framework/common/hpp_vk_common.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -47,8 +47,8 @@ struct HPPImageMemoryBarrier vk::AccessFlags dst_access_mask; vk::ImageLayout old_layout = vk::ImageLayout::eUndefined; vk::ImageLayout new_layout = vk::ImageLayout::eUndefined; - uint32_t old_queue_family = VK_QUEUE_FAMILY_IGNORED; - uint32_t new_queue_family = VK_QUEUE_FAMILY_IGNORED; + uint32_t src_queue_family = VK_QUEUE_FAMILY_IGNORED; + uint32_t dst_queue_family = VK_QUEUE_FAMILY_IGNORED; }; struct HPPLoadStoreInfo @@ -102,9 +102,9 @@ inline bool is_dynamic_buffer_descriptor_type(vk::DescriptorType descriptor_type return vkb::is_dynamic_buffer_descriptor_type(static_cast(descriptor_type)); } -inline vk::ShaderModule load_shader(const std::string &filename, vk::Device device, vk::ShaderStageFlagBits stage, ShaderSourceLanguage src_language = ShaderSourceLanguage::GLSL) +inline vk::ShaderModule load_shader(const std::string &filename, vk::Device device, vk::ShaderStageFlagBits stage) { - return static_cast(vkb::load_shader(filename, device, static_cast(stage), src_language)); + return static_cast(vkb::load_shader(filename, device, static_cast(stage))); } inline void image_layout_transition(vk::CommandBuffer command_buffer, @@ -152,6 +152,26 @@ inline void image_layout_transition(vk::CommandBuffer command_buf static_cast(subresource_range)); } +inline void make_filters_valid(vk::PhysicalDevice physical_device, vk::Format format, vk::Filter *filter, vk::SamplerMipmapMode *mipmapMode = nullptr) +{ + // Not all formats support linear filtering, so we need to adjust them if they don't + if (*filter == vk::Filter::eNearest && (mipmapMode == nullptr || *mipmapMode == vk::SamplerMipmapMode::eNearest)) + { + return; // These must already be valid + } + + vk::FormatProperties properties = physical_device.getFormatProperties(format); + + if (!(properties.optimalTilingFeatures & vk::FormatFeatureFlagBits::eSampledImageFilterLinear)) + { + *filter = vk::Filter::eNearest; + if (mipmapMode) + { + *mipmapMode = vk::SamplerMipmapMode::eNearest; + } + } +} + inline vk::SurfaceFormatKHR select_surface_format(vk::PhysicalDevice gpu, vk::SurfaceKHR surface, std::vector const &preferred_formats = { @@ -160,13 +180,11 @@ inline vk::SurfaceFormatKHR select_surface_format(vk::PhysicalDevice std::vector supported_surface_formats = gpu.getSurfaceFormatsKHR(surface); assert(!supported_surface_formats.empty()); - auto it = std::find_if(supported_surface_formats.begin(), - supported_surface_formats.end(), - [&preferred_formats](vk::SurfaceFormatKHR surface_format) { - return std::any_of(preferred_formats.begin(), - preferred_formats.end(), - [&surface_format](vk::Format format) { return format == surface_format.format; }); - }); + auto it = std::ranges::find_if(supported_surface_formats, + [&preferred_formats](vk::SurfaceFormatKHR surface_format) { + return std::ranges::any_of(preferred_formats, + [&surface_format](vk::Format format) { return format == surface_format.format; }); + }); // We use the first supported format as a fallback in case none of the preferred formats is available return it != supported_surface_formats.end() ? *it : supported_surface_formats[0]; @@ -185,26 +203,41 @@ inline vk::Format choose_blendable_format(vk::PhysicalDevice gpu, const std::vec throw std::runtime_error("No suitable blendable format could be determined"); } +inline vk::ImageCompressionPropertiesEXT query_applied_compression(vk::Device device, vk::Image image) +{ + vk::ImageSubresource2EXT image_subresource{ + .imageSubresource = {.aspectMask = vk::ImageAspectFlagBits::eColor, .mipLevel = 0, .arrayLayer = 0}}; + + auto imageSubresourceLayout = device.getImageSubresourceLayout2EXT(image, image_subresource); + + return imageSubresourceLayout.get(); +} + // helper functions not backed by vk_common.h -inline vk::CommandBuffer allocate_command_buffer(vk::Device device, vk::CommandPool command_pool, vk::CommandBufferLevel level = vk::CommandBufferLevel::ePrimary) +inline vk::CommandBuffer + allocate_command_buffer(vk::Device device, vk::CommandPool command_pool, vk::CommandBufferLevel level = vk::CommandBufferLevel::ePrimary) { - vk::CommandBufferAllocateInfo command_buffer_allocate_info(command_pool, level, 1); + vk::CommandBufferAllocateInfo command_buffer_allocate_info{.commandPool = command_pool, .level = level, .commandBufferCount = 1}; return device.allocateCommandBuffers(command_buffer_allocate_info).front(); } inline vk::DescriptorSet allocate_descriptor_set(vk::Device device, vk::DescriptorPool descriptor_pool, vk::DescriptorSetLayout descriptor_set_layout) { -#if defined(ANDROID) - vk::DescriptorSetAllocateInfo descriptor_set_allocate_info(descriptor_pool, 1, &descriptor_set_layout); -#else - vk::DescriptorSetAllocateInfo descriptor_set_allocate_info(descriptor_pool, descriptor_set_layout); -#endif + vk::DescriptorSetAllocateInfo descriptor_set_allocate_info{.descriptorPool = descriptor_pool, + .descriptorSetCount = 1, + .pSetLayouts = &descriptor_set_layout}; return device.allocateDescriptorSets(descriptor_set_allocate_info).front(); } -inline vk::Framebuffer create_framebuffer(vk::Device device, vk::RenderPass render_pass, std::vector const &attachments, vk::Extent2D const &extent) +inline vk::Framebuffer + create_framebuffer(vk::Device device, vk::RenderPass render_pass, std::vector const &attachments, vk::Extent2D const &extent) { - vk::FramebufferCreateInfo framebuffer_create_info({}, render_pass, attachments, extent.width, extent.height, 1); + vk::FramebufferCreateInfo framebuffer_create_info{.renderPass = render_pass, + .attachmentCount = static_cast(attachments.size()), + .pAttachments = attachments.data(), + .width = extent.width, + .height = extent.height, + .layers = 1}; return device.createFramebuffer(framebuffer_create_info); } @@ -222,42 +255,39 @@ inline vk::Pipeline create_graphics_pipeline(vk::Device vk::PipelineLayout pipeline_layout, vk::RenderPass render_pass) { - vk::PipelineInputAssemblyStateCreateInfo input_assembly_state({}, primitive_topology, false); + vk::PipelineInputAssemblyStateCreateInfo input_assembly_state{.topology = primitive_topology}; - vk::PipelineTessellationStateCreateInfo tessellation_state({}, patch_control_points); + vk::PipelineTessellationStateCreateInfo tessellation_state{.patchControlPoints = patch_control_points}; - vk::PipelineViewportStateCreateInfo viewport_state({}, 1, nullptr, 1, nullptr); + vk::PipelineViewportStateCreateInfo viewport_state{.viewportCount = 1, .scissorCount = 1}; - vk::PipelineRasterizationStateCreateInfo rasterization_state; - rasterization_state.polygonMode = polygon_mode; - rasterization_state.cullMode = cull_mode; - rasterization_state.frontFace = front_face; - rasterization_state.lineWidth = 1.0f; + vk::PipelineRasterizationStateCreateInfo rasterization_state{ + .polygonMode = polygon_mode, .cullMode = cull_mode, .frontFace = front_face, .lineWidth = 1.0f}; - vk::PipelineMultisampleStateCreateInfo multisample_state({}, vk::SampleCountFlagBits::e1); + vk::PipelineMultisampleStateCreateInfo multisample_state{.rasterizationSamples = vk::SampleCountFlagBits::e1}; - vk::PipelineColorBlendStateCreateInfo color_blend_state({}, false, {}, blend_attachment_states); + vk::PipelineColorBlendStateCreateInfo color_blend_state{.attachmentCount = static_cast(blend_attachment_states.size()), + .pAttachments = blend_attachment_states.data()}; std::array dynamic_state_enables = {vk::DynamicState::eViewport, vk::DynamicState::eScissor}; - vk::PipelineDynamicStateCreateInfo dynamic_state({}, dynamic_state_enables); + vk::PipelineDynamicStateCreateInfo dynamic_state{.dynamicStateCount = static_cast(dynamic_state_enables.size()), + .pDynamicStates = dynamic_state_enables.data()}; // Final fullscreen composition pass pipeline - vk::GraphicsPipelineCreateInfo pipeline_create_info({}, - shader_stages, - &vertex_input_state, - &input_assembly_state, - &tessellation_state, - &viewport_state, - &rasterization_state, - &multisample_state, - &depth_stencil_state, - &color_blend_state, - &dynamic_state, - pipeline_layout, - render_pass, - {}, - {}, - -1); + vk::GraphicsPipelineCreateInfo pipeline_create_info{.stageCount = static_cast(shader_stages.size()), + .pStages = shader_stages.data(), + .pVertexInputState = &vertex_input_state, + .pInputAssemblyState = &input_assembly_state, + .pTessellationState = &tessellation_state, + .pViewportState = &viewport_state, + .pRasterizationState = &rasterization_state, + .pMultisampleState = &multisample_state, + .pDepthStencilState = &depth_stencil_state, + .pColorBlendState = &color_blend_state, + .pDynamicState = &dynamic_state, + .layout = pipeline_layout, + .renderPass = render_pass, + .basePipelineIndex = -1}; vk::Result result; vk::Pipeline pipeline; @@ -276,24 +306,20 @@ inline vk::ImageView create_image_view(vk::Device device, uint32_t base_array_layer = 0, uint32_t layer_count = 1) { - vk::ImageViewCreateInfo image_view_create_info; - image_view_create_info.image = image; - image_view_create_info.viewType = view_type; - image_view_create_info.format = format; - image_view_create_info.subresourceRange.aspectMask = aspect_mask; - image_view_create_info.subresourceRange.baseMipLevel = base_mip_level; - image_view_create_info.subresourceRange.levelCount = level_count; - image_view_create_info.subresourceRange.baseArrayLayer = base_array_layer; - image_view_create_info.subresourceRange.layerCount = layer_count; + vk::ImageViewCreateInfo image_view_create_info{.image = image, + .viewType = view_type, + .format = format, + .subresourceRange = {.aspectMask = aspect_mask, + .baseMipLevel = base_mip_level, + .levelCount = level_count, + .baseArrayLayer = base_array_layer, + .layerCount = layer_count}}; return device.createImageView(image_view_create_info); } inline vk::QueryPool create_query_pool(vk::Device device, vk::QueryType query_type, uint32_t query_count, vk::QueryPipelineStatisticFlags pipeline_statistics = {}) { - vk::QueryPoolCreateInfo query_pool_create_info; - query_pool_create_info.queryType = query_type; - query_pool_create_info.queryCount = query_count; - query_pool_create_info.pipelineStatistics = pipeline_statistics; + vk::QueryPoolCreateInfo query_pool_create_info{.queryType = query_type, .queryCount = query_count, .pipelineStatistics = pipeline_statistics}; return device.createQueryPool(query_pool_create_info); } @@ -305,21 +331,18 @@ inline vk::Sampler create_sampler(vk::Device device, float max_anisotropy, float max_LOD) { - vk::SamplerCreateInfo sampler_create_info({}, - mag_filter, - min_filter, - mipmap_mode, - sampler_address_mode, - sampler_address_mode, - sampler_address_mode, - 0.0f, - (1.0f < max_anisotropy), - max_anisotropy, - false, - vk::CompareOp::eNever, - 0.0f, - max_LOD, - vk::BorderColor::eFloatOpaqueWhite); + vk::SamplerCreateInfo sampler_create_info{.magFilter = mag_filter, + .minFilter = min_filter, + .mipmapMode = mipmap_mode, + .addressModeU = sampler_address_mode, + .addressModeV = sampler_address_mode, + .addressModeW = sampler_address_mode, + .anisotropyEnable = (1.0f < max_anisotropy), + .maxAnisotropy = max_anisotropy, + .compareOp = vk::CompareOp::eNever, + .minLod = 0.0f, + .maxLod = max_LOD, + .borderColor = vk::BorderColor::eFloatOpaqueWhite}; return device.createSampler(sampler_create_info); } @@ -373,7 +396,10 @@ inline vk::ImageAspectFlags get_image_aspect_flags(vk::ImageUsageFlagBits usage, inline void submit_and_wait(vk::Device device, vk::Queue queue, std::vector command_buffers, std::vector semaphores = {}) { // Submit command_buffer - vk::SubmitInfo submit_info(nullptr, {}, command_buffers, semaphores); + vk::SubmitInfo submit_info{.commandBufferCount = static_cast(command_buffers.size()), + .pCommandBuffers = command_buffers.data(), + .signalSemaphoreCount = static_cast(semaphores.size()), + .pSignalSemaphores = semaphores.data()}; // Create fence to ensure that command_buffer has finished executing vk::Fence fence = device.createFence({}); @@ -393,5 +419,45 @@ inline void submit_and_wait(vk::Device device, vk::Queue queue, std::vector const &queue_family_properties, vk::QueueFlagBits queue_flag) +{ + // Dedicated queue for compute + // Try to find a queue family index that supports compute but not graphics + if (queue_flag & vk::QueueFlagBits::eCompute) + { + auto propertyIt = std::ranges::find_if(queue_family_properties, + [queue_flag](const vk::QueueFamilyProperties &property) { return (property.queueFlags & queue_flag) && !(property.queueFlags & vk::QueueFlagBits::eGraphics); }); + if (propertyIt != queue_family_properties.end()) + { + return static_cast(std::distance(queue_family_properties.begin(), propertyIt)); + } + } + + // Dedicated queue for transfer + // Try to find a queue family index that supports transfer but not graphics and compute + if (queue_flag & vk::QueueFlagBits::eTransfer) + { + auto propertyIt = std::ranges::find_if(queue_family_properties, + [queue_flag](const vk::QueueFamilyProperties &property) { + return (property.queueFlags & queue_flag) && !(property.queueFlags & vk::QueueFlagBits::eGraphics) && + !(property.queueFlags & vk::QueueFlagBits::eCompute); + }); + if (propertyIt != queue_family_properties.end()) + { + return static_cast(std::distance(queue_family_properties.begin(), propertyIt)); + } + } + + // For other queue types or if no separate compute queue is present, return the first one to support the requested flags + auto propertyIt = std::ranges::find_if( + queue_family_properties, [queue_flag](const vk::QueueFamilyProperties &property) { return (property.queueFlags & queue_flag) == queue_flag; }); + if (propertyIt != queue_family_properties.end()) + { + return static_cast(std::distance(queue_family_properties.begin(), propertyIt)); + } + + throw std::runtime_error("Could not find a matching queue family index"); +} + } // namespace common } // namespace vkb diff --git a/framework/common/resource_caching.h b/framework/common/resource_caching.h index a8442d04fb..8e6db2594f 100644 --- a/framework/common/resource_caching.h +++ b/framework/common/resource_caching.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2021, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,6 +21,7 @@ #include "core/descriptor_set.h" #include "core/descriptor_set_layout.h" #include "core/framebuffer.h" +#include "core/image.h" #include "core/pipeline.h" #include "rendering/pipeline_state.h" #include "rendering/render_target.h" @@ -491,7 +492,7 @@ struct hash vkb::hash_combine(result, pipeline_state.get_input_assembly_state().primitive_restart_enable); vkb::hash_combine(result, static_cast::type>(pipeline_state.get_input_assembly_state().topology)); - //VkPipelineViewportStateCreateInfo + // VkPipelineViewportStateCreateInfo vkb::hash_combine(result, pipeline_state.get_viewport_state().viewport_count); vkb::hash_combine(result, pipeline_state.get_viewport_state().scissor_count); @@ -551,7 +552,7 @@ inline void hash_param(size_t & /*seed*/, const VkPipelineCache & /*value*/) template <> inline void hash_param>( - size_t & seed, + size_t &seed, const std::vector &value) { hash_combine(seed, std::string{value.begin(), value.end()}); @@ -559,7 +560,7 @@ inline void hash_param>( template <> inline void hash_param>( - size_t & seed, + size_t &seed, const std::vector &value) { for (auto &attachment : value) @@ -570,7 +571,7 @@ inline void hash_param>( template <> inline void hash_param>( - size_t & seed, + size_t &seed, const std::vector &value) { for (auto &load_store_info : value) @@ -581,7 +582,7 @@ inline void hash_param>( template <> inline void hash_param>( - size_t & seed, + size_t &seed, const std::vector &value) { for (auto &subpass_info : value) @@ -592,7 +593,7 @@ inline void hash_param>( template <> inline void hash_param>( - size_t & seed, + size_t &seed, const std::vector &value) { for (auto &shader_module : value) @@ -603,7 +604,7 @@ inline void hash_param>( template <> inline void hash_param>( - size_t & seed, + size_t &seed, const std::vector &value) { for (auto &resource : value) @@ -614,7 +615,7 @@ inline void hash_param>( template <> inline void hash_param>>( - size_t & seed, + size_t &seed, const std::map> &value) { for (auto &binding_set : value) @@ -631,7 +632,7 @@ inline void hash_param inline void hash_param>>( - size_t & seed, + size_t &seed, const std::map> &value) { for (auto &binding_set : value) @@ -647,7 +648,7 @@ inline void hash_param -inline void hash_param(size_t &seed, const T &first_arg, const Args &... args) +inline void hash_param(size_t &seed, const T &first_arg, const Args &...args) { hash_param(seed, first_arg); @@ -657,7 +658,7 @@ inline void hash_param(size_t &seed, const T &first_arg, const Args &... args) template struct RecordHelper { - size_t record(ResourceRecord & /*recorder*/, A &... /*args*/) + size_t record(ResourceRecord & /*recorder*/, A &.../*args*/) { return 0; } @@ -670,7 +671,7 @@ struct RecordHelper template struct RecordHelper { - size_t record(ResourceRecord &recorder, A &... args) + size_t record(ResourceRecord &recorder, A &...args) { return recorder.register_shader_module(args...); } @@ -684,7 +685,7 @@ struct RecordHelper template struct RecordHelper { - size_t record(ResourceRecord &recorder, A &... args) + size_t record(ResourceRecord &recorder, A &...args) { return recorder.register_pipeline_layout(args...); } @@ -698,7 +699,7 @@ struct RecordHelper template struct RecordHelper { - size_t record(ResourceRecord &recorder, A &... args) + size_t record(ResourceRecord &recorder, A &...args) { return recorder.register_render_pass(args...); } @@ -712,7 +713,7 @@ struct RecordHelper template struct RecordHelper { - size_t record(ResourceRecord &recorder, A &... args) + size_t record(ResourceRecord &recorder, A &...args) { return recorder.register_graphics_pipeline(args...); } @@ -725,7 +726,7 @@ struct RecordHelper } // namespace template -T &request_resource(Device &device, ResourceRecord *recorder, std::unordered_map &resources, A &... args) +T &request_resource(vkb::core::DeviceC &device, ResourceRecord *recorder, std::unordered_map &resources, A &...args) { RecordHelper record_helper; diff --git a/framework/common/tags.h b/framework/common/tags.h index f156ad1a31..23fe0bc9c1 100644 --- a/framework/common/tags.h +++ b/framework/common/tags.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -52,7 +52,7 @@ class Tag static bool has_tag(TagID id) { - return std::find(tags.begin(), tags.end(), id) != tags.end(); + return std::ranges::find(tags, id) != tags.end(); } template diff --git a/framework/common/utils.cpp b/framework/common/utils.cpp index 48a45b64ef..631f4b0327 100644 --- a/framework/common/utils.cpp +++ b/framework/common/utils.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -20,6 +20,8 @@ #include #include +#include "core/command_buffer.h" +#include "rendering/render_frame.h" #include "scene_graph/components/material.h" #include "scene_graph/components/perspective_camera.h" #include "scene_graph/components/sub_mesh.h" @@ -40,7 +42,7 @@ std::string get_extension(const std::string &uri) return uri.substr(dot_pos + 1); } -void screenshot(RenderContext &render_context, const std::string &filename) +void screenshot(vkb::rendering::RenderContextC &render_context, const std::string &filename) { assert(render_context.get_format() == VK_FORMAT_R8G8B8A8_UNORM || render_context.get_format() == VK_FORMAT_B8G8R8A8_UNORM || @@ -64,9 +66,9 @@ void screenshot(RenderContext &render_context, const std::string &filename) const auto &queue = render_context.get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - auto &cmd_buf = render_context.get_device().request_command_buffer(); + auto cmd_buf = render_context.get_device().get_command_pool().request_command_buffer(); - cmd_buf.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + cmd_buf->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); // Enable destination buffer to be written to { @@ -76,7 +78,7 @@ void screenshot(RenderContext &render_context, const std::string &filename) memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; - cmd_buf.buffer_memory_barrier(dst_buffer, 0, dst_size, memory_barrier); + cmd_buf->buffer_memory_barrier(dst_buffer, 0, dst_size, memory_barrier); } // Enable framebuffer image view to be read from @@ -87,12 +89,12 @@ void screenshot(RenderContext &render_context, const std::string &filename) memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; - cmd_buf.image_memory_barrier(src_image_view, memory_barrier); + cmd_buf->image_memory_barrier(src_image_view, memory_barrier); } // Check if framebuffer images are in a BGR format auto bgr_formats = {VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SNORM}; - bool swizzle = std::find(bgr_formats.begin(), bgr_formats.end(), src_image_view.get_format()) != bgr_formats.end(); + bool swizzle = std::ranges::find(bgr_formats, src_image_view.get_format()) != bgr_formats.end(); // Copy framebuffer image memory VkBufferImageCopy image_copy_region{}; @@ -104,7 +106,7 @@ void screenshot(RenderContext &render_context, const std::string &filename) image_copy_region.imageExtent.height = height; image_copy_region.imageExtent.depth = 1; - cmd_buf.copy_image_to_buffer(src_image_view.get_image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_buffer, {image_copy_region}); + cmd_buf->copy_image_to_buffer(src_image_view.get_image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_buffer, {image_copy_region}); // Enable destination buffer to map memory { @@ -114,7 +116,7 @@ void screenshot(RenderContext &render_context, const std::string &filename) memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_HOST_BIT; - cmd_buf.buffer_memory_barrier(dst_buffer, 0, dst_size, memory_barrier); + cmd_buf->buffer_memory_barrier(dst_buffer, 0, dst_size, memory_barrier); } // Revert back the framebuffer image view from transfer to present @@ -125,12 +127,12 @@ void screenshot(RenderContext &render_context, const std::string &filename) memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; - cmd_buf.image_memory_barrier(src_image_view, memory_barrier); + cmd_buf->image_memory_barrier(src_image_view, memory_barrier); } - cmd_buf.end(); + cmd_buf->end(); - queue.submit(cmd_buf, frame.request_fence()); + queue.submit(*cmd_buf, frame.get_fence_pool().request_fence()); queue.wait_idle(); @@ -213,10 +215,15 @@ std::string to_snake_case(const std::string &text) return result.str(); } -sg::Light &add_light(sg::Scene &scene, sg::LightType type, const glm::vec3 &position, const glm::quat &rotation, const sg::LightProperties &props, sg::Node *parent_node) +sg::Light &add_light(sg::Scene &scene, + sg::LightType type, + const glm::vec3 &position, + const glm::quat &rotation, + const sg::LightProperties &props, + vkb::scene_graph::NodeC *parent_node) { auto light_ptr = std::make_unique("light"); - auto node = std::make_unique(-1, "light node"); + auto node = std::make_unique(-1, "light node"); if (parent_node) { @@ -242,22 +249,22 @@ sg::Light &add_light(sg::Scene &scene, sg::LightType type, const glm::vec3 &posi return light; } -sg::Light &add_point_light(sg::Scene &scene, const glm::vec3 &position, const sg::LightProperties &props, sg::Node *parent_node) +sg::Light &add_point_light(sg::Scene &scene, const glm::vec3 &position, const sg::LightProperties &props, vkb::scene_graph::NodeC *parent_node) { return add_light(scene, sg::LightType::Point, position, {}, props, parent_node); } -sg::Light &add_directional_light(sg::Scene &scene, const glm::quat &rotation, const sg::LightProperties &props, sg::Node *parent_node) +sg::Light &add_directional_light(sg::Scene &scene, const glm::quat &rotation, const sg::LightProperties &props, vkb::scene_graph::NodeC *parent_node) { return add_light(scene, sg::LightType::Directional, {}, rotation, props, parent_node); } -sg::Light &add_spot_light(sg::Scene &scene, const glm::vec3 &position, const glm::quat &rotation, const sg::LightProperties &props, sg::Node *parent_node) +sg::Light &add_spot_light(sg::Scene &scene, const glm::vec3 &position, const glm::quat &rotation, const sg::LightProperties &props, vkb::scene_graph::NodeC *parent_node) { return add_light(scene, sg::LightType::Spot, position, rotation, props, parent_node); } -sg::Node &add_free_camera(sg::Scene &scene, const std::string &node_name, VkExtent2D extent) +vkb::scene_graph::NodeC &add_free_camera(sg::Scene &scene, const std::string &node_name, VkExtent2D extent) { auto camera_node = scene.find_node(node_name); @@ -287,4 +294,25 @@ sg::Node &add_free_camera(sg::Scene &scene, const std::string &node_name, VkExte return *camera_node; } +size_t calculate_hash(const std::vector &data) +{ + static_assert(sizeof(data[0]) == 1); + constexpr size_t chunk_size = sizeof(size_t) / sizeof(data[0]); + size_t data_hash = 0; + size_t offset = 0; + + for (; offset + chunk_size < data.size(); offset += chunk_size) + { + glm::detail::hash_combine(data_hash, *reinterpret_cast(&data[offset])); + } + + if (offset < data.size()) + { + size_t it = 0; + std::memcpy(&it, &data[offset], data.size() - offset); + glm::detail::hash_combine(data_hash, it); + } + return data_hash; +} + } // namespace vkb diff --git a/framework/common/utils.h b/framework/common/utils.h index e5b1ff4ef3..a5b68bacad 100644 --- a/framework/common/utils.h +++ b/framework/common/utils.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -36,6 +36,12 @@ namespace vkb * @return The extension */ std::string get_extension(const std::string &uri); +/** + * @brief Generates a hash from an array + * @param data + * @return data_hash hash of the data + */ +size_t calculate_hash(const std::vector &data); /** * @param name String to convert to snake case @@ -43,14 +49,12 @@ std::string get_extension(const std::string &uri); */ std::string to_snake_case(const std::string &name); -class CommandBuffer; - /** * @brief Takes a screenshot of the app by writing the swapchain image to file (slow function) * @param render_context The RenderContext to use * @param filename The name of the file to save the output to */ -void screenshot(RenderContext &render_context, const std::string &filename); +void screenshot(vkb::rendering::RenderContextC &render_context, const std::string &filename); /** * @brief Adds a light to the scene with the specified parameters @@ -62,7 +66,12 @@ void screenshot(RenderContext &render_context, const std::string &filename); * @param parent_node The parent node for the line, defaults to root * @return The newly created light component */ -sg::Light &add_light(sg::Scene &scene, sg::LightType type, const glm::vec3 &position, const glm::quat &rotation = {}, const sg::LightProperties &props = {}, sg::Node *parent_node = nullptr); +sg::Light &add_light(sg::Scene &scene, + sg::LightType type, + const glm::vec3 &position, + const glm::quat &rotation = {}, + const sg::LightProperties &props = {}, + vkb::scene_graph::NodeC *parent_node = nullptr); /** * @brief Adds a point light to the scene with the specified parameters @@ -72,7 +81,8 @@ sg::Light &add_light(sg::Scene &scene, sg::LightType type, const glm::vec3 &posi * @param parent_node The parent node for the line, defaults to root * @return The newly created light component */ -sg::Light &add_point_light(sg::Scene &scene, const glm::vec3 &position, const sg::LightProperties &props = {}, sg::Node *parent_node = nullptr); +sg::Light & + add_point_light(sg::Scene &scene, const glm::vec3 &position, const sg::LightProperties &props = {}, vkb::scene_graph::NodeC *parent_node = nullptr); /** * @brief Adds a directional light to the scene with the specified parameters @@ -82,7 +92,10 @@ sg::Light &add_point_light(sg::Scene &scene, const glm::vec3 &position, const sg * @param parent_node The parent node for the line, defaults to root * @return The newly created light component */ -sg::Light &add_directional_light(sg::Scene &scene, const glm::quat &rotation, const sg::LightProperties &props = {}, sg::Node *parent_node = nullptr); +sg::Light &add_directional_light(sg::Scene &scene, + const glm::quat &rotation, + const sg::LightProperties &props = {}, + vkb::scene_graph::NodeC *parent_node = nullptr); /** * @brief Adds a spot light to the scene with the specified parameters @@ -93,7 +106,11 @@ sg::Light &add_directional_light(sg::Scene &scene, const glm::quat &rotation, co * @param parent_node The parent node for the line, defaults to root * @return The newly created light component */ -sg::Light &add_spot_light(sg::Scene &scene, const glm::vec3 &position, const glm::quat &rotation, const sg::LightProperties &props = {}, sg::Node *parent_node = nullptr); +sg::Light &add_spot_light(sg::Scene &scene, + const glm::vec3 &position, + const glm::quat &rotation, + const sg::LightProperties &props = {}, + vkb::scene_graph::NodeC *parent_node = nullptr); /** * @brief Add free camera script to a node with a camera object. @@ -103,6 +120,6 @@ sg::Light &add_spot_light(sg::Scene &scene, const glm::vec3 &position, const glm * @param extent The initial resolution of the camera * @return Node where the script was attached as component */ -sg::Node &add_free_camera(sg::Scene &scene, const std::string &node_name, VkExtent2D extent); +vkb::scene_graph::NodeC &add_free_camera(sg::Scene &scene, const std::string &node_name, VkExtent2D extent); } // namespace vkb diff --git a/framework/common/vk_common.cpp b/framework/common/vk_common.cpp index 09b3b8df13..5814a3f965 100644 --- a/framework/common/vk_common.cpp +++ b/framework/common/vk_common.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,6 @@ #include #include "filesystem/legacy.h" -#include "glsl_compiler.h" std::ostream &operator<<(std::ostream &os, const VkResult result) { @@ -66,71 +65,6 @@ std::ostream &operator<<(std::ostream &os, const VkResult result) namespace vkb { -namespace -{ -VkShaderStageFlagBits find_shader_stage(const std::string &ext) -{ - if (ext == "vert") - { - return VK_SHADER_STAGE_VERTEX_BIT; - } - else if (ext == "frag") - { - return VK_SHADER_STAGE_FRAGMENT_BIT; - } - else if (ext == "comp") - { - return VK_SHADER_STAGE_COMPUTE_BIT; - } - else if (ext == "geom") - { - return VK_SHADER_STAGE_GEOMETRY_BIT; - } - else if (ext == "tesc") - { - return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; - } - else if (ext == "tese") - { - return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; - } - else if (ext == "rgen") - { - return VK_SHADER_STAGE_RAYGEN_BIT_KHR; - } - else if (ext == "rahit") - { - return VK_SHADER_STAGE_ANY_HIT_BIT_KHR; - } - else if (ext == "rchit") - { - return VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; - } - else if (ext == "rmiss") - { - return VK_SHADER_STAGE_MISS_BIT_KHR; - } - else if (ext == "rint") - { - return VK_SHADER_STAGE_INTERSECTION_BIT_KHR; - } - else if (ext == "rcall") - { - return VK_SHADER_STAGE_CALLABLE_BIT_KHR; - } - else if (ext == "mesh") - { - return VK_SHADER_STAGE_MESH_BIT_EXT; - } - else if (ext == "task") - { - return VK_SHADER_STAGE_TASK_BIT_EXT; - } - - throw std::runtime_error("File extension `" + ext + "` does not have a vulkan shader stage."); -} -} // namespace - bool is_depth_only_format(VkFormat format) { return format == VK_FORMAT_D16_UNORM || @@ -397,39 +331,15 @@ int32_t get_bits_per_pixel(VkFormat format) } } -VkShaderModule load_shader(const std::string &filename, VkDevice device, VkShaderStageFlagBits stage, vkb::ShaderSourceLanguage src_language) +VkShaderModule load_shader(const std::string &filename, VkDevice device, VkShaderStageFlagBits stage) { - vkb::GLSLCompiler glsl_compiler; - - auto buffer = vkb::fs::read_shader_binary(filename); - std::vector spirv; - - if (vkb::ShaderSourceLanguage::GLSL == src_language) - { - std::string file_ext = filename; - - // Extract extension name from the glsl shader file - file_ext = file_ext.substr(file_ext.find_last_of(".") + 1); - - std::string info_log; + auto spirv = vkb::fs::read_shader_binary_u32(filename); + return load_shader_from_vector(spirv, device); +} - // Compile the GLSL source - if (!glsl_compiler.compile_to_spirv(vkb::find_shader_stage(file_ext), buffer, "main", {}, spirv, info_log)) - { - LOGE("Failed to compile shader, Error: {}", info_log.c_str()); - return VK_NULL_HANDLE; - } - } - else if (vkb::ShaderSourceLanguage::SPV == src_language) - { - spirv = std::vector(reinterpret_cast(buffer.data()), - reinterpret_cast(buffer.data()) + buffer.size() / sizeof(uint32_t)); - } - else - { - LOGE("The format is not supported"); - return VK_NULL_HANDLE; - } +VkShaderModule load_shader_from_vector(const std::vector &spirv, VkDevice device) +{ + assert(spirv.size() != 0); VkShaderModule shader_module; VkShaderModuleCreateInfo module_create_info{}; @@ -675,13 +585,11 @@ VkSurfaceFormatKHR select_surface_format(VkPhysicalDevice gpu, VkSurfaceKHR surf std::vector supported_surface_formats(surface_format_count); vkGetPhysicalDeviceSurfaceFormatsKHR(gpu, surface, &surface_format_count, supported_surface_formats.data()); - auto it = std::find_if(supported_surface_formats.begin(), - supported_surface_formats.end(), - [&preferred_formats](VkSurfaceFormatKHR surface_format) { - return std::any_of(preferred_formats.begin(), - preferred_formats.end(), - [&surface_format](VkFormat format) { return format == surface_format.format; }); - }); + auto it = std::ranges::find_if(supported_surface_formats, + [&preferred_formats](VkSurfaceFormatKHR surface_format) { + return std::ranges::any_of(preferred_formats, + [&surface_format](VkFormat format) { return format == surface_format.format; }); + }); // We use the first supported format as a fallback in case none of the preferred formats is available return it != supported_surface_formats.end() ? *it : supported_surface_formats[0]; @@ -774,4 +682,44 @@ std::vector get_clear_value() } } // namespace gbuffer +uint32_t get_queue_family_index(std::vector const &queue_family_properties, VkQueueFlagBits queue_flag) +{ + // Dedicated queue for compute + // Try to find a queue family index that supports compute but not graphics + if (queue_flag & VK_QUEUE_COMPUTE_BIT) + { + auto propertyIt = std::ranges::find_if(queue_family_properties, + [queue_flag](const VkQueueFamilyProperties &property) { return (property.queueFlags & queue_flag) && !(property.queueFlags & VK_QUEUE_GRAPHICS_BIT); }); + if (propertyIt != queue_family_properties.end()) + { + return static_cast(std::distance(queue_family_properties.begin(), propertyIt)); + } + } + + // Dedicated queue for transfer + // Try to find a queue family index that supports transfer but not graphics and compute + if (queue_flag & VK_QUEUE_TRANSFER_BIT) + { + auto propertyIt = std::ranges::find_if(queue_family_properties, + [queue_flag](const VkQueueFamilyProperties &property) { + return (property.queueFlags & queue_flag) && !(property.queueFlags & VK_QUEUE_GRAPHICS_BIT) && + !(property.queueFlags & VK_QUEUE_COMPUTE_BIT); + }); + if (propertyIt != queue_family_properties.end()) + { + return static_cast(std::distance(queue_family_properties.begin(), propertyIt)); + } + } + + // For other queue types or if no separate compute queue is present, return the first one to support the requested flags + auto propertyIt = std::ranges::find_if( + queue_family_properties, [queue_flag](const VkQueueFamilyProperties &property) { return (property.queueFlags & queue_flag) == queue_flag; }); + if (propertyIt != queue_family_properties.end()) + { + return static_cast(std::distance(queue_family_properties.begin(), propertyIt)); + } + + throw std::runtime_error("Could not find a matching queue family index"); +} + } // namespace vkb diff --git a/framework/common/vk_common.h b/framework/common/vk_common.h index 90b2716863..10fe0df2c4 100644 --- a/framework/common/vk_common.h +++ b/framework/common/vk_common.h @@ -1,6 +1,6 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems - * Copyright (c) 2024, Mobica Limited +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2024-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -26,6 +26,7 @@ #include #include +#include "common/error.h" #include #include @@ -47,6 +48,13 @@ enum class BindingType Cpp }; +enum class CommandBufferResetMode +{ + ResetPool, + ResetIndividually, + AlwaysAllocate, +}; + /** * @brief Helper function to determine if a Vulkan format is depth only. * @param format Vulkan format to check. @@ -121,28 +129,29 @@ bool is_buffer_descriptor_type(VkDescriptorType descriptor_type); */ int32_t get_bits_per_pixel(VkFormat format); -enum class ShaderSourceLanguage -{ - GLSL, - HLSL, - SPV, -}; - enum class ShadingLanguage { GLSL, HLSL, + SLANG, }; /** - * @brief Helper function to create a VkShaderModule + * @brief Helper function to create a VkShaderModule from a SPIR-V shader file * @param filename The shader location * @param device The logical device * @param stage The shader stage - * @param src_language The shader language - * @return The string to return. + * @return The shader module containing the loaded shader + */ +VkShaderModule load_shader(const std::string &filename, VkDevice device, VkShaderStageFlagBits stage); + +/** + * @brief Helper function to create a VkShaderModule from a SPIR-V vector + * @param spirv The SPIR-V code in vector format + * @param device The logical device + * @return The shader module containing the loaded shader */ -VkShaderModule load_shader(const std::string &filename, VkDevice device, VkShaderStageFlagBits stage, ShaderSourceLanguage src_language = ShaderSourceLanguage::GLSL); +VkShaderModule load_shader_from_vector(const std::vector &spirv, VkDevice device); /** * @brief Helper function to select a VkSurfaceFormatKHR @@ -174,9 +183,9 @@ struct ImageMemoryBarrier VkImageLayout new_layout{VK_IMAGE_LAYOUT_UNDEFINED}; - uint32_t old_queue_family{VK_QUEUE_FAMILY_IGNORED}; + uint32_t src_queue_family{VK_QUEUE_FAMILY_IGNORED}; - uint32_t new_queue_family{VK_QUEUE_FAMILY_IGNORED}; + uint32_t dst_queue_family{VK_QUEUE_FAMILY_IGNORED}; }; /** @@ -305,4 +314,6 @@ std::vector get_clear_store_all(); std::vector get_clear_value(); } // namespace gbuffer +uint32_t get_queue_family_index(std::vector const &queue_family_properties, VkQueueFlagBits queue_flag); + } // namespace vkb diff --git a/framework/common/vk_initializers.h b/framework/common/vk_initializers.h index 175dc72813..ac05cd8557 100644 --- a/framework/common/vk_initializers.h +++ b/framework/common/vk_initializers.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -72,6 +73,15 @@ inline VkCommandBufferInheritanceInfo command_buffer_inheritance_info() return command_buffer_inheritance_info; } +inline VkComponentMapping component_mapping() +{ + return { + .r = VK_COMPONENT_SWIZZLE_R, + .g = VK_COMPONENT_SWIZZLE_G, + .b = VK_COMPONENT_SWIZZLE_B, + .a = VK_COMPONENT_SWIZZLE_A}; +} + inline VkRenderPassBeginInfo render_pass_begin_info() { VkRenderPassBeginInfo render_pass_begin_info{}; diff --git a/framework/core/acceleration_structure.cpp b/framework/core/acceleration_structure.cpp index 91735e7a1d..4ad0885e2e 100644 --- a/framework/core/acceleration_structure.cpp +++ b/framework/core/acceleration_structure.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -23,7 +23,7 @@ namespace vkb { namespace core { -AccelerationStructure::AccelerationStructure(Device &device, +AccelerationStructure::AccelerationStructure(vkb::core::DeviceC &device, VkAccelerationStructureTypeKHR type) : device{device}, type{type} @@ -208,9 +208,10 @@ void AccelerationStructure::build(VkQueue queue, VkBuildAccelerationStructureFla // Create a scratch buffer as a temporary storage for the acceleration structure build scratch_buffer = std::make_unique( device, - build_sizes_info.buildScratchSize, - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, - VMA_MEMORY_USAGE_GPU_ONLY); + BufferBuilderC(build_sizes_info.buildScratchSize) + .with_usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) + .with_vma_usage(VMA_MEMORY_USAGE_GPU_ONLY) + .with_alignment(scratch_buffer_alignment)); build_geometry_info.scratchData.deviceAddress = scratch_buffer->get_device_address(); build_geometry_info.dstAccelerationStructure = handle; diff --git a/framework/core/acceleration_structure.h b/framework/core/acceleration_structure.h index 8778ae71b4..0c29a919fe 100644 --- a/framework/core/acceleration_structure.h +++ b/framework/core/acceleration_structure.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -23,10 +23,12 @@ namespace vkb { -class Device; - namespace core { +template +class Device; +using DeviceC = Device; + /** * @brief Wraps setup and access for a ray tracing top- or bottom-level acceleration structure */ @@ -38,7 +40,7 @@ class AccelerationStructure * @param device A valid Vulkan device * @param type The type of the acceleration structure (top- or bottom-level) */ - AccelerationStructure(Device &device, + AccelerationStructure(vkb::core::DeviceC &device, VkAccelerationStructureTypeKHR type); ~AccelerationStructure(); @@ -131,8 +133,13 @@ class AccelerationStructure geometries.clear(); } + void set_scrach_buffer_alignment(VkDeviceSize alignment) + { + scratch_buffer_alignment = alignment; + } + private: - Device &device; + vkb::core::DeviceC &device; VkAccelerationStructureKHR handle{VK_NULL_HANDLE}; @@ -142,6 +149,8 @@ class AccelerationStructure VkAccelerationStructureBuildSizesInfoKHR build_sizes_info{}; + VkDeviceSize scratch_buffer_alignment{0}; + struct Geometry { VkAccelerationStructureGeometryKHR geometry{}; @@ -157,4 +166,4 @@ class AccelerationStructure std::unique_ptr buffer{nullptr}; }; } // namespace core -} // namespace vkb \ No newline at end of file +} // namespace vkb diff --git a/framework/core/allocated.cpp b/framework/core/allocated.cpp index eafa1e9552..28fd972788 100644 --- a/framework/core/allocated.cpp +++ b/framework/core/allocated.cpp @@ -17,6 +17,7 @@ */ #include "allocated.h" +#include "common/error.h" namespace vkb { @@ -32,10 +33,14 @@ VmaAllocator &get_memory_allocator() void init(const VmaAllocatorCreateInfo &create_info) { - VkResult result = vmaCreateAllocator(&create_info, &get_memory_allocator()); - if (result != VK_SUCCESS) + auto &allocator = get_memory_allocator(); + if (allocator == VK_NULL_HANDLE) { - throw VulkanException{result, "Cannot create allocator"}; + VkResult result = vmaCreateAllocator(&create_info, &allocator); + if (result != VK_SUCCESS) + { + throw VulkanException{result, "Cannot create allocator"}; + } } } @@ -52,182 +57,5 @@ void shutdown() } } -AllocatedBase::AllocatedBase(const VmaAllocationCreateInfo &alloc_create_info) : - alloc_create_info(alloc_create_info) -{ -} - -AllocatedBase::AllocatedBase(AllocatedBase &&other) noexcept : - alloc_create_info(std::exchange(other.alloc_create_info, {})), - allocation(std::exchange(other.allocation, {})), - mapped_data(std::exchange(other.mapped_data, {})), - coherent(std::exchange(other.coherent, {})), - persistent(std::exchange(other.persistent, {})) -{ -} - -const uint8_t *AllocatedBase::get_data() const -{ - return mapped_data; -} - -VkDeviceMemory AllocatedBase::get_memory() const -{ - VmaAllocationInfo alloc_info; - vmaGetAllocationInfo(get_memory_allocator(), allocation, &alloc_info); - return alloc_info.deviceMemory; -} - -void AllocatedBase::flush(VkDeviceSize offset, VkDeviceSize size) -{ - if (!coherent) - { - vmaFlushAllocation(get_memory_allocator(), allocation, offset, size); - } -} - -uint8_t *AllocatedBase::map() -{ - if (!persistent && !mapped()) - { - VK_CHECK(vmaMapMemory(get_memory_allocator(), allocation, reinterpret_cast(&mapped_data))); - assert(mapped_data); - } - return mapped_data; -} - -void AllocatedBase::unmap() -{ - if (!persistent && mapped()) - { - vmaUnmapMemory(get_memory_allocator(), allocation); - mapped_data = nullptr; - } -} - -size_t AllocatedBase::update(const uint8_t *data, size_t size, size_t offset) -{ - if (persistent) - { - std::copy(data, data + size, mapped_data + offset); - flush(); - } - else - { - map(); - std::copy(data, data + size, mapped_data + offset); - flush(); - unmap(); - } - return size; -} - -size_t AllocatedBase::update(void const *data, size_t size, size_t offset) -{ - return update(reinterpret_cast(data), size, offset); -} - -void AllocatedBase::post_create(VmaAllocationInfo const &allocation_info) -{ - VkMemoryPropertyFlags memory_properties; - vmaGetAllocationMemoryProperties(get_memory_allocator(), allocation, &memory_properties); - coherent = (memory_properties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - mapped_data = static_cast(allocation_info.pMappedData); - persistent = mapped(); -} - -[[nodiscard]] VkBuffer AllocatedBase::create_buffer(VkBufferCreateInfo const &create_info) -{ - VkBuffer handleResult = VK_NULL_HANDLE; - VmaAllocationInfo allocation_info{}; - - auto result = vmaCreateBuffer( - get_memory_allocator(), - &create_info, - &alloc_create_info, - &handleResult, - &allocation, - &allocation_info); - - if (result != VK_SUCCESS) - { - throw VulkanException{result, "Cannot create Buffer"}; - } - post_create(allocation_info); - return handleResult; -} - -[[nodiscard]] VkImage AllocatedBase::create_image(VkImageCreateInfo const &create_info) -{ - assert(0 < create_info.mipLevels && "Images should have at least one level"); - assert(0 < create_info.arrayLayers && "Images should have at least one layer"); - assert(0 < create_info.usage && "Images should have at least one usage type"); - - VkImage handleResult = VK_NULL_HANDLE; - VmaAllocationInfo allocation_info{}; - -#if 0 - // If the image is an attachment, prefer dedicated memory - constexpr VkImageUsageFlags attachment_only_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; - if (create_info.usage & attachment_only_flags) - { - alloc_create_info.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT; - } - - if (create_info.usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) - { - alloc_create_info.preferredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT; - } -#endif - - auto result = vmaCreateImage( - get_memory_allocator(), - &create_info, - &alloc_create_info, - &handleResult, - &allocation, - &allocation_info); - - if (result != VK_SUCCESS) - { - throw VulkanException{result, "Cannot create Image"}; - } - - post_create(allocation_info); - return handleResult; -} - -void AllocatedBase::destroy_buffer(VkBuffer handle) -{ - if (handle != VK_NULL_HANDLE && allocation != VK_NULL_HANDLE) - { - unmap(); - vmaDestroyBuffer(get_memory_allocator(), handle, allocation); - clear(); - } -} - -void AllocatedBase::destroy_image(VkImage image) -{ - if (image != VK_NULL_HANDLE && allocation != VK_NULL_HANDLE) - { - unmap(); - vmaDestroyImage(get_memory_allocator(), image, allocation); - clear(); - } -} - -bool AllocatedBase::mapped() const -{ - return mapped_data != nullptr; -} - -void AllocatedBase::clear() -{ - mapped_data = nullptr; - persistent = false; - alloc_create_info = {}; -} - } // namespace allocated } // namespace vkb diff --git a/framework/core/allocated.h b/framework/core/allocated.h index 29bf14e745..6ef51d03ef 100644 --- a/framework/core/allocated.h +++ b/framework/core/allocated.h @@ -1,5 +1,6 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Bradley Austin Davis. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2024-2025, Bradley Austin Davis. All rights reserved. + * Copyright (c) 2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -19,20 +20,35 @@ #pragma once #include "common/error.h" +#include "core/physical_device.h" #include "core/vulkan_resource.h" -#include -#include namespace vkb { - -class Device; - namespace allocated { +/** + * @brief Retrieves a reference to the VMA allocator singleton. It will hold an opaque handle to the VMA + * allocator between calls to `init` and `shutdown`. Otherwise it contains a null pointer. + * @return A reference to the VMA allocator singleton handle. + */ +VmaAllocator &get_memory_allocator(); + +/** + * @brief The non-templatized VMA initializer function, referenced by the template version to smooth + * over the differences between the `vkb::Device` and `vkb::core::HPPDevice` classes. + * Idempotent, but should be paired with `shutdown`. + * @param create_info The VMA allocator create info. + */ void init(const VmaAllocatorCreateInfo &create_info); -template +/** + * @brief Initializes the VMA allocator with the specified device, expressed + * as the `vkb` wrapper class, which might be `vkb::Device` or `vkb::core::HPPDevice`. + * @tparam DeviceType The type of the device. + * @param device The Vulkan device. + */ +template void init(const DeviceType &device) { VmaVulkanFunctions vma_vulkan_func{}; @@ -45,34 +61,37 @@ void init(const DeviceType &device) allocator_info.device = static_cast(device.get_handle()); allocator_info.instance = static_cast(device.get_gpu().get_instance().get_handle()); - bool can_get_memory_requirements = device.is_extension_supported(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); - bool has_dedicated_allocation = device.is_extension_supported(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); - if (can_get_memory_requirements && has_dedicated_allocation && device.is_enabled(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME)) + bool can_get_memory_requirements = device.get_gpu().is_extension_supported(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); + bool has_dedicated_allocation = device.get_gpu().is_extension_supported(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); + if (can_get_memory_requirements && has_dedicated_allocation && device.is_extension_enabled(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME)) { allocator_info.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT; } - if (device.is_extension_supported(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) && device.is_enabled(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) + if (device.get_gpu().is_extension_supported(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) && + device.is_extension_enabled(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) { allocator_info.flags |= VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT; } - if (device.is_extension_supported(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME) && device.is_enabled(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME)) + if (device.get_gpu().is_extension_supported(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME) && device.is_extension_enabled(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME)) { allocator_info.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT; } - if (device.is_extension_supported(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME) && device.is_enabled(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME)) + if (device.get_gpu().is_extension_supported(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME) && + device.is_extension_enabled(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME)) { allocator_info.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT; } - if (device.is_extension_supported(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME) && device.is_enabled(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME)) + if (device.get_gpu().is_extension_supported(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME) && device.is_extension_enabled(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME)) { allocator_info.flags |= VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT; } - if (device.is_extension_supported(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME) && device.is_enabled(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME)) + if (device.get_gpu().is_extension_supported(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME) && + device.is_extension_enabled(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME)) { allocator_info.flags |= VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT; } @@ -80,66 +99,150 @@ void init(const DeviceType &device) init(allocator_info); } -VmaAllocator &get_memory_allocator(); - +/** + * @brief Shuts down the VMA allocator and releases all resources. Should be preceeded with a call to `init`. + */ void shutdown(); -class AllocatedBase +/** + * @brief The `Allocated` class serves as a base class for wrappers around Vulkan that require memory allocation + * (`VkImage` and `VkBuffer`). This class mostly ensures proper behavior for a RAII pattern, preventing double-release by + * preventing copy assignment and copy construction in favor of move semantics, as well as preventing default construction + * in favor of explicit construction with a pre-existing handle or a populated create info struct. + * + * This project uses the [VMA](https://gpuopen.com/vulkan-memory-allocator/) to handle the low + * level details of memory allocation and management, as it hides away many of the messyy details of + * memory allocation when a user is first learning Vulkan, but still allows for fine grained control + * when a user becomes more experienced and the situation calls for it. + * + * @note Constants used in this documentation in the form of `HOST_COHERENT` are shorthand for + * `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT` used for the sake of brevity. + * + * @tparam bindingType A flag indicating whether this is being used with the C or C++ API + */ +template +class Allocated : public vkb::core::VulkanResource { public: - AllocatedBase() = default; - AllocatedBase(const VmaAllocationCreateInfo &alloc_create_info); - AllocatedBase(AllocatedBase const &) = delete; - AllocatedBase(AllocatedBase &&other) noexcept; + using ParentType = vkb::core::VulkanResource; - AllocatedBase &operator=(const AllocatedBase &) = delete; - AllocatedBase &operator=(AllocatedBase &&) = default; + using BufferType = typename std::conditional::type; + using BufferCreateInfoType = typename std::conditional::type; + using DeviceMemoryType = typename std::conditional::type; + using DeviceSizeType = typename std::conditional::type; + using ImageCreateInfoType = typename std::conditional::type; + using ImageType = typename std::conditional::type; - const uint8_t *get_data() const; - VkDeviceMemory get_memory() const; + public: + Allocated() = delete; + Allocated(const Allocated &) = delete; + Allocated(Allocated &&other) noexcept; + Allocated &operator=(Allocated const &other) = delete; + Allocated &operator=(Allocated &&other) = default; + protected: /** - * @brief Flushes memory if it is HOST_VISIBLE and not HOST_COHERENT + * @brief The VMA-specific constructor for new objects. This should only be visible to derived classes. + * @param allocation_create_info All of the non-resource-specific information needed by the VMA to allocate the memory. + * @param args Additional constructor arguments needed for the derived class. Typically a `VkImageCreateInfo` or `VkBufferCreateInfo` struct. */ - void flush(VkDeviceSize offset = 0, VkDeviceSize size = VK_WHOLE_SIZE); + template + Allocated(const VmaAllocationCreateInfo &allocation_create_info, Args &&...args); /** - * @brief Returns true if the memory is mapped, false otherwise - * @return mapping status + * @brief This constructor is used when the handle is already created, and the user wants to wrap it in an `Allocated` object. + * @note This constructor is used when the API provides us a pre-existing handle to something we didn't actually allocate, for instance + * when we allocate a swapchain and access the images in it. In these cases the `allocation` member variable will remain null for the + * lifetime of the wrapper object (which is NOT necessarily the lifetime of the handle) and the wrapper will make no attempt to apply + * RAII semantics. */ - bool mapped() const; + Allocated(HandleType handle, vkb::core::Device *device_ = nullptr); + + public: + const HandleType *get() const; /** - * @brief Maps vulkan memory if it isn't already mapped to an host visible address - * @return Pointer to host visible memory + * @brief Flushes memory if it is NOT `HOST_COHERENT` (which also implies `HOST_VISIBLE`). + * This is a no-op for `HOST_COHERENT` memory. + * + * @param offset The offset into the memory to flush. Defaults to 0. + * @param size The size of the memory to flush. Defaults to the entire block of memory. + */ + void flush(DeviceSizeType offset = 0, DeviceSizeType size = VK_WHOLE_SIZE); + + /** + * @brief Retrieves a pointer to the host visible memory as an unsigned byte array. + * @return The pointer to the host visible memory. + * @note This performs no checking that the memory is actually mapped, so it's possible to get a nullptr + */ + const uint8_t *get_data() const; + /** + * @brief Retrieves the raw Vulkan memory object. + * @return The Vulkan memory object. + */ + DeviceMemoryType get_memory() const; + + /** + * @brief Retrieves the offset into the raw Vulkan memory object (which can be retrieved from get_memory()). + */ + DeviceSizeType get_memory_offset() const; + + /** + * @brief Maps Vulkan memory if it isn't already mapped to a host visible address. Does nothing if the + * allocation is already mapped (including persistently mapped allocations). + * @return Pointer to host visible memory. */ uint8_t *map(); /** - * @brief Unmaps vulkan memory from the host visible address + * @brief Returns true if the memory is mapped (i.e. the object contains a pointer for the mapping). + * This is true for both objects where `map` has been called as well as objects created with persistent + * mapping, where no call to `map` is necessary. + * @return mapping status. + */ + bool mapped() const; + + /** + * @brief Unmaps Vulkan memory from the host visible address. Does nothing if the memory is not mapped or + * if the allocation is persistently mapped. */ void unmap(); /** - * @brief Copies byte data into the buffer - * @param data The data to copy from - * @param size The amount of bytes to copy - * @param offset The offset to start the copying into the mapped data + * @brief Copies the specified unsigned byte data into the mapped memory region. + * @note For non-persistently mapped memory, this function will call the `map` and `unmap` methods and SHOULD NOT + * be used if the user intends to make multiple updates to the memory region. In that case, the user should call + * `map` once, make all the updates against the pointer returned by `get_data`, and then call `unmap`. This may + * be a poor design choice as it creates a side effect of using the method (that mapped memory will + * unexpectedly be unmapped), but it is the current design of the method and changing it would be burdensome. + * Refactoring could be eased by creating a new method with a more explicit name, and then removing this method + * entirely. + * + * @param data The data to copy from. + * @param size The amount of bytes to copy. + * @param offset The offset to start the copying into the mapped data. Defaults to 0. */ size_t update(const uint8_t *data, size_t size, size_t offset = 0); + /** - * @brief Converts any non byte data into bytes and then updates the buffer - * @param data The data to copy from - * @param size The amount of bytes to copy - * @param offset The offset to start the copying into the mapped data + * @brief Converts any non-byte data into bytes and then updates the buffer. This allows the user to pass + * arbitrary structure pointers to the update method, which will then be copied into the buffer as bytes. + * @param data The data to copy from. + * @param size The amount of bytes to copy. + * @param offset The offset to start the copying into the mapped data. Defaults to 0. */ size_t update(void const *data, size_t size, size_t offset = 0); /** - * @todo Use the vk::ArrayBuffer class to collapse some of these templates - * @brief Copies a vector of items into the buffer + * @brief Copies a vector of items into the buffer. This is a convenience method that allows the user to + * pass a vector of items to the update method, which will then be copied into the buffer as bytes. + * + * This function DOES NOT automatically manage adhering to the alignment requirements of the items being copied, + * for instance the `minUniformBufferOffsetAlignment` property of the [device](https://vulkan.gpuinfo.org/displaydevicelimit.php?name=minUniformBufferOffsetAlignment&platform=all). + * If the data needs to be aligned on something other than `sizeof(T)`, the user must manage that themselves. * @param data The data vector to upload * @param offset The offset to start the copying into the mapped data + * @deprecated Use the `updateTyped` method that uses the `vk::ArrayProxy` class instead. */ template size_t update(std::vector const &data, size_t offset = 0) @@ -147,6 +250,13 @@ class AllocatedBase return update(data.data(), data.size() * sizeof(T), offset); } + /** + * @brief Another convenience method, similar to the vector update method, but for std::array. The same caveats apply. + * @param data The data vector to upload + * @param offset The offset to start the copying into the mapped data + * @see update(std::vector const &data, size_t offset = 0) + * @deprecated Use the `updateTyped` method that uses the `vk::ArrayProxy` class instead. + */ template size_t update(std::array const &data, size_t offset = 0) { @@ -154,65 +264,437 @@ class AllocatedBase } /** - * @brief Copies an object as byte data into the buffer + * @brief Copies an object as byte data into the buffer. This is a convenience method that allows the user to + * pass an object to the update method, which will then be copied into the buffer as bytes. The name difference + * is to avoid amibuity with the `update` method signatures (including the non-templated version) * @param object The object to convert into byte data * @param offset The offset to start the copying into the mapped data + * @deprecated Use the `updateTyped` method that uses the `vk::ArrayProxy` class instead. */ template size_t convert_and_update(const T &object, size_t offset = 0) { return update(reinterpret_cast(&object), sizeof(T), offset); } + /** + * @brief Copies an object as byte data into the buffer. This is a convenience method that allows the user to + * pass an object to the update method, which will then be copied into the buffer as bytes. The use of the `vk::ArrayProxy` + * type here to wrap the passed data means you can use any type related to T that can be used as a constructor to `vk::ArrayProxy`. + * This includes `T`, `std::vector`, `std::array`, and `vk::ArrayProxy`. + * + * @remark This was previously not feasible as it would have been undesirable to create a strong coupling with the + * C++ Vulkan bindings where the `vk::ArrayProxy` type is defined. However, structural changes have ensured that this + * coupling is always present, so the `vk::ArrayProxy` may as well be used to our advantage here. + * + * @note This function DOES NOT automatically manage adhering to the alignment requirements of the items being copied, + * for instance the `minUniformBufferOffsetAlignment` property of the [device](https://vulkan.gpuinfo.org/displaydevicelimit.php?name=minUniformBufferOffsetAlignment&platform=all). + * If the data needs to be aligned on something other than `sizeof(T)`, the user must manage that themselves. + * + * @todo create `updateTypedAligned` which has an additional argument specifying the required GPU alignment of the elements of the array. + */ + template + size_t updateTyped(const vk::ArrayProxy &object, size_t offset = 0) + { + return update(reinterpret_cast(object.data()), object.size() * sizeof(T), offset); + } protected: - virtual void post_create(VmaAllocationInfo const &allocation_info); - [[nodiscard]] VkBuffer create_buffer(VkBufferCreateInfo const &create_info); - [[nodiscard]] VkImage create_image(VkImageCreateInfo const &create_info); - void destroy_buffer(VkBuffer buffer); - void destroy_image(VkImage image); - void clear(); - - VmaAllocationCreateInfo alloc_create_info{}; - VmaAllocation allocation = VK_NULL_HANDLE; - uint8_t *mapped_data = nullptr; - bool coherent = false; - bool persistent = false; // Whether the buffer is persistently mapped or not + /** + * @brief Internal method to actually create the buffer, allocate the memory and bind them. + * Should only be called from the `Buffer` derived class. + * + * Present in this common base class in order to allow the internal state members to remain `private` + * instead of `protected`, and because it (mostly) isolates interaction with the VMA to a single class + */ + [[nodiscard]] BufferType create_buffer(BufferCreateInfoType const &create_info, DeviceSizeType alignment); + /** + * @brief Internal method to actually create the image, allocate the memory and bind them. + * Should only be called from the `Image` derived class. + * + * Present in this common base class in order to allow the internal state members to remain `private` + * instead of `protected`, and because it (mostly) isolates interaction with the VMA to a single class + */ + [[nodiscard]] ImageType create_image(ImageCreateInfoType const &create_info); + + /** + * @brief Internal method to retrieve the VMA allocation owned by this object. + * + * This is needed for derived classes to handle some of the VMA allocation code themselves, + * in particular for Tensor objects to be allocated, in tensor_and_data_graph_common.cpp. + * Once Tensor objects are integrated into VMA, this code can be refactored and this function removed. + */ + VmaAllocation get_allocation() const; + + /** + * @brief Internal method to set the VMA allocation owned by this object. + * + * This is needed for derived classes to handle some of the VMA allocation code themselves, + * in particular for Tensor objects to be allocated, in tensor_and_data_graph_common.cpp. + * Once Tensor objects are integrated into VMA, this code can be refactored and this function removed. + */ + void set_allocation(VmaAllocation alloc); + + /** + * @brief The post_create method is called after the creation of a buffer or image to store the allocation info internally. Derived classes + * could in theory override this to ensure any post-allocation operations are performed, but the base class should always be called to ensure + * the allocation info is stored. + * Should only be called in the corresponding `create_xxx` methods. + */ + virtual void post_create(VmaAllocationInfo const &allocation_info); + + /** + * @brief Internal method to actually destroy the buffer and release the allocated memory. Should + * only be called from the `Buffer` derived class. + * Present in this common base class in order to allow the internal state members to remain `private` + * instead of `protected`, and because it (mostly) isolates interaction with the VMA to a single class + */ + void destroy_buffer(BufferType buffer); + /** + * @brief Internal method to actually destroy the image and release the allocated memory. Should + * only be called from the `Image` derived class. + * Present in this common base class in order to allow the internal state members to remain `private` + * instead of `protected`, and because it (mostly) isolates interaction with the VMA to a single class + */ + void destroy_image(ImageType image); + /** + * @brief Clears the internal state. Can be overridden by derived classes to perform additional cleanup of members. + * Should only be called in the corresping `destroy_xxx` methods. + */ + void clear(); + + private: + vk::Buffer create_buffer_impl(vk::BufferCreateInfo const &create_info, DeviceSizeType alignment); + vk::Image create_image_impl(vk::ImageCreateInfo const &create_info); + + VmaAllocationCreateInfo allocation_create_info = {}; + VmaAllocation allocation = VK_NULL_HANDLE; + /** + * @brief A pointer to the allocation memory, if the memory is HOST_VISIBLE and is currently (or persistently) mapped. + * Contains null otherwise. + */ + uint8_t *mapped_data = nullptr; + /** + * @brief This flag is set to true if the memory is coherent and doesn't need to be flushed after writes. + * + * @note This is initialized at allocation time to avoid subsequent need to call a function to fetch the + * allocation information from the VMA, since this property won't change for the lifetime of the allocation. + */ + bool coherent = false; + /** + * @brief This flag is set to true if the memory is persistently mapped (i.e. not just HOST_VISIBLE, but available + * as a pointer to the application for the lifetime of the allocation). + * + * @note This is initialized at allocation time to avoid subsequent need to call a function to fetch the + * allocation information from the VMA, since this property won't change for the lifetime of the allocation. + */ + bool persistent = false; }; -template < - typename HandleType, - typename MemoryType = VkDeviceMemory, - typename ParentType = vkb::core::VulkanResourceC> -class Allocated : public ParentType, public AllocatedBase +template +inline Allocated::Allocated(Allocated &&other) noexcept : + ParentType{static_cast(other)}, + allocation_create_info(std::exchange(other.allocation_create_info, {})), + allocation(std::exchange(other.allocation, {})), + mapped_data(std::exchange(other.mapped_data, {})), + coherent(std::exchange(other.coherent, {})), + persistent(std::exchange(other.persistent, {})) { - public: - using ParentType::ParentType; +} - Allocated() = delete; - Allocated(const Allocated &) = delete; - Allocated &operator=(Allocated const &other) = delete; - Allocated &operator=(Allocated &&other) = default; +template +template +inline Allocated::Allocated(const VmaAllocationCreateInfo &allocation_create_info, Args &&...args) : + ParentType{std::forward(args)...}, + allocation_create_info(allocation_create_info) +{} - // Import the base class constructors - template - Allocated(const VmaAllocationCreateInfo &alloc_create_info, Args &&...args) : - ParentType(std::forward(args)...), - AllocatedBase(alloc_create_info) +template +inline Allocated::Allocated(HandleType handle, vkb::core::Device *device_) : + ParentType(handle, device_) +{} + +template +inline const HandleType *Allocated::get() const +{ + return &ParentType::get_handle(); +} + +template +inline void Allocated::clear() +{ + mapped_data = nullptr; + persistent = false; + allocation_create_info = {}; +} + +template +inline typename Allocated::BufferType Allocated::create_buffer(BufferCreateInfoType const &create_info, DeviceSizeType alignment) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return create_buffer_impl(create_info, alignment); + } + else { + return static_cast(create_buffer_impl(reinterpret_cast(create_info), alignment)); } +} + +template +inline vk::Buffer Allocated::create_buffer_impl(vk::BufferCreateInfo const &create_info, DeviceSizeType alignment) +{ + vk::Buffer buffer = VK_NULL_HANDLE; + VmaAllocationInfo allocation_info{}; - Allocated(Allocated &&other) noexcept - : - ParentType{static_cast(other)}, - AllocatedBase{static_cast(other)} + auto result = VK_SUCCESS; + if (alignment == 0) { + result = vmaCreateBuffer( + get_memory_allocator(), + reinterpret_cast(&create_info), + &allocation_create_info, + reinterpret_cast(&buffer), + &allocation, + &allocation_info); + } + else + { + result = vmaCreateBufferWithAlignment( + get_memory_allocator(), + reinterpret_cast(&create_info), + &allocation_create_info, + alignment, + reinterpret_cast(&buffer), + &allocation, + &allocation_info); } - const HandleType *get() const + if (result != VK_SUCCESS) { - return &ParentType::get_handle(); + throw VulkanException{result, "Cannot create Buffer"}; } -}; + post_create(allocation_info); + return buffer; +} + +template +inline typename Allocated::ImageType Allocated::create_image(ImageCreateInfoType const &create_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return create_image_impl(create_info); + } + else + { + return static_cast(create_image_impl(reinterpret_cast(create_info))); + } +} + +template +inline vk::Image Allocated::create_image_impl(vk::ImageCreateInfo const &create_info) +{ + assert(0 < create_info.mipLevels && "Images should have at least one level"); + assert(0 < create_info.arrayLayers && "Images should have at least one layer"); + assert(create_info.usage && "Images should have at least one usage type"); + + vk::Image image = VK_NULL_HANDLE; + VmaAllocationInfo allocation_info{}; + +#if 0 + // If the image is an attachment, prefer dedicated memory + constexpr vk::ImageUsageFlags attachment_only_flags = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransientAttachment; + if (create_info.usage & attachment_only_flags) + { + allocation_create_info.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT; + } + + if (create_info.usage & vk::ImageUsageFlagBits::eTransientAttachment) + { + allocation_create_info.preferredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT; + } +#endif + + VkResult result = vmaCreateImage(get_memory_allocator(), + reinterpret_cast(&create_info), + &allocation_create_info, + reinterpret_cast(&image), + &allocation, + &allocation_info); + + if (result != VK_SUCCESS) + { + throw VulkanException{result, "Cannot create Image"}; + } + + post_create(allocation_info); + return image; +} + +template +inline void Allocated::destroy_buffer(BufferType handle) +{ + if (handle != VK_NULL_HANDLE && allocation != VK_NULL_HANDLE) + { + unmap(); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + vmaDestroyBuffer(get_memory_allocator(), static_cast(handle), allocation); + } + else + { + vmaDestroyBuffer(get_memory_allocator(), handle, allocation); + } + clear(); + } +} + +template +inline void Allocated::destroy_image(ImageType image) +{ + if (image != VK_NULL_HANDLE && allocation != VK_NULL_HANDLE) + { + unmap(); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + vmaDestroyImage(get_memory_allocator(), static_cast(image), allocation); + } + else + { + vmaDestroyImage(get_memory_allocator(), image, allocation); + } + clear(); + } +} + +template +inline void Allocated::flush(DeviceSizeType offset, DeviceSizeType size) +{ + if (!coherent) + { + if constexpr (bindingType == vkb::BindingType::Cpp) + { + vmaFlushAllocation(get_memory_allocator(), allocation, static_cast(offset), static_cast(size)); + } + else + { + vmaFlushAllocation(get_memory_allocator(), allocation, offset, size); + } + } +} + +template +inline const uint8_t *Allocated::get_data() const +{ + return mapped_data; +} + +template +inline typename Allocated::DeviceMemoryType Allocated::get_memory() const +{ + VmaAllocationInfo alloc_info; + vmaGetAllocationInfo(get_memory_allocator(), allocation, &alloc_info); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return static_cast(alloc_info.deviceMemory); + } + else + { + return alloc_info.deviceMemory; + } +} + +template +inline typename Allocated::DeviceSizeType Allocated::get_memory_offset() const +{ + VmaAllocationInfo alloc_info; + vmaGetAllocationInfo(get_memory_allocator(), allocation, &alloc_info); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return static_cast(alloc_info.offset); + } + else + { + return alloc_info.offset; + } +} + +template +inline uint8_t *Allocated::map() +{ + if (!persistent && !mapped()) + { + VK_CHECK(vmaMapMemory(get_memory_allocator(), allocation, reinterpret_cast(&mapped_data))); + assert(mapped_data); + } + return mapped_data; +} + +template +inline bool Allocated::mapped() const +{ + return mapped_data != nullptr; +} + +template +inline VmaAllocation Allocated::get_allocation() const +{ + return allocation; +} + +template +inline void Allocated::set_allocation(VmaAllocation alloc) +{ + allocation = alloc; +} + +template +inline void Allocated::post_create(VmaAllocationInfo const &allocation_info) +{ + VkMemoryPropertyFlags memory_properties; + vmaGetAllocationMemoryProperties(get_memory_allocator(), allocation, &memory_properties); + coherent = (memory_properties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + mapped_data = static_cast(allocation_info.pMappedData); + persistent = mapped(); +} + +template +inline void Allocated::unmap() +{ + if (!persistent && mapped()) + { + vmaUnmapMemory(get_memory_allocator(), allocation); + mapped_data = nullptr; + } +} + +template +inline size_t Allocated::update(const uint8_t *data, size_t size, size_t offset) +{ + if (persistent) + { + std::copy(data, data + size, mapped_data + offset); + flush(); + } + else + { + map(); + std::copy(data, data + size, mapped_data + offset); + flush(); + unmap(); + } + return size; +} + +template +inline size_t Allocated::update(void const *data, size_t size, size_t offset) +{ + return update(reinterpret_cast(data), size, offset); +} + +template +using AllocatedC = Allocated; +template +using AllocatedCpp = Allocated; } // namespace allocated } // namespace vkb diff --git a/framework/core/buffer.h b/framework/core/buffer.h index 211ed16d58..5bcd4439d8 100644 --- a/framework/core/buffer.h +++ b/framework/core/buffer.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,6 @@ #include "builder_base.h" #include "common/vk_common.h" #include "core/allocated.h" -#include "core/hpp_allocated.h" namespace vkb { @@ -31,12 +30,14 @@ template class Buffer; template using BufferPtr = std::unique_ptr>; +template +class Device; template struct BufferBuilder - : public vkb::BuilderBase, - typename std::conditional::type> + : public vkb::allocated::BuilderBase, + typename std::conditional::type> { public: using BufferCreateFlagsType = typename std::conditional::type; @@ -45,18 +46,24 @@ struct BufferBuilder using DeviceSizeType = typename std::conditional::type; using SharingModeType = typename std::conditional::type; - using DeviceType = typename std::conditional::type; - private: - using Parent = vkb::BuilderBase, BufferCreateInfoType>; + using ParentType = vkb::allocated::BuilderBase, BufferCreateInfoType>; public: BufferBuilder(DeviceSizeType size); - Buffer build(DeviceType &device) const; - BufferPtr build_unique(DeviceType &device) const; + Buffer build(vkb::core::Device &device) const; + BufferPtr build_unique(vkb::core::Device &device) const; BufferBuilder &with_flags(BufferCreateFlagsType flags); BufferBuilder &with_usage(BufferUsageFlagsType usage); + BufferBuilder &with_alignment(DeviceSizeType align); + DeviceSizeType get_alignment() const + { + return alignment; + } + + private: + DeviceSizeType alignment{0}; }; using BufferBuilderC = BufferBuilder; @@ -64,23 +71,23 @@ using BufferBuilderCpp = BufferBuilder; template <> inline BufferBuilder::BufferBuilder(vk::DeviceSize size) : - Parent(BufferCreateInfoType{{}, size}) + ParentType(BufferCreateInfoType{.size = size}) { } template <> inline BufferBuilder::BufferBuilder(VkDeviceSize size) : - Parent(VkBufferCreateInfo{VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, nullptr, 0, size}) + ParentType(VkBufferCreateInfo{VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, nullptr, 0, size}) {} template -inline Buffer BufferBuilder::build(DeviceType &device) const +inline Buffer BufferBuilder::build(vkb::core::Device &device) const { return Buffer{device, *this}; } template -inline BufferPtr BufferBuilder::build_unique(DeviceType &device) const +inline BufferPtr BufferBuilder::build_unique(vkb::core::Device &device) const { return std::make_unique>(device, *this); } @@ -99,31 +106,35 @@ inline BufferBuilder &BufferBuilder::with_usage(Buffer return *this; } +template +inline BufferBuilder &BufferBuilder::with_alignment(DeviceSizeType align) +{ + this->alignment = align; + return *this; +} + /*=========================================================*/ template class Buffer - : public std::conditional, allocated::Allocated>::type + : public vkb::allocated::Allocated::type> { public: + using BufferType = typename std::conditional::type; using BufferUsageFlagsType = typename std::conditional::type; using DeviceSizeType = typename std::conditional::type; - using AllocatedType = - typename std::conditional, allocated::Allocated>::type; - using DeviceType = typename std::conditional::type; - private: - using Parent = AllocatedType; + using ParentType = vkb::allocated::Allocated; public: - static Buffer create_staging_buffer(DeviceType &device, DeviceSizeType size, const void *data); + static Buffer create_staging_buffer(vkb::core::Device &device, DeviceSizeType size, const void *data); template - static Buffer create_staging_buffer(DeviceType &device, std::vector const &data); + static Buffer create_staging_buffer(vkb::core::Device &device, std::vector const &data); template - static Buffer create_staging_buffer(DeviceType &device, const T &data); + static Buffer create_staging_buffer(vkb::core::Device &device, const T &data); Buffer() = delete; Buffer(const Buffer &) = delete; @@ -141,14 +152,14 @@ class Buffer * @param queue_family_indices optional queue family indices */ // [[deprecated("Use the BufferBuilder ctor instead")]] - Buffer(DeviceType &device, - DeviceSizeType size, - BufferUsageFlagsType buffer_usage, - VmaMemoryUsage memory_usage, - VmaAllocationCreateFlags flags = VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT, - const std::vector &queue_family_indices = {}); + Buffer(vkb::core::Device &device, + DeviceSizeType size, + BufferUsageFlagsType buffer_usage, + VmaMemoryUsage memory_usage, + VmaAllocationCreateFlags flags = VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT, + const std::vector &queue_family_indices = {}); - Buffer(DeviceType &device, BufferBuilder const &builder); + Buffer(vkb::core::Device &device, BufferBuilder const &builder); ~Buffer(); @@ -163,7 +174,7 @@ class Buffer DeviceSizeType get_size() const; private: - static Buffer create_staging_buffer_impl(vkb::core::HPPDevice &device, vk::DeviceSize size, const void *data); + static Buffer create_staging_buffer_impl(vkb::core::DeviceCpp &device, vk::DeviceSize size, const void *data); private: vk::DeviceSize size = 0; @@ -174,13 +185,13 @@ using BufferCpp = Buffer; template template -inline Buffer Buffer::create_staging_buffer(DeviceType &device, const T &data) +inline Buffer Buffer::create_staging_buffer(vkb::core::Device &device, const T &data) { return create_staging_buffer(device, sizeof(T), &data); } template -inline Buffer Buffer::create_staging_buffer(DeviceType &device, DeviceSizeType size, const void *data) +inline Buffer Buffer::create_staging_buffer(vkb::core::Device &device, DeviceSizeType size, const void *data) { if constexpr (bindingType == vkb::BindingType::Cpp) { @@ -188,13 +199,13 @@ inline Buffer Buffer::create_staging_buffer(DeviceType } else { - BufferCpp buffer = create_staging_buffer_impl(reinterpret_cast(device), static_cast(size), data); + BufferCpp buffer = create_staging_buffer_impl(reinterpret_cast(device), static_cast(size), data); return std::move(*reinterpret_cast(&buffer)); } } template -inline BufferCpp Buffer::create_staging_buffer_impl(vkb::core::HPPDevice &device, vk::DeviceSize size, const void *data) +inline BufferCpp Buffer::create_staging_buffer_impl(vkb::core::DeviceCpp &device, vk::DeviceSize size, const void *data) { BufferBuilderCpp builder(size); builder.with_vma_flags(VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT) @@ -209,32 +220,33 @@ inline BufferCpp Buffer::create_staging_buffer_impl(vkb::core::HPPD template template -inline Buffer Buffer::create_staging_buffer(DeviceType &device, std::vector const &data) +inline Buffer Buffer::create_staging_buffer(vkb::core::Device &device, std::vector const &data) { return create_staging_buffer(device, data.size() * sizeof(T), data.data()); } template -inline Buffer::Buffer(DeviceType &device, - DeviceSizeType size, - BufferUsageFlagsType buffer_usage, - VmaMemoryUsage memory_usage, - VmaAllocationCreateFlags flags, - const std::vector &queue_family_indices) : +inline Buffer::Buffer(vkb::core::Device &device, + DeviceSizeType size, + BufferUsageFlagsType buffer_usage, + VmaMemoryUsage memory_usage, + VmaAllocationCreateFlags flags, + const std::vector &queue_family_indices) : Buffer(device, BufferBuilder(size) .with_usage(buffer_usage) .with_vma_usage(memory_usage) + .with_alignment(0) .with_vma_flags(flags) .with_queue_families(queue_family_indices) .with_implicit_sharing_mode()) {} template -inline Buffer::Buffer(DeviceType &device, const BufferBuilder &builder) : - AllocatedType{builder.get_allocation_create_info(), nullptr, &device}, size(builder.get_create_info().size) +inline Buffer::Buffer(vkb::core::Device &device, const BufferBuilder &builder) : + ParentType(builder.get_allocation_create_info(), nullptr, &device), size(builder.get_create_info().size) { - this->set_handle(this->create_buffer(builder.get_create_info())); + this->set_handle(this->create_buffer(builder.get_create_info(), builder.get_alignment())); if (!builder.get_debug_name().empty()) { this->set_debug_name(builder.get_debug_name()); @@ -252,11 +264,11 @@ inline uint64_t Buffer::get_device_address() const { if constexpr (bindingType == vkb::BindingType::Cpp) { - return this->get_device().get_handle().getBufferAddressKHR({this->get_handle()}); + return this->get_device().get_handle().getBufferAddressKHR({.buffer = this->get_handle()}); } else { - return static_cast(this->get_device().get_handle()).getBufferAddressKHR({static_cast(this->get_handle())}); + return static_cast(this->get_device().get_handle()).getBufferAddressKHR({.buffer = static_cast(this->get_handle())}); } } diff --git a/framework/core/command_buffer.cpp b/framework/core/command_buffer.cpp deleted file mode 100644 index ef65df3e22..0000000000 --- a/framework/core/command_buffer.cpp +++ /dev/null @@ -1,803 +0,0 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "command_buffer.h" - -#include "command_pool.h" -#include "common/error.h" -#include "device.h" -#include "rendering/render_frame.h" -#include "rendering/subpass.h" - -#include - -namespace vkb -{ -CommandBuffer::CommandBuffer(CommandPool &command_pool, VkCommandBufferLevel level) : - VulkanResource{VK_NULL_HANDLE, &command_pool.get_device()}, - command_pool{command_pool}, - max_push_constants_size{get_device().get_gpu().get_properties().limits.maxPushConstantsSize}, - level{level} -{ - VkCommandBufferAllocateInfo allocate_info{VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO}; - - allocate_info.commandPool = command_pool.get_handle(); - allocate_info.commandBufferCount = 1; - allocate_info.level = level; - - VkResult result = vkAllocateCommandBuffers(get_device().get_handle(), &allocate_info, &get_handle()); - - if (result != VK_SUCCESS) - { - throw VulkanException{result, "Failed to allocate command buffer"}; - } -} - -CommandBuffer::~CommandBuffer() -{ - // Destroy command buffer - vkFreeCommandBuffers(command_pool.get_device().get_handle(), command_pool.get_handle(), 1, &get_handle()); -} - -CommandBuffer::CommandBuffer(CommandBuffer &&other) : - VulkanResource(std::move(other)), - level(other.level), - command_pool(other.command_pool), - current_render_pass(std::exchange(other.current_render_pass, {})), - pipeline_state(std::exchange(other.pipeline_state, {})), - resource_binding_state(std::exchange(other.resource_binding_state, {})), - stored_push_constants(std::exchange(other.stored_push_constants, {})), - max_push_constants_size(std::exchange(other.max_push_constants_size, {})), - last_framebuffer_extent(std::exchange(other.last_framebuffer_extent, {})), - last_render_area_extent(std::exchange(other.last_render_area_extent, {})), - update_after_bind(std::exchange(other.update_after_bind, {})), - descriptor_set_layout_binding_state(std::exchange(other.descriptor_set_layout_binding_state, {})) -{} - -void CommandBuffer::clear(VkClearAttachment attachment, VkClearRect rect) -{ - vkCmdClearAttachments(get_handle(), 1, &attachment, 1, &rect); -} - -VkResult CommandBuffer::begin(VkCommandBufferUsageFlags flags, CommandBuffer *primary_cmd_buf) -{ - if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) - { - assert(primary_cmd_buf && "A primary command buffer pointer must be provided when calling begin from a secondary one"); - auto render_pass_binding = primary_cmd_buf->get_current_render_pass(); - - return begin(flags, render_pass_binding.render_pass, render_pass_binding.framebuffer, primary_cmd_buf->get_current_subpass_index()); - } - - return begin(flags, nullptr, nullptr, 0); -} - -VkResult CommandBuffer::begin(VkCommandBufferUsageFlags flags, const RenderPass *render_pass, const Framebuffer *framebuffer, uint32_t subpass_index) -{ - // Reset state - pipeline_state.reset(); - resource_binding_state.reset(); - descriptor_set_layout_binding_state.clear(); - stored_push_constants.clear(); - - VkCommandBufferBeginInfo begin_info{VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO}; - VkCommandBufferInheritanceInfo inheritance = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO}; - begin_info.flags = flags; - - if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) - { - assert((render_pass && framebuffer) && "Render pass and framebuffer must be provided when calling begin from a secondary one"); - - current_render_pass.render_pass = render_pass; - current_render_pass.framebuffer = framebuffer; - - inheritance.renderPass = current_render_pass.render_pass->get_handle(); - inheritance.framebuffer = current_render_pass.framebuffer->get_handle(); - inheritance.subpass = subpass_index; - - begin_info.pInheritanceInfo = &inheritance; - } - - return vkBeginCommandBuffer(get_handle(), &begin_info); -} - -VkResult CommandBuffer::end() -{ - vkEndCommandBuffer(get_handle()); - - return VK_SUCCESS; -} - -void CommandBuffer::flush(VkPipelineBindPoint pipeline_bind_point) -{ - flush_pipeline_state(pipeline_bind_point); - - flush_push_constants(); - - flush_descriptor_state(pipeline_bind_point); -} - -void CommandBuffer::begin_render_pass(const RenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector &clear_values, - const std::vector> &subpasses, - VkSubpassContents contents) -{ - // Reset state - pipeline_state.reset(); - resource_binding_state.reset(); - descriptor_set_layout_binding_state.clear(); - - auto &render_pass = get_render_pass(render_target, load_store_infos, subpasses); - auto &framebuffer = get_device().get_resource_cache().request_framebuffer(render_target, render_pass); - - begin_render_pass(render_target, render_pass, framebuffer, clear_values, contents); -} - -void CommandBuffer::begin_render_pass(const RenderTarget &render_target, const RenderPass &render_pass, const Framebuffer &framebuffer, const std::vector &clear_values, VkSubpassContents contents) -{ - current_render_pass.render_pass = &render_pass; - current_render_pass.framebuffer = &framebuffer; - - // Begin render pass - VkRenderPassBeginInfo begin_info{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO}; - begin_info.renderPass = current_render_pass.render_pass->get_handle(); - begin_info.framebuffer = current_render_pass.framebuffer->get_handle(); - begin_info.renderArea.extent = render_target.get_extent(); - begin_info.clearValueCount = to_u32(clear_values.size()); - begin_info.pClearValues = clear_values.data(); - - const auto &framebuffer_extent = current_render_pass.framebuffer->get_extent(); - - // Test the requested render area to confirm that it is optimal and could not cause a performance reduction - if (!is_render_size_optimal(framebuffer_extent, begin_info.renderArea)) - { - // Only prints the warning if the framebuffer or render area are different since the last time the render size was not optimal - if (framebuffer_extent.width != last_framebuffer_extent.width || framebuffer_extent.height != last_framebuffer_extent.height || - begin_info.renderArea.extent.width != last_render_area_extent.width || begin_info.renderArea.extent.height != last_render_area_extent.height) - { - LOGW("Render target extent is not an optimal size, this may result in reduced performance."); - } - - last_framebuffer_extent = current_render_pass.framebuffer->get_extent(); - last_render_area_extent = begin_info.renderArea.extent; - } - - vkCmdBeginRenderPass(get_handle(), &begin_info, contents); - - // Update blend state attachments for first subpass - auto blend_state = pipeline_state.get_color_blend_state(); - blend_state.attachments.resize(current_render_pass.render_pass->get_color_output_count(pipeline_state.get_subpass_index())); - pipeline_state.set_color_blend_state(blend_state); -} - -void CommandBuffer::next_subpass() -{ - // Increment subpass index - pipeline_state.set_subpass_index(pipeline_state.get_subpass_index() + 1); - - // Update blend state attachments - auto blend_state = pipeline_state.get_color_blend_state(); - blend_state.attachments.resize(current_render_pass.render_pass->get_color_output_count(pipeline_state.get_subpass_index())); - pipeline_state.set_color_blend_state(blend_state); - - // Reset descriptor sets - resource_binding_state.reset(); - descriptor_set_layout_binding_state.clear(); - - // Clear stored push constants - stored_push_constants.clear(); - - vkCmdNextSubpass(get_handle(), VK_SUBPASS_CONTENTS_INLINE); -} - -void CommandBuffer::execute_commands(CommandBuffer &secondary_command_buffer) -{ - vkCmdExecuteCommands(get_handle(), 1, &secondary_command_buffer.get_handle()); -} - -void CommandBuffer::execute_commands(std::vector &secondary_command_buffers) -{ - std::vector sec_cmd_buf_handles(secondary_command_buffers.size(), VK_NULL_HANDLE); - std::transform(secondary_command_buffers.begin(), secondary_command_buffers.end(), sec_cmd_buf_handles.begin(), - [](const vkb::CommandBuffer *sec_cmd_buf) { return sec_cmd_buf->get_handle(); }); - vkCmdExecuteCommands(get_handle(), to_u32(sec_cmd_buf_handles.size()), sec_cmd_buf_handles.data()); -} - -void CommandBuffer::end_render_pass() -{ - vkCmdEndRenderPass(get_handle()); -} - -void CommandBuffer::bind_pipeline_layout(PipelineLayout &pipeline_layout) -{ - pipeline_state.set_pipeline_layout(pipeline_layout); -} - -void CommandBuffer::set_specialization_constant(uint32_t constant_id, const std::vector &data) -{ - pipeline_state.set_specialization_constant(constant_id, data); -} - -void CommandBuffer::push_constants(const std::vector &values) -{ - uint32_t push_constant_size = to_u32(stored_push_constants.size() + values.size()); - - if (push_constant_size > max_push_constants_size) - { - LOGE("Push constant limit of {} exceeded (pushing {} bytes for a total of {} bytes)", max_push_constants_size, values.size(), push_constant_size); - throw std::runtime_error("Push constant limit exceeded."); - } - else - { - stored_push_constants.insert(stored_push_constants.end(), values.begin(), values.end()); - } -} - -void CommandBuffer::bind_buffer(const vkb::core::BufferC &buffer, VkDeviceSize offset, VkDeviceSize range, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_buffer(buffer, offset, range, set, binding, array_element); -} - -void CommandBuffer::bind_image(const core::ImageView &image_view, const core::Sampler &sampler, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_image(image_view, sampler, set, binding, array_element); -} - -void CommandBuffer::bind_image(const core::ImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_image(image_view, set, binding, array_element); -} - -void CommandBuffer::bind_input(const core::ImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_input(image_view, set, binding, array_element); -} - -void CommandBuffer::bind_vertex_buffers(uint32_t first_binding, const std::vector> &buffers, const std::vector &offsets) -{ - std::vector buffer_handles(buffers.size(), VK_NULL_HANDLE); - std::transform(buffers.begin(), buffers.end(), buffer_handles.begin(), - [](const vkb::core::BufferC &buffer) { return buffer.get_handle(); }); - vkCmdBindVertexBuffers(get_handle(), first_binding, to_u32(buffer_handles.size()), buffer_handles.data(), offsets.data()); -} - -void CommandBuffer::bind_index_buffer(const vkb::core::BufferC &buffer, VkDeviceSize offset, VkIndexType index_type) -{ - vkCmdBindIndexBuffer(get_handle(), buffer.get_handle(), offset, index_type); -} - -void CommandBuffer::bind_lighting(vkb::rendering::LightingStateC &lighting_state, uint32_t set, uint32_t binding) -{ - bind_buffer(lighting_state.light_buffer.get_buffer(), lighting_state.light_buffer.get_offset(), lighting_state.light_buffer.get_size(), set, binding, 0); - - set_specialization_constant(0, to_u32(lighting_state.directional_lights.size())); - set_specialization_constant(1, to_u32(lighting_state.point_lights.size())); - set_specialization_constant(2, to_u32(lighting_state.spot_lights.size())); -} - -void CommandBuffer::set_viewport_state(const ViewportState &state_info) -{ - pipeline_state.set_viewport_state(state_info); -} - -void CommandBuffer::set_vertex_input_state(const VertexInputState &state_info) -{ - pipeline_state.set_vertex_input_state(state_info); -} - -void CommandBuffer::set_input_assembly_state(const InputAssemblyState &state_info) -{ - pipeline_state.set_input_assembly_state(state_info); -} - -void CommandBuffer::set_rasterization_state(const RasterizationState &state_info) -{ - pipeline_state.set_rasterization_state(state_info); -} - -void CommandBuffer::set_multisample_state(const MultisampleState &state_info) -{ - pipeline_state.set_multisample_state(state_info); -} - -void CommandBuffer::set_depth_stencil_state(const DepthStencilState &state_info) -{ - pipeline_state.set_depth_stencil_state(state_info); -} - -void CommandBuffer::set_color_blend_state(const ColorBlendState &state_info) -{ - pipeline_state.set_color_blend_state(state_info); -} - -void CommandBuffer::set_viewport(uint32_t first_viewport, const std::vector &viewports) -{ - vkCmdSetViewport(get_handle(), first_viewport, to_u32(viewports.size()), viewports.data()); -} - -void CommandBuffer::set_scissor(uint32_t first_scissor, const std::vector &scissors) -{ - vkCmdSetScissor(get_handle(), first_scissor, to_u32(scissors.size()), scissors.data()); -} - -void CommandBuffer::set_line_width(float line_width) -{ - vkCmdSetLineWidth(get_handle(), line_width); -} - -void CommandBuffer::set_depth_bias(float depth_bias_constant_factor, float depth_bias_clamp, float depth_bias_slope_factor) -{ - vkCmdSetDepthBias(get_handle(), depth_bias_constant_factor, depth_bias_clamp, depth_bias_slope_factor); -} - -void CommandBuffer::set_blend_constants(const std::array &blend_constants) -{ - vkCmdSetBlendConstants(get_handle(), blend_constants.data()); -} - -void CommandBuffer::set_depth_bounds(float min_depth_bounds, float max_depth_bounds) -{ - vkCmdSetDepthBounds(get_handle(), min_depth_bounds, max_depth_bounds); -} - -void CommandBuffer::draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance) -{ - flush(VK_PIPELINE_BIND_POINT_GRAPHICS); - - vkCmdDraw(get_handle(), vertex_count, instance_count, first_vertex, first_instance); -} - -void CommandBuffer::draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance) -{ - flush(VK_PIPELINE_BIND_POINT_GRAPHICS); - - vkCmdDrawIndexed(get_handle(), index_count, instance_count, first_index, vertex_offset, first_instance); -} - -void CommandBuffer::draw_indexed_indirect(const vkb::core::BufferC &buffer, VkDeviceSize offset, uint32_t draw_count, uint32_t stride) -{ - flush(VK_PIPELINE_BIND_POINT_GRAPHICS); - - vkCmdDrawIndexedIndirect(get_handle(), buffer.get_handle(), offset, draw_count, stride); -} - -void CommandBuffer::dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z) -{ - flush(VK_PIPELINE_BIND_POINT_COMPUTE); - - vkCmdDispatch(get_handle(), group_count_x, group_count_y, group_count_z); -} - -void CommandBuffer::dispatch_indirect(const vkb::core::BufferC &buffer, VkDeviceSize offset) -{ - flush(VK_PIPELINE_BIND_POINT_COMPUTE); - - vkCmdDispatchIndirect(get_handle(), buffer.get_handle(), offset); -} - -void CommandBuffer::update_buffer(const vkb::core::BufferC &buffer, VkDeviceSize offset, const std::vector &data) -{ - vkCmdUpdateBuffer(get_handle(), buffer.get_handle(), offset, data.size(), data.data()); -} - -void CommandBuffer::blit_image(const core::Image &src_img, const core::Image &dst_img, const std::vector ®ions) -{ - vkCmdBlitImage(get_handle(), src_img.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - dst_img.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - to_u32(regions.size()), regions.data(), VK_FILTER_NEAREST); -} - -void CommandBuffer::resolve_image(const core::Image &src_img, const core::Image &dst_img, const std::vector ®ions) -{ - vkCmdResolveImage(get_handle(), src_img.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - dst_img.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - to_u32(regions.size()), regions.data()); -} - -void CommandBuffer::copy_buffer(const vkb::core::BufferC &src_buffer, const vkb::core::BufferC &dst_buffer, VkDeviceSize size) -{ - VkBufferCopy copy_region = {}; - copy_region.size = size; - vkCmdCopyBuffer(get_handle(), src_buffer.get_handle(), dst_buffer.get_handle(), 1, ©_region); -} - -void CommandBuffer::copy_image(const core::Image &src_img, const core::Image &dst_img, const std::vector ®ions) -{ - vkCmdCopyImage(get_handle(), src_img.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - dst_img.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - to_u32(regions.size()), regions.data()); -} - -void CommandBuffer::copy_buffer_to_image(const vkb::core::BufferC &buffer, const core::Image &image, const std::vector ®ions) -{ - vkCmdCopyBufferToImage(get_handle(), buffer.get_handle(), - image.get_handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - to_u32(regions.size()), regions.data()); -} - -void CommandBuffer::copy_image_to_buffer(const core::Image &image, VkImageLayout image_layout, const vkb::core::BufferC &buffer, const std::vector ®ions) -{ - vkCmdCopyImageToBuffer(get_handle(), image.get_handle(), image_layout, - buffer.get_handle(), to_u32(regions.size()), regions.data()); -} - -void CommandBuffer::image_memory_barrier(const core::ImageView &image_view, const ImageMemoryBarrier &memory_barrier) const -{ - // Adjust barrier's subresource range for depth images - auto subresource_range = image_view.get_subresource_range(); - auto format = image_view.get_format(); - if (is_depth_only_format(format)) - { - subresource_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - } - else if (is_depth_stencil_format(format)) - { - subresource_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - } - - vkb::image_layout_transition(get_handle(), - image_view.get_image().get_handle(), - memory_barrier.src_stage_mask, - memory_barrier.dst_stage_mask, - memory_barrier.src_access_mask, - memory_barrier.dst_access_mask, - memory_barrier.old_layout, - memory_barrier.new_layout, - subresource_range); -} - -void CommandBuffer::buffer_memory_barrier(const vkb::core::BufferC &buffer, VkDeviceSize offset, VkDeviceSize size, const BufferMemoryBarrier &memory_barrier) -{ - VkBufferMemoryBarrier buffer_memory_barrier{VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER}; - buffer_memory_barrier.srcAccessMask = memory_barrier.src_access_mask; - buffer_memory_barrier.dstAccessMask = memory_barrier.dst_access_mask; - buffer_memory_barrier.buffer = buffer.get_handle(); - buffer_memory_barrier.offset = offset; - buffer_memory_barrier.size = size; - - VkPipelineStageFlags src_stage_mask = memory_barrier.src_stage_mask; - VkPipelineStageFlags dst_stage_mask = memory_barrier.dst_stage_mask; - - vkCmdPipelineBarrier( - get_handle(), - src_stage_mask, - dst_stage_mask, - 0, - 0, nullptr, - 1, &buffer_memory_barrier, - 0, nullptr); -} - -void CommandBuffer::flush_pipeline_state(VkPipelineBindPoint pipeline_bind_point) -{ - // Create a new pipeline only if the graphics state changed - if (!pipeline_state.is_dirty()) - { - return; - } - - pipeline_state.clear_dirty(); - - // Create and bind pipeline - if (pipeline_bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS) - { - pipeline_state.set_render_pass(*current_render_pass.render_pass); - auto &pipeline = get_device().get_resource_cache().request_graphics_pipeline(pipeline_state); - - vkCmdBindPipeline(get_handle(), - pipeline_bind_point, - pipeline.get_handle()); - } - else if (pipeline_bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) - { - auto &pipeline = get_device().get_resource_cache().request_compute_pipeline(pipeline_state); - - vkCmdBindPipeline(get_handle(), - pipeline_bind_point, - pipeline.get_handle()); - } - else - { - throw "Only graphics and compute pipeline bind points are supported now"; - } -} - -void CommandBuffer::flush_descriptor_state(VkPipelineBindPoint pipeline_bind_point) -{ - assert(command_pool.get_render_frame() && "The command pool must be associated to a render frame"); - - const auto &pipeline_layout = pipeline_state.get_pipeline_layout(); - - std::unordered_set update_descriptor_sets; - - // Iterate over the shader sets to check if they have already been bound - // If they have, add the set so that the command buffer later updates it - for (auto &set_it : pipeline_layout.get_shader_sets()) - { - uint32_t descriptor_set_id = set_it.first; - - auto descriptor_set_layout_it = descriptor_set_layout_binding_state.find(descriptor_set_id); - - if (descriptor_set_layout_it != descriptor_set_layout_binding_state.end()) - { - if (descriptor_set_layout_it->second->get_handle() != pipeline_layout.get_descriptor_set_layout(descriptor_set_id).get_handle()) - { - update_descriptor_sets.emplace(descriptor_set_id); - } - } - } - - // Validate that the bound descriptor set layouts exist in the pipeline layout - for (auto set_it = descriptor_set_layout_binding_state.begin(); set_it != descriptor_set_layout_binding_state.end();) - { - if (!pipeline_layout.has_descriptor_set_layout(set_it->first)) - { - set_it = descriptor_set_layout_binding_state.erase(set_it); - } - else - { - ++set_it; - } - } - - // Check if a descriptor set needs to be created - if (resource_binding_state.is_dirty() || !update_descriptor_sets.empty()) - { - resource_binding_state.clear_dirty(); - - // Iterate over all of the resource sets bound by the command buffer - for (auto &resource_set_it : resource_binding_state.get_resource_sets()) - { - uint32_t descriptor_set_id = resource_set_it.first; - auto &resource_set = resource_set_it.second; - - // Don't update resource set if it's not in the update list OR its state hasn't changed - if (!resource_set.is_dirty() && (update_descriptor_sets.find(descriptor_set_id) == update_descriptor_sets.end())) - { - continue; - } - - // Clear dirty flag for resource set - resource_binding_state.clear_dirty(descriptor_set_id); - - // Skip resource set if a descriptor set layout doesn't exist for it - if (!pipeline_layout.has_descriptor_set_layout(descriptor_set_id)) - { - continue; - } - - auto &descriptor_set_layout = pipeline_layout.get_descriptor_set_layout(descriptor_set_id); - - // Make descriptor set layout bound for current set - descriptor_set_layout_binding_state[descriptor_set_id] = &descriptor_set_layout; - - BindingMap buffer_infos; - BindingMap image_infos; - - std::vector dynamic_offsets; - - // Iterate over all resource bindings - for (auto &binding_it : resource_set.get_resource_bindings()) - { - auto binding_index = binding_it.first; - auto &binding_resources = binding_it.second; - - // Check if binding exists in the pipeline layout - if (auto binding_info = descriptor_set_layout.get_layout_binding(binding_index)) - { - // Iterate over all binding resources - for (auto &element_it : binding_resources) - { - auto array_element = element_it.first; - auto &resource_info = element_it.second; - - // Pointer references - auto &buffer = resource_info.buffer; - auto &sampler = resource_info.sampler; - auto &image_view = resource_info.image_view; - - // Get buffer info - if (buffer != nullptr && is_buffer_descriptor_type(binding_info->descriptorType)) - { - VkDescriptorBufferInfo buffer_info{}; - - buffer_info.buffer = resource_info.buffer->get_handle(); - buffer_info.offset = resource_info.offset; - buffer_info.range = resource_info.range; - - if (is_dynamic_buffer_descriptor_type(binding_info->descriptorType)) - { - dynamic_offsets.push_back(to_u32(buffer_info.offset)); - - buffer_info.offset = 0; - } - - buffer_infos[binding_index][array_element] = buffer_info; - } - - // Get image info - else if (image_view != nullptr || sampler != nullptr) - { - // Can be null for input attachments - VkDescriptorImageInfo image_info{}; - image_info.sampler = sampler ? sampler->get_handle() : VK_NULL_HANDLE; - image_info.imageView = image_view->get_handle(); - - if (image_view != nullptr) - { - // Add image layout info based on descriptor type - switch (binding_info->descriptorType) - { - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - break; - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - if (is_depth_format(image_view->get_format())) - { - image_info.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; - } - else - { - image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - } - break; - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - image_info.imageLayout = VK_IMAGE_LAYOUT_GENERAL; - break; - - default: - continue; - } - } - - image_infos[binding_index][array_element] = image_info; - } - } - - assert((!update_after_bind || - (buffer_infos.count(binding_index) > 0 || (image_infos.count(binding_index) > 0))) && - "binding index with no buffer or image infos can't be checked for adding to bindings_to_update"); - } - } - - VkDescriptorSet descriptor_set_handle = - command_pool.get_render_frame()->request_descriptor_set(descriptor_set_layout, - buffer_infos, - image_infos, - update_after_bind, - command_pool.get_thread_index()); - - // Bind descriptor set - vkCmdBindDescriptorSets(get_handle(), - pipeline_bind_point, - pipeline_layout.get_handle(), - descriptor_set_id, - 1, &descriptor_set_handle, - to_u32(dynamic_offsets.size()), - dynamic_offsets.data()); - } - } -} - -void CommandBuffer::flush_push_constants() -{ - if (stored_push_constants.empty()) - { - return; - } - - const PipelineLayout &pipeline_layout = pipeline_state.get_pipeline_layout(); - - VkShaderStageFlags shader_stage = pipeline_layout.get_push_constant_range_stage(to_u32(stored_push_constants.size())); - - if (shader_stage) - { - vkCmdPushConstants(get_handle(), pipeline_layout.get_handle(), shader_stage, 0, to_u32(stored_push_constants.size()), stored_push_constants.data()); - } - else - { - LOGW("Push constant range [{}, {}] not found", 0, stored_push_constants.size()); - } - - stored_push_constants.clear(); -} - -void CommandBuffer::set_update_after_bind(bool update_after_bind_) -{ - update_after_bind = update_after_bind_; -} - -const CommandBuffer::RenderPassBinding &CommandBuffer::get_current_render_pass() const -{ - return current_render_pass; -} - -const uint32_t CommandBuffer::get_current_subpass_index() const -{ - return pipeline_state.get_subpass_index(); -} - -const bool CommandBuffer::is_render_size_optimal(const VkExtent2D &framebuffer_extent, const VkRect2D &render_area) -{ - auto render_area_granularity = current_render_pass.render_pass->get_render_area_granularity(); - - return ((render_area.offset.x % render_area_granularity.width == 0) && (render_area.offset.y % render_area_granularity.height == 0) && - ((render_area.extent.width % render_area_granularity.width == 0) || (render_area.offset.x + render_area.extent.width == framebuffer_extent.width)) && - ((render_area.extent.height % render_area_granularity.height == 0) || (render_area.offset.y + render_area.extent.height == framebuffer_extent.height))); -} - -void CommandBuffer::reset_query_pool(const QueryPool &query_pool, uint32_t first_query, uint32_t query_count) -{ - vkCmdResetQueryPool(get_handle(), query_pool.get_handle(), first_query, query_count); -} - -void CommandBuffer::begin_query(const QueryPool &query_pool, uint32_t query, VkQueryControlFlags flags) -{ - vkCmdBeginQuery(get_handle(), query_pool.get_handle(), query, flags); -} - -void CommandBuffer::end_query(const QueryPool &query_pool, uint32_t query) -{ - vkCmdEndQuery(get_handle(), query_pool.get_handle(), query); -} - -void CommandBuffer::write_timestamp(VkPipelineStageFlagBits pipeline_stage, - const QueryPool &query_pool, uint32_t query) -{ - vkCmdWriteTimestamp(get_handle(), pipeline_stage, query_pool.get_handle(), query); -} - -VkResult CommandBuffer::reset(ResetMode reset_mode) -{ - VkResult result = VK_SUCCESS; - - assert(reset_mode == command_pool.get_reset_mode() && "Command buffer reset mode must match the one used by the pool to allocate it"); - - if (reset_mode == ResetMode::ResetIndividually) - { - result = vkResetCommandBuffer(get_handle(), VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); - } - - return result; -} - -RenderPass &CommandBuffer::get_render_pass(const vkb::RenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector> &subpasses) -{ - // Create render pass - assert(subpasses.size() > 0 && "Cannot create a render pass without any subpass"); - - std::vector subpass_infos(subpasses.size()); - auto subpass_info_it = subpass_infos.begin(); - for (auto &subpass : subpasses) - { - subpass_info_it->input_attachments = subpass->get_input_attachments(); - subpass_info_it->output_attachments = subpass->get_output_attachments(); - subpass_info_it->color_resolve_attachments = subpass->get_color_resolve_attachments(); - subpass_info_it->disable_depth_stencil_attachment = subpass->get_disable_depth_stencil_attachment(); - subpass_info_it->depth_stencil_resolve_mode = subpass->get_depth_stencil_resolve_mode(); - subpass_info_it->depth_stencil_resolve_attachment = subpass->get_depth_stencil_resolve_attachment(); - subpass_info_it->debug_name = subpass->get_debug_name(); - - ++subpass_info_it; - } - - return get_device().get_resource_cache().request_render_pass(render_target.get_attachments(), load_store_infos, subpass_infos); -} -} // namespace vkb diff --git a/framework/core/command_buffer.h b/framework/core/command_buffer.h index 28e66a9ba8..de14177596 100644 --- a/framework/core/command_buffer.h +++ b/framework/core/command_buffer.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,83 +18,96 @@ #pragma once -#include - -#include "common/helpers.h" -#include "common/vk_common.h" -#include "core/buffer.h" +#include "common/hpp_vk_common.h" +#include "core/device.h" +#include "core/hpp_descriptor_set_layout.h" +#include "core/hpp_framebuffer.h" +#include "core/hpp_render_pass.h" +#include "core/hpp_sampler.h" #include "core/image.h" -#include "core/image_view.h" -#include "core/query_pool.h" -#include "core/sampler.h" -#include "core/vulkan_resource.h" -#include "rendering/pipeline_state.h" -#include "rendering/render_target.h" -#include "resource_binding_state.h" +#include "core/physical_device.h" +#include "hpp_resource_binding_state.h" +#include "rendering/hpp_pipeline_state.h" +#include "rendering/hpp_render_target.h" +#include "rendering/subpass.h" +#include "resource_cache.h" namespace vkb { -class CommandPool; -class DescriptorSet; -class Framebuffer; -class Pipeline; -class PipelineLayout; -class PipelineState; -class RenderTarget; -class Subpass; -struct LightingState; +class QueryPool; -namespace rendering +namespace core { -template -struct LightingState; -using LightingStateC = LightingState; -template -class Subpass; -using SubpassC = Subpass; -} // namespace rendering +class HPPQueryPool; /** * @brief Helper class to manage and record a command buffer, building and * keeping track of pipeline state and resource bindings */ -class CommandBuffer : public vkb::core::VulkanResourceC +template +class CommandBuffer + : public vkb::core::VulkanResource::type> { - public: - enum class ResetMode - { - ResetPool, - ResetIndividually, - AlwaysAllocate, - }; - - /** - * @brief Helper structure used to track render pass state - */ - struct RenderPassBinding - { - const RenderPass *render_pass; - - const Framebuffer *framebuffer; - }; - - CommandBuffer(CommandPool &command_pool, VkCommandBufferLevel level); + using ParentType = + vkb::core::VulkanResource::type>; - CommandBuffer(const CommandBuffer &) = delete; - - CommandBuffer(CommandBuffer &&other); + public: + using BufferImageCopyType = typename std::conditional::type; + using ClearAttachmentType = typename std::conditional::type; + using ClearRectType = typename std::conditional::type; + using ClearValueType = typename std::conditional::type; + using CommandBufferLevelType = typename std::conditional::type; + using CommandBufferType = typename std::conditional::type; + using CommandBufferUsageFlagsType = + typename std::conditional::type; + using DeviceSizeType = typename std::conditional::type; + using ImageBlitType = typename std::conditional::type; + using ImageCopyType = typename std::conditional::type; + using ImageLayoutType = typename std::conditional::type; + using ImageResolveType = typename std::conditional::type; + using IndexTypeType = typename std::conditional::type; + using PipelineStagFlagBitsType = + typename std::conditional::type; + using QueryControlFlagsType = typename std::conditional::type; + using Rect2DType = typename std::conditional::type; + using ResultType = typename std::conditional::type; + using SubpassContentsType = typename std::conditional::type; + using ViewportType = typename std::conditional::type; + + using BufferMemoryBarrierType = + typename std::conditional::type; + using ColorBlendStateType = + typename std::conditional::type; + using DepthStencilStateType = + typename std::conditional::type; + using FramebufferType = typename std::conditional::type; + using ImageMemoryBarrierType = + typename std::conditional::type; + using ImageType = typename std::conditional::type; + using ImageViewType = typename std::conditional::type; + using InputAssemblyStateType = + typename std::conditional::type; + using LoadStoreInfoType = typename std::conditional::type; + using MultisampleStateType = + typename std::conditional::type; + using PipelineLayoutType = typename std::conditional::type; + using QueryPoolType = typename std::conditional::type; + using RasterizationStateType = + typename std::conditional::type; + using RenderPassType = typename std::conditional::type; + using RenderTargetType = typename std::conditional::type; + using SamplerType = typename std::conditional::type; + using VertexInputStateType = + typename std::conditional::type; + using ViewportStateType = typename std::conditional::type; + public: + CommandBuffer(vkb::core::CommandPool &command_pool, CommandBufferLevelType level); ~CommandBuffer(); - - CommandBuffer &operator=(const CommandBuffer &) = delete; - - CommandBuffer &operator=(CommandBuffer &&) = delete; - - /** - * @brief Flushes the command buffer, pushing the new changes - * @param pipeline_bind_point The type of pipeline we want to flush - */ - void flush(VkPipelineBindPoint pipeline_bind_point); + CommandBuffer(CommandBuffer &&other) = default; + CommandBuffer &operator=(CommandBuffer &&) = default; + CommandBuffer(CommandBuffer const &) = delete; + CommandBuffer &operator=(CommandBuffer const &) = delete; /** * @brief Sets the command buffer so that it is ready for recording @@ -101,9 +115,8 @@ class CommandBuffer : public vkb::core::VulkanResourceC * primary command buffer it inherits from must be provided * @param flags Usage behavior for the command buffer * @param primary_cmd_buf (optional) - * @return Whether it succeeded or not */ - VkResult begin(VkCommandBufferUsageFlags flags, CommandBuffer *primary_cmd_buf = nullptr); + void begin(CommandBufferUsageFlagsType flags, CommandBuffer *primary_cmd_buf = nullptr); /** * @brief Sets the command buffer so that it is ready for recording @@ -113,206 +126,1407 @@ class CommandBuffer : public vkb::core::VulkanResourceC * @param render_pass * @param framebuffer * @param subpass_index - * @return Whether it succeeded or not */ - VkResult begin(VkCommandBufferUsageFlags flags, const RenderPass *render_pass, const Framebuffer *framebuffer, uint32_t subpass_index); - - VkResult end(); - - void clear(VkClearAttachment info, VkClearRect rect); - - void begin_render_pass(const RenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector &clear_values, - const std::vector> &subpasses, - VkSubpassContents contents = VK_SUBPASS_CONTENTS_INLINE); - - void begin_render_pass(const RenderTarget &render_target, const RenderPass &render_pass, const Framebuffer &framebuffer, const std::vector &clear_values, VkSubpassContents contents = VK_SUBPASS_CONTENTS_INLINE); - - void next_subpass(); - - void execute_commands(CommandBuffer &secondary_command_buffer); - - void execute_commands(std::vector &secondary_command_buffers); - - void end_render_pass(); - - void bind_pipeline_layout(PipelineLayout &pipeline_layout); - - template - void set_specialization_constant(uint32_t constant_id, const T &data); - - void set_specialization_constant(uint32_t constant_id, const std::vector &data); + void begin(CommandBufferUsageFlagsType flags, const RenderPassType *render_pass, const FramebufferType *framebuffer, uint32_t subpass_index); + + void begin_query(QueryPoolType const &query_pool, uint32_t query, QueryControlFlagsType flags); + void begin_render_pass(RenderTargetType const &render_target, + std::vector const &load_store_infos, + std::vector const &clear_values, + std::vector>> const &subpasses, + SubpassContentsType contents = VK_SUBPASS_CONTENTS_INLINE); + void begin_render_pass(RenderTargetType const &render_target, + RenderPassType const &render_pass, + FramebufferType const &framebuffer, + std::vector const &clear_values, + SubpassContentsType contents = vk::SubpassContents::eInline); + void bind_buffer(vkb::core::Buffer const &buffer, DeviceSizeType offset, DeviceSizeType range, uint32_t set, uint32_t binding, uint32_t array_element); + void bind_image(ImageViewType const &image_view, SamplerType const &sampler, uint32_t set, uint32_t binding, uint32_t array_element); + void bind_image(ImageViewType const &image_view, uint32_t set, uint32_t binding, uint32_t array_element); + void bind_index_buffer(vkb::core::Buffer const &buffer, DeviceSizeType offset, IndexTypeType index_type); + void bind_input(ImageViewType const &image_view, uint32_t set, uint32_t binding, uint32_t array_element); + void bind_lighting(vkb::rendering::LightingState &lighting_state, uint32_t set, uint32_t binding); + void bind_pipeline_layout(PipelineLayoutType &pipeline_layout); + void bind_vertex_buffers(uint32_t first_binding, + std::vector>> const &buffers, + std::vector const &offsets); + void blit_image(ImageType const &src_img, ImageType const &dst_img, std::vector const ®ions); + void buffer_memory_barrier(vkb::core::Buffer const &buffer, DeviceSizeType offset, DeviceSizeType size, BufferMemoryBarrierType const &memory_barrier); + void clear(ClearAttachmentType const &info, ClearRectType const &rect); + void copy_buffer(vkb::core::Buffer const &src_buffer, vkb::core::Buffer const &dst_buffer, DeviceSizeType size); + void copy_buffer_to_image(vkb::core::Buffer const &buffer, ImageType const &image, std::vector const ®ions); + void copy_image(ImageType const &src_img, ImageType const &dst_img, std::vector const ®ions); + void copy_image_to_buffer(ImageType const &image, + ImageLayoutType image_layout, + vkb::core::Buffer const &buffer, + std::vector const ®ions); + void dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z); + void dispatch_indirect(vkb::core::Buffer const &buffer, DeviceSizeType offset); + void draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance); + void draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance); + void draw_indexed_indirect(vkb::core::Buffer const &buffer, DeviceSizeType offset, uint32_t draw_count, uint32_t stride); + void end(); + void end_query(QueryPoolType const &query_pool, uint32_t query); + void end_render_pass(); + void execute_commands(vkb::core::CommandBuffer &secondary_command_buffer); + void execute_commands(std::vector>> &secondary_command_buffers); + CommandBufferLevelType get_level() const; + RenderPassType &get_render_pass(RenderTargetType const &render_target, + std::vector const &load_store_infos, + std::vector>> const &subpasses); + void image_memory_barrier(ImageViewType const &image_view, ImageMemoryBarrierType const &memory_barrier) const; + void image_memory_barrier(RenderTargetType &render_target, uint32_t view_index, ImageMemoryBarrierType const &memory_barrier) const; + void next_subpass(); /** * @brief Records byte data into the command buffer to be pushed as push constants to each draw call * @param values The byte data to store */ void push_constants(const std::vector &values); - template - void push_constants(const T &value) - { - auto data = to_bytes(value); - - uint32_t size = to_u32(stored_push_constants.size() + data.size()); - - if (size > max_push_constants_size) - { - LOGE("Push constant limit exceeded ({} / {} bytes)", size, max_push_constants_size); - throw std::runtime_error("Cannot overflow push constant limit"); - } - - stored_push_constants.insert(stored_push_constants.end(), data.begin(), data.end()); - } - - void bind_buffer(const vkb::core::BufferC &buffer, VkDeviceSize offset, VkDeviceSize range, uint32_t set, uint32_t binding, uint32_t array_element); + void push_constants(const T &value); - void bind_image(const core::ImageView &image_view, const core::Sampler &sampler, uint32_t set, uint32_t binding, uint32_t array_element); + /** + * @brief Reset the command buffer to a state where it can be recorded to + * @param reset_mode How to reset the buffer, should match the one used by the pool to allocate it + */ + ResultType reset(vkb::CommandBufferResetMode reset_mode); - void bind_image(const core::ImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element); + void reset_query_pool(QueryPoolType const &query_pool, uint32_t first_query, uint32_t query_count); + void resolve_image(ImageType const &src_img, ImageType const &dst_img, std::vector const ®ions); + void set_blend_constants(std::array const &blend_constants); + void set_color_blend_state(ColorBlendStateType const &state_info); + void set_depth_bias(float depth_bias_constant_factor, float depth_bias_clamp, float depth_bias_slope_factor); + void set_depth_bounds(float min_depth_bounds, float max_depth_bounds); + void set_depth_stencil_state(DepthStencilStateType const &state_info); + void set_input_assembly_state(InputAssemblyStateType const &state_info); + void set_line_width(float line_width); + void set_multisample_state(MultisampleStateType const &state_info); + void set_rasterization_state(RasterizationStateType const &state_info); + void set_scissor(uint32_t first_scissor, std::vector const &scissors); - void bind_input(const core::ImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element); + template + void set_specialization_constant(uint32_t constant_id, T const &data); + void set_specialization_constant(uint32_t constant_id, std::vector const &data); - void bind_vertex_buffers(uint32_t first_binding, const std::vector> &buffers, const std::vector &offsets); + void set_update_after_bind(bool update_after_bind_); + void set_vertex_input_state(VertexInputStateType const &state_info); + void set_viewport(uint32_t first_viewport, std::vector const &viewports); + void set_viewport_state(ViewportStateType const &state_info); + void update_buffer(vkb::core::Buffer const &buffer, DeviceSizeType offset, std::vector const &data); + void write_timestamp(PipelineStagFlagBitsType pipeline_stage, QueryPoolType const &query_pool, uint32_t query); - void bind_index_buffer(const vkb::core::BufferC &buffer, VkDeviceSize offset, VkIndexType index_type); + private: + /** + * @brief Flushes the command buffer, pushing the new changes + */ + void flush(vk::PipelineBindPoint pipeline_bind_point); - void bind_lighting(vkb::rendering::LightingStateC &lighting_state, uint32_t set, uint32_t binding); + /** + * @brief Flush the push constant state + */ + void flush_push_constants(); - void set_viewport_state(const ViewportState &state_info); + /** + * @brief Check that the render area is an optimal size by comparing to the render area granularity + */ + bool is_render_size_optimal(const vk::Extent2D &extent, const vk::Rect2D &render_area); - void set_vertex_input_state(const VertexInputState &state_info); + private: + void begin_impl(vk::CommandBufferUsageFlags flags, vkb::core::CommandBuffer *primary_cmd_buf); + void begin_impl(vk::CommandBufferUsageFlags flags, + vkb::core::HPPRenderPass const *render_pass, + vkb::core::HPPFramebuffer const *framebuffer, + uint32_t subpass_index); + void begin_render_pass_impl(vkb::rendering::HPPRenderTarget const &render_target, + vkb::core::HPPRenderPass const &render_pass, + vkb::core::HPPFramebuffer const &framebuffer, + std::vector const &clear_values, + vk::SubpassContents contents); + void bind_vertex_buffers_impl(uint32_t first_binding, + std::vector> const &buffers, + std::vector const &offsets); + void buffer_memory_barrier_impl(vkb::core::BufferCpp const &buffer, + vk::DeviceSize offset, + vk::DeviceSize size, + vkb::common::HPPBufferMemoryBarrier const &memory_barrier); + void copy_buffer_impl(vkb::core::BufferCpp const &src_buffer, vkb::core::BufferCpp const &dst_buffer, vk::DeviceSize size); + void execute_commands_impl(std::vector>> &secondary_command_buffers); + void flush_impl(vkb::core::DeviceCpp &device, vk::PipelineBindPoint pipeline_bind_point); + void flush_descriptor_state_impl(vk::PipelineBindPoint pipeline_bind_point); + void flush_pipeline_state_impl(vkb::core::DeviceCpp &device, vk::PipelineBindPoint pipeline_bind_point); + vkb::core::HPPRenderPass &get_render_pass_impl(vkb::core::DeviceCpp &device, + vkb::rendering::HPPRenderTarget const &render_target, + std::vector const &load_store_infos, + std::vector> const &subpasses); + void image_memory_barrier_impl(vkb::core::HPPImageView const &image_view, vkb::common::HPPImageMemoryBarrier const &memory_barrier) const; + vk::Result reset_impl(vkb::CommandBufferResetMode reset_mode); - void set_input_assembly_state(const InputAssemblyState &state_info); + private: + vkb::core::CommandPoolCpp &command_pool; + vkb::core::HPPFramebuffer const *current_framebuffer = nullptr; + vkb::core::HPPRenderPass const *current_render_pass = nullptr; + std::unordered_map descriptor_set_layout_binding_state; + vk::Extent2D last_framebuffer_extent = {}; + vk::Extent2D last_render_area_extent = {}; + const vk::CommandBufferLevel level = {}; + const uint32_t max_push_constants_size = {}; + vkb::rendering::HPPPipelineState pipeline_state = {}; + vkb::HPPResourceBindingState resource_binding_state = {}; + std::vector stored_push_constants = {}; - void set_rasterization_state(const RasterizationState &state_info); + // If true, it becomes the responsibility of the caller to update ANY descriptor bindings + // that contain update after bind, as they wont be implicitly updated + bool update_after_bind = false; +}; - void set_multisample_state(const MultisampleState &state_info); +using CommandBufferC = CommandBuffer; +using CommandBufferCpp = CommandBuffer; - void set_depth_stencil_state(const DepthStencilState &state_info); +} // namespace core +} // namespace vkb - void set_color_blend_state(const ColorBlendState &state_info); +#include "core/command_pool.h" +#include "core/device.h" +#include "rendering/render_frame.h" - void set_viewport(uint32_t first_viewport, const std::vector &viewports); +namespace vkb +{ +namespace core +{ +template +inline vkb::core::CommandBuffer::CommandBuffer(vkb::core::CommandPool &command_pool_, CommandBufferLevelType level_) : + vkb::core::VulkanResource(nullptr, &command_pool_.get_device()), level(static_cast(level_)), command_pool(reinterpret_cast(command_pool_)), max_push_constants_size(command_pool_.get_device().get_gpu().get_properties().limits.maxPushConstantsSize) +{ + vk::CommandBufferAllocateInfo allocate_info{.commandPool = command_pool.get_handle(), .level = level, .commandBufferCount = 1}; - void set_scissor(uint32_t first_scissor, const std::vector &scissors); + this->set_handle(this->get_device().get_resource().allocateCommandBuffers(allocate_info).front()); +} - void set_line_width(float line_width); +template +inline CommandBuffer::~CommandBuffer() +{ + // Destroy command buffer + if (this->has_handle()) + { + this->get_device().get_resource().freeCommandBuffers(command_pool.get_handle(), this->get_resource()); + } +} - void set_depth_bias(float depth_bias_constant_factor, float depth_bias_clamp, float depth_bias_slope_factor); +template +inline void CommandBuffer::begin(CommandBufferUsageFlagsType flags, + vkb::core::CommandBuffer *primary_cmd_buf) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + begin_impl(flags, primary_cmd_buf); + } + else + { + begin_impl(static_cast(flags), primary_cmd_buf); + } +} - void set_blend_constants(const std::array &blend_constants); +template +inline void CommandBuffer::begin_impl(vk::CommandBufferUsageFlags flags, vkb::core::CommandBuffer *primary_cmd_buf) +{ + if (level == vk::CommandBufferLevel::eSecondary) + { + assert(primary_cmd_buf && "A primary command buffer pointer must be provided when calling begin from a secondary one"); - void set_depth_bounds(float min_depth_bounds, float max_depth_bounds); + return begin_impl(flags, primary_cmd_buf->current_render_pass, primary_cmd_buf->current_framebuffer, primary_cmd_buf->pipeline_state.get_subpass_index()); + } + else + { + return begin_impl(flags, nullptr, nullptr, 0); + } +} - void draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance); +template +inline void CommandBuffer::begin(CommandBufferUsageFlagsType flags, + const RenderPassType *render_pass, + const FramebufferType *framebuffer, + uint32_t subpass_index) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + begin_impl(flags, render_pass, framebuffer, subpass_index); + } + else + { + begin_impl(static_cast(flags), + reinterpret_cast(render_pass), + reinterpret_cast(framebuffer), + subpass_index); + } +} - void draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance); +template +inline void CommandBuffer::begin_impl(vk::CommandBufferUsageFlags flags, + vkb::core::HPPRenderPass const *render_pass, + vkb::core::HPPFramebuffer const *framebuffer, + uint32_t subpass_index) +{ + // Reset state + pipeline_state.reset(); + resource_binding_state.reset(); + descriptor_set_layout_binding_state.clear(); + stored_push_constants.clear(); - void draw_indexed_indirect(const vkb::core::BufferC &buffer, VkDeviceSize offset, uint32_t draw_count, uint32_t stride); + vk::CommandBufferBeginInfo begin_info{.flags = flags}; + vk::CommandBufferInheritanceInfo inheritance; - void dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z); + if (level == vk::CommandBufferLevel::eSecondary) + { + assert((render_pass && framebuffer) && "Render pass and framebuffer must be provided when calling begin from a secondary one"); - void dispatch_indirect(const vkb::core::BufferC &buffer, VkDeviceSize offset); + current_render_pass = render_pass; + current_framebuffer = framebuffer; - void update_buffer(const vkb::core::BufferC &buffer, VkDeviceSize offset, const std::vector &data); + inheritance.renderPass = current_render_pass->get_handle(); + inheritance.framebuffer = current_framebuffer->get_handle(); + inheritance.subpass = subpass_index; - void blit_image(const core::Image &src_img, const core::Image &dst_img, const std::vector ®ions); + begin_info.pInheritanceInfo = &inheritance; + } - void resolve_image(const core::Image &src_img, const core::Image &dst_img, const std::vector ®ions); + this->get_resource().begin(begin_info); +} - void copy_buffer(const vkb::core::BufferC &src_buffer, const vkb::core::BufferC &dst_buffer, VkDeviceSize size); +template +inline void CommandBuffer::begin_query(QueryPoolType const &query_pool, uint32_t query, QueryControlFlagsType flags) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().beginQuery(query_pool.get_resource(), query, flags); + } + else + { + this->get_resource().beginQuery(static_cast(query_pool.get_handle()), query, static_cast(flags)); + } +} - void copy_image(const core::Image &src_img, const core::Image &dst_img, const std::vector ®ions); +template +inline void CommandBuffer::begin_render_pass(RenderTargetType const &render_target, + std::vector const &load_store_infos, + std::vector const &clear_values, + std::vector>> const &subpasses, + SubpassContentsType contents) +{ + // Reset state + pipeline_state.reset(); + resource_binding_state.reset(); + descriptor_set_layout_binding_state.clear(); - void copy_buffer_to_image(const vkb::core::BufferC &buffer, const core::Image &image, const std::vector ®ions); + auto &render_pass = get_render_pass(render_target, load_store_infos, subpasses); + auto &framebuffer = this->get_device().get_resource_cache().request_framebuffer(render_target, render_pass); - void copy_image_to_buffer(const core::Image &image, VkImageLayout image_layout, const vkb::core::BufferC &buffer, const std::vector ®ions); + begin_render_pass(render_target, render_pass, framebuffer, clear_values, contents); +} - void image_memory_barrier(const core::ImageView &image_view, const ImageMemoryBarrier &memory_barrier) const; +template +inline void CommandBuffer::begin_render_pass(RenderTargetType const &render_target, + RenderPassType const &render_pass, + FramebufferType const &framebuffer, + std::vector const &clear_values, + SubpassContentsType contents) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + begin_render_pass_impl(render_target, render_pass, framebuffer, clear_values, contents); + } + else + { + begin_render_pass_impl(reinterpret_cast(render_target), + reinterpret_cast(render_pass), + reinterpret_cast(framebuffer), + reinterpret_cast const &>(clear_values), + static_cast(contents)); + } +} - void buffer_memory_barrier(const vkb::core::BufferC &buffer, VkDeviceSize offset, VkDeviceSize size, const BufferMemoryBarrier &memory_barrier); +template +inline void CommandBuffer::begin_render_pass_impl(vkb::rendering::HPPRenderTarget const &render_target, + vkb::core::HPPRenderPass const &render_pass, + vkb::core::HPPFramebuffer const &framebuffer, + std::vector const &clear_values, + vk::SubpassContents contents) +{ + current_render_pass = &render_pass; + current_framebuffer = &framebuffer; - void set_update_after_bind(bool update_after_bind_); + // Begin render pass + vk::RenderPassBeginInfo begin_info{.renderPass = current_render_pass->get_handle(), + .framebuffer = current_framebuffer->get_handle(), + .renderArea = {.extent = render_target.get_extent()}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; - void reset_query_pool(const QueryPool &query_pool, uint32_t first_query, uint32_t query_count); + const auto &framebuffer_extent = current_framebuffer->get_extent(); - void begin_query(const QueryPool &query_pool, uint32_t query, VkQueryControlFlags flags); + // Test the requested render area to confirm that it is optimal and could not cause a performance reduction + if (!is_render_size_optimal(framebuffer_extent, begin_info.renderArea)) + { + // Only prints the warning if the framebuffer or render area are different since the last time the render size was not optimal + if ((framebuffer_extent != last_framebuffer_extent) || (begin_info.renderArea.extent != last_render_area_extent)) + { + LOGW("Render target extent is not an optimal size, this may result in reduced performance."); + } - void end_query(const QueryPool &query_pool, uint32_t query); + last_framebuffer_extent = framebuffer_extent; + last_render_area_extent = begin_info.renderArea.extent; + } - void write_timestamp(VkPipelineStageFlagBits pipeline_stage, const QueryPool &query_pool, uint32_t query); + this->get_resource().beginRenderPass(begin_info, contents); - /** - * @brief Reset the command buffer to a state where it can be recorded to - * @param reset_mode How to reset the buffer, should match the one used by the pool to allocate it - */ - VkResult reset(ResetMode reset_mode); + // Update blend state attachments for first subpass + auto blend_state = pipeline_state.get_color_blend_state(); + blend_state.attachments.resize(current_render_pass->get_color_output_count(pipeline_state.get_subpass_index())); + pipeline_state.set_color_blend_state(blend_state); +} - RenderPass &get_render_pass(const vkb::RenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector> &subpasses); +template +inline void CommandBuffer::bind_buffer( + vkb::core::Buffer const &buffer, DeviceSizeType offset, DeviceSizeType range, uint32_t set, uint32_t binding, uint32_t array_element) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + resource_binding_state.bind_buffer(buffer, offset, range, set, binding, array_element); + } + else + { + resource_binding_state.bind_buffer( + reinterpret_cast const &>(buffer), offset, range, set, binding, array_element); + } +} - const VkCommandBufferLevel level; +template +inline void CommandBuffer::bind_image( + ImageViewType const &image_view, SamplerType const &sampler, uint32_t set, uint32_t binding, uint32_t array_element) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + resource_binding_state.bind_image(image_view, sampler, set, binding, array_element); + } + else + { + resource_binding_state.bind_image(reinterpret_cast(image_view), + reinterpret_cast(sampler), + set, + binding, + array_element); + } +} - private: - CommandPool &command_pool; +template +inline void CommandBuffer::bind_image(ImageViewType const &image_view, uint32_t set, uint32_t binding, uint32_t array_element) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + resource_binding_state.bind_image(image_view, set, binding, array_element); + } + else + { + resource_binding_state.bind_image(reinterpret_cast(image_view), set, binding, array_element); + } +} - RenderPassBinding current_render_pass; +template +inline void CommandBuffer::bind_index_buffer(vkb::core::Buffer const &buffer, DeviceSizeType offset, IndexTypeType index_type) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().bindIndexBuffer(buffer.get_resource(), offset, index_type); + } + else + { + this->get_resource().bindIndexBuffer(buffer.get_resource(), static_cast(offset), static_cast(index_type)); + } +} - PipelineState pipeline_state; +template +inline void CommandBuffer::bind_input(ImageViewType const &image_view, uint32_t set, uint32_t binding, uint32_t array_element) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + resource_binding_state.bind_input(image_view, set, binding, array_element); + } + else + { + resource_binding_state.bind_input(reinterpret_cast(image_view), set, binding, array_element); + } +} - ResourceBindingState resource_binding_state; +template +inline void CommandBuffer::bind_lighting(vkb::rendering::LightingState &lighting_state, uint32_t set, uint32_t binding) +{ + bind_buffer(lighting_state.light_buffer.get_buffer(), lighting_state.light_buffer.get_offset(), lighting_state.light_buffer.get_size(), set, binding, 0); - std::vector stored_push_constants; + set_specialization_constant(0, to_u32(lighting_state.directional_lights.size())); + set_specialization_constant(1, to_u32(lighting_state.point_lights.size())); + set_specialization_constant(2, to_u32(lighting_state.spot_lights.size())); +} - uint32_t max_push_constants_size; +template +inline void CommandBuffer::bind_pipeline_layout(PipelineLayoutType &pipeline_layout) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_pipeline_layout(pipeline_layout); + } + else + { + pipeline_state.set_pipeline_layout(reinterpret_cast(pipeline_layout)); + } +} - VkExtent2D last_framebuffer_extent{}; +template +inline void CommandBuffer::bind_vertex_buffers(uint32_t first_binding, + std::vector>> const &buffers, + std::vector const &offsets) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + bind_vertex_buffers_impl(first_binding, buffers, offsets); + } + else + { + bind_vertex_buffers_impl(first_binding, + reinterpret_cast> const &>(buffers), + reinterpret_cast const &>(offsets)); + } +} - VkExtent2D last_render_area_extent{}; +template +inline void CommandBuffer::bind_vertex_buffers_impl(uint32_t first_binding, + std::vector> const &buffers, + std::vector const &offsets) +{ + std::vector buffer_handles(buffers.size(), nullptr); + std::transform(buffers.begin(), buffers.end(), buffer_handles.begin(), [](auto const &buffer) { return buffer.get().get_handle(); }); + this->get_resource().bindVertexBuffers(first_binding, buffer_handles, offsets); +} - // If true, it becomes the responsibility of the caller to update ANY descriptor bindings - // that contain update after bind, as they wont be implicitly updated - bool update_after_bind{false}; +template +inline void CommandBuffer::blit_image(ImageType const &src_img, ImageType const &dst_img, std::vector const ®ions) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().blitImage(src_img.get_handle(), + vk::ImageLayout::eTransferSrcOptimal, + dst_img.get_handle(), + vk::ImageLayout::eTransferDstOptimal, + regions, + vk::Filter::eNearest); + } + else + { + this->get_resource().blitImage(src_img.get_resource(), + vk::ImageLayout::eTransferSrcOptimal, + dst_img.get_resource(), + vk::ImageLayout::eTransferDstOptimal, + reinterpret_cast const &>(regions), + vk::Filter::eNearest); + } +} - std::unordered_map descriptor_set_layout_binding_state; +template +inline void CommandBuffer::buffer_memory_barrier(vkb::core::Buffer const &buffer, + DeviceSizeType offset, + DeviceSizeType size, + BufferMemoryBarrierType const &memory_barrier) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + buffer_memory_barrier_impl(buffer, offset, size, memory_barrier); + } + else + { + buffer_memory_barrier_impl(reinterpret_cast(buffer), + static_cast(offset), + static_cast(size), + reinterpret_cast(memory_barrier)); + } +} - const RenderPassBinding &get_current_render_pass() const; +template +inline void CommandBuffer::buffer_memory_barrier_impl(vkb::core::BufferCpp const &buffer, + vk::DeviceSize offset, + vk::DeviceSize size, + vkb::common::HPPBufferMemoryBarrier const &memory_barrier) +{ + vk::BufferMemoryBarrier buffer_memory_barrier{.srcAccessMask = memory_barrier.src_access_mask, + .dstAccessMask = memory_barrier.dst_access_mask, + .buffer = buffer.get_handle(), + .offset = offset, + .size = size}; - const uint32_t get_current_subpass_index() const; + this->get_resource().pipelineBarrier(memory_barrier.src_stage_mask, memory_barrier.dst_stage_mask, {}, {}, buffer_memory_barrier, {}); +} - /** - * @brief Check that the render area is an optimal size by comparing to the render area granularity - */ - const bool is_render_size_optimal(const VkExtent2D &extent, const VkRect2D &render_area); +template +inline void CommandBuffer::clear(ClearAttachmentType const &attachment, ClearRectType const &rect) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().clearAttachments(attachment, rect); + } + else + { + this->get_resource().clearAttachments(reinterpret_cast(attachment), reinterpret_cast(rect)); + } +} - /** - * @brief Flush the pipeline state - */ - void flush_pipeline_state(VkPipelineBindPoint pipeline_bind_point); +template +inline void CommandBuffer::copy_buffer(vkb::core::Buffer const &src_buffer, + vkb::core::Buffer const &dst_buffer, + DeviceSizeType size) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + copy_buffer_impl(src_buffer, dst_buffer, size); + } + else + { + copy_buffer_impl(reinterpret_cast(src_buffer), + reinterpret_cast(dst_buffer), + static_cast(size)); + } +} - /** - * @brief Flush the descriptor set state - */ - void flush_descriptor_state(VkPipelineBindPoint pipeline_bind_point); +template +inline void + CommandBuffer::copy_buffer_impl(vkb::core::BufferCpp const &src_buffer, vkb::core::BufferCpp const &dst_buffer, vk::DeviceSize size) +{ + vk::BufferCopy copy_region{.size = size}; + this->get_resource().copyBuffer(src_buffer.get_handle(), dst_buffer.get_handle(), copy_region); +} - /** - * @brief Flush the push constant state - */ - void flush_push_constants(); -}; +template +inline void CommandBuffer::copy_buffer_to_image(vkb::core::Buffer const &buffer, + ImageType const &image, + std::vector const ®ions) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().copyBufferToImage(buffer.get_handle(), image.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions); + } + else + { + this->get_resource().copyBufferToImage(buffer.get_resource(), + image.get_resource(), + vk::ImageLayout::eTransferDstOptimal, + reinterpret_cast const &>(regions)); + } +} -template -inline void CommandBuffer::set_specialization_constant(uint32_t constant_id, const T &data) +template +inline void CommandBuffer::copy_image(ImageType const &src_img, ImageType const &dst_img, std::vector const ®ions) { - set_specialization_constant(constant_id, to_bytes(data)); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().copyImage(src_img.get_handle(), vk::ImageLayout::eTransferSrcOptimal, dst_img.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions); + } + else + { + this->get_resource().copyImage(src_img.get_resource(), + vk::ImageLayout::eTransferSrcOptimal, + dst_img.get_resource(), + vk::ImageLayout::eTransferDstOptimal, + reinterpret_cast const &>(regions)); + } } -template <> -inline void CommandBuffer::set_specialization_constant(std::uint32_t constant_id, const bool &data) +template +inline void CommandBuffer::copy_image_to_buffer(ImageType const &image, + ImageLayoutType image_layout, + vkb::core::Buffer const &buffer, + std::vector const ®ions) { - set_specialization_constant(constant_id, to_bytes(to_u32(data))); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().copyImageToBuffer(image.get_handle(), image_layout, buffer.get_handle(), regions); + } + else + { + this->get_resource().copyImageToBuffer(image.get_resource(), + static_cast(image_layout), + buffer.get_resource(), + reinterpret_cast const &>(regions)); + } +} + +template +inline void CommandBuffer::dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z) +{ + flush(vk::PipelineBindPoint::eCompute); + this->get_resource().dispatch(group_count_x, group_count_y, group_count_z); +} + +template +inline void CommandBuffer::dispatch_indirect(vkb::core::Buffer const &buffer, DeviceSizeType offset) +{ + flush(vk::PipelineBindPoint::eCompute); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().dispatchIndirect(buffer.get_handle(), offset); + } + else + { + this->get_resource().dispatchIndirect(buffer.get_resource(), static_cast(offset)); + } +} + +template +inline void CommandBuffer::draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance) +{ + flush(vk::PipelineBindPoint::eGraphics); + this->get_resource().draw(vertex_count, instance_count, first_vertex, first_instance); +} + +template +inline void CommandBuffer::draw_indexed( + uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance) +{ + flush(vk::PipelineBindPoint::eGraphics); + this->get_resource().drawIndexed(index_count, instance_count, first_index, vertex_offset, first_instance); +} + +template +inline void CommandBuffer::draw_indexed_indirect(vkb::core::Buffer const &buffer, DeviceSizeType offset, uint32_t draw_count, uint32_t stride) +{ + flush(vk::PipelineBindPoint::eGraphics); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().drawIndexedIndirect(buffer.get_handle(), offset, draw_count, stride); + } + else + { + this->get_resource().drawIndexedIndirect(buffer.get_resource(), static_cast(offset), draw_count, stride); + } +} + +template +inline void CommandBuffer::end() +{ + this->get_resource().end(); +} + +template +inline void CommandBuffer::end_query(QueryPoolType const &query_pool, uint32_t query) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().endQuery(query_pool.get_handle(), query); + } + else + { + this->get_resource().endQuery(static_cast(query_pool.get_handle()), query); + } +} + +template +inline void CommandBuffer::end_render_pass() +{ + this->get_resource().endRenderPass(); +} + +template +inline typename CommandBuffer::CommandBufferLevelType CommandBuffer::get_level() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return level; + } + else + { + return static_cast(level); + } +} + +template +inline void CommandBuffer::execute_commands(vkb::core::CommandBuffer &secondary_command_buffer) +{ + this->get_resource().executeCommands(secondary_command_buffer.get_resource()); +} + +template +inline void CommandBuffer::execute_commands(std::vector>> &secondary_command_buffers) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + execute_commands_impl(secondary_command_buffers); + } + else + { + execute_commands_impl(reinterpret_cast> &>(secondary_command_buffers)); + } +} + +template +inline void CommandBuffer::execute_commands_impl(std::vector>> &secondary_command_buffers) +{ + std::vector sec_cmd_buf_handles(secondary_command_buffers.size(), nullptr); + std::transform(secondary_command_buffers.begin(), + secondary_command_buffers.end(), + sec_cmd_buf_handles.begin(), + [](auto const &sec_cmd_buf) { return sec_cmd_buf->get_handle(); }); + this->get_resource().executeCommands(sec_cmd_buf_handles); +} + +template +inline typename vkb::core::CommandBuffer::RenderPassType & + CommandBuffer::get_render_pass(RenderTargetType const &render_target, + std::vector const &load_store_infos, + std::vector>> const &subpasses) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return get_render_pass_impl(this->get_device(), render_target, load_store_infos, subpasses); + } + else + { + return reinterpret_cast( + get_render_pass_impl(reinterpret_cast(this->get_device()), + reinterpret_cast(render_target), + reinterpret_cast const &>(load_store_infos), + reinterpret_cast> const &>(subpasses))); + } +} + +template +inline vkb::core::HPPRenderPass & + CommandBuffer::get_render_pass_impl(vkb::core::DeviceCpp &device, + vkb::rendering::HPPRenderTarget const &render_target, + std::vector const &load_store_infos, + std::vector> const &subpasses) +{ + // Create render pass + assert(subpasses.size() > 0 && "Cannot create a render pass without any subpass"); + + std::vector subpass_infos(subpasses.size()); + auto subpass_info_it = subpass_infos.begin(); + for (auto &subpass : subpasses) + { + subpass_info_it->input_attachments = subpass->get_input_attachments(); + subpass_info_it->output_attachments = subpass->get_output_attachments(); + subpass_info_it->color_resolve_attachments = subpass->get_color_resolve_attachments(); + subpass_info_it->disable_depth_stencil_attachment = subpass->get_disable_depth_stencil_attachment(); + subpass_info_it->depth_stencil_resolve_mode = subpass->get_depth_stencil_resolve_mode(); + subpass_info_it->depth_stencil_resolve_attachment = subpass->get_depth_stencil_resolve_attachment(); + subpass_info_it->debug_name = subpass->get_debug_name(); + + ++subpass_info_it; + } + + return device.get_resource_cache().request_render_pass(render_target.get_attachments(), load_store_infos, subpass_infos); +} + +template +inline void CommandBuffer::image_memory_barrier(RenderTargetType &render_target, uint32_t view_index, ImageMemoryBarrierType const &memory_barrier) const +{ + auto const &image_view = render_target.get_views()[view_index]; + + if constexpr (bindingType == vkb::BindingType::Cpp) + { + image_memory_barrier_impl(image_view, memory_barrier); + } + else + { + image_memory_barrier_impl(reinterpret_cast(image_view), + reinterpret_cast(memory_barrier)); + } + + render_target.set_layout(view_index, memory_barrier.new_layout); +} + +template +inline void CommandBuffer::image_memory_barrier(ImageViewType const &image_view, ImageMemoryBarrierType const &memory_barrier) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + image_memory_barrier_impl(image_view, memory_barrier); + } + else + { + image_memory_barrier_impl(reinterpret_cast(image_view), + reinterpret_cast(memory_barrier)); + } +} + +template +inline void CommandBuffer::image_memory_barrier_impl(vkb::core::HPPImageView const &image_view, + vkb::common::HPPImageMemoryBarrier const &memory_barrier) const +{ + // Adjust barrier's subresource range for depth images + auto subresource_range = image_view.get_subresource_range(); + auto format = image_view.get_format(); + if (vkb::common::is_depth_only_format(format)) + { + subresource_range.aspectMask = vk::ImageAspectFlagBits::eDepth; + } + else if (vkb::common::is_depth_stencil_format(format)) + { + subresource_range.aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil; + } + + // This can cause a queue family ownership transfer. Check the async_compute sample. + vk::ImageMemoryBarrier image_memory_barrier{.srcAccessMask = memory_barrier.src_access_mask, + .dstAccessMask = memory_barrier.dst_access_mask, + .oldLayout = memory_barrier.old_layout, + .newLayout = memory_barrier.new_layout, + .srcQueueFamilyIndex = memory_barrier.src_queue_family, + .dstQueueFamilyIndex = memory_barrier.dst_queue_family, + .image = image_view.get_image().get_handle(), + .subresourceRange = subresource_range}; + + vk::PipelineStageFlags src_stage_mask = memory_barrier.src_stage_mask; + vk::PipelineStageFlags dst_stage_mask = memory_barrier.dst_stage_mask; + + this->get_resource().pipelineBarrier(src_stage_mask, dst_stage_mask, {}, {}, {}, image_memory_barrier); +} + +template +inline void CommandBuffer::next_subpass() +{ + // Increment subpass index + pipeline_state.set_subpass_index(pipeline_state.get_subpass_index() + 1); + + // Update blend state attachments + auto blend_state = pipeline_state.get_color_blend_state(); + blend_state.attachments.resize(current_render_pass->get_color_output_count(pipeline_state.get_subpass_index())); + pipeline_state.set_color_blend_state(blend_state); + + // Reset descriptor sets + resource_binding_state.reset(); + descriptor_set_layout_binding_state.clear(); + + // Clear stored push constants + stored_push_constants.clear(); + + this->get_resource().nextSubpass(vk::SubpassContents::eInline); +} + +template +inline void CommandBuffer::push_constants(const std::vector &values) +{ + uint32_t push_constant_size = to_u32(stored_push_constants.size() + values.size()); + + if (push_constant_size > max_push_constants_size) + { + LOGE("Push constant limit of {} exceeded (pushing {} bytes for a total of {} bytes)", max_push_constants_size, values.size(), push_constant_size); + throw std::runtime_error("Push constant limit exceeded."); + } + else + { + stored_push_constants.insert(stored_push_constants.end(), values.begin(), values.end()); + } +} + +template +template +inline void CommandBuffer::push_constants(const T &value) +{ + auto data = to_bytes(value); + + uint32_t size = to_u32(stored_push_constants.size() + data.size()); + + if (size > max_push_constants_size) + { + LOGE("Push constant limit exceeded ({} / {} bytes)", size, max_push_constants_size); + throw std::runtime_error("Cannot overflow push constant limit"); + } + + stored_push_constants.insert(stored_push_constants.end(), data.begin(), data.end()); +} + +template +inline typename CommandBuffer::ResultType CommandBuffer::reset(vkb::CommandBufferResetMode reset_mode) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return reset_impl(reset_mode); + } + else + { + return static_cast(reset_impl(reset_mode)); + } +} + +template +inline vk::Result CommandBuffer::reset_impl(vkb::CommandBufferResetMode reset_mode) +{ + assert(reset_mode == command_pool.get_reset_mode() && "Command buffer reset mode must match the one used by the pool to allocate it"); + if (reset_mode == vkb::CommandBufferResetMode::ResetIndividually) + { + this->get_resource().reset(vk::CommandBufferResetFlagBits::eReleaseResources); + } + + return vk::Result::eSuccess; +} + +template +inline void CommandBuffer::reset_query_pool(QueryPoolType const &query_pool, uint32_t first_query, uint32_t query_count) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().resetQueryPool(query_pool.get_handle(), first_query, query_count); + } + else + { + this->get_resource().resetQueryPool(static_cast(query_pool.get_handle()), first_query, query_count); + } +} + +template +inline void CommandBuffer::resolve_image(ImageType const &src_img, ImageType const &dst_img, std::vector const ®ions) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().resolveImage( + src_img.get_handle(), vk::ImageLayout::eTransferSrcOptimal, dst_img.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions); + } + else + { + this->get_resource().resolveImage(src_img.get_resource(), + vk::ImageLayout::eTransferSrcOptimal, + dst_img.get_resource(), + vk::ImageLayout::eTransferDstOptimal, + reinterpret_cast const &>(regions)); + } +} + +template +inline void CommandBuffer::set_blend_constants(std::array const &blend_constants) +{ + this->get_resource().setBlendConstants(blend_constants.data()); +} + +template +inline void CommandBuffer::set_color_blend_state(ColorBlendStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_color_blend_state(state_info); + } + else + { + pipeline_state.set_color_blend_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::set_depth_bias(float depth_bias_constant_factor, float depth_bias_clamp, float depth_bias_slope_factor) +{ + this->get_resource().setDepthBias(depth_bias_constant_factor, depth_bias_clamp, depth_bias_slope_factor); +} + +template +inline void CommandBuffer::set_depth_bounds(float min_depth_bounds, float max_depth_bounds) +{ + this->get_handle().setDepthBounds(min_depth_bounds, max_depth_bounds); +} + +template +inline void CommandBuffer::set_depth_stencil_state(DepthStencilStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_depth_stencil_state(state_info); + } + else + { + pipeline_state.set_depth_stencil_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::set_input_assembly_state(InputAssemblyStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_input_assembly_state(state_info); + } + else + { + pipeline_state.set_input_assembly_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::set_line_width(float line_width) +{ + this->get_resource().setLineWidth(line_width); +} + +template +inline void CommandBuffer::set_multisample_state(MultisampleStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_multisample_state(state_info); + } + else + { + pipeline_state.set_multisample_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::set_rasterization_state(RasterizationStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_rasterization_state(state_info); + } + else + { + pipeline_state.set_rasterization_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::set_scissor(uint32_t first_scissor, std::vector const &scissors) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().setScissor(first_scissor, scissors); + } + else + { + this->get_resource().setScissor(first_scissor, reinterpret_cast const &>(scissors)); + } +} + +template +template +inline void CommandBuffer::set_specialization_constant(uint32_t constant_id, T const &data) +{ + if constexpr (std::is_same::value) + { + set_specialization_constant(constant_id, to_bytes(to_u32(data))); + } + else + { + set_specialization_constant(constant_id, to_bytes(data)); + } +} + +template +inline void CommandBuffer::set_specialization_constant(uint32_t constant_id, std::vector const &data) +{ + pipeline_state.set_specialization_constant(constant_id, data); +} + +template +inline void CommandBuffer::set_update_after_bind(bool update_after_bind_) +{ + update_after_bind = update_after_bind_; +} + +template +inline void CommandBuffer::set_vertex_input_state(VertexInputStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_vertex_input_state(state_info); + } + else + { + pipeline_state.set_vertex_input_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::set_viewport(uint32_t first_viewport, std::vector const &viewports) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().setViewport(first_viewport, viewports); + } + else + { + this->get_resource().setViewport(first_viewport, reinterpret_cast const &>(viewports)); + } +} + +template +inline void CommandBuffer::set_viewport_state(ViewportStateType const &state_info) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + pipeline_state.set_viewport_state(state_info); + } + else + { + pipeline_state.set_viewport_state(reinterpret_cast(state_info)); + } +} + +template +inline void CommandBuffer::update_buffer(vkb::core::Buffer const &buffer, DeviceSizeType offset, std::vector const &data) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().template updateBuffer(buffer.get_handle(), offset, data); + } + else + { + this->get_resource().template updateBuffer(buffer.get_resource(), static_cast(offset), data); + } +} + +template +inline void CommandBuffer::write_timestamp(PipelineStagFlagBitsType pipeline_stage, QueryPoolType const &query_pool, uint32_t query) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_resource().writeTimestamp(pipeline_stage, query_pool.get_handle(), query); + } + else + { + this->get_resource().writeTimestamp(static_cast(pipeline_stage), query_pool.get_handle(), query); + } +} + +template +inline void CommandBuffer::flush(vk::PipelineBindPoint pipeline_bind_point) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + flush_impl(this->get_device(), pipeline_bind_point); + } + else + { + flush_impl(reinterpret_cast(this->get_device()), pipeline_bind_point); + } +} + +template +inline void CommandBuffer::flush_impl(vkb::core::DeviceCpp &device, vk::PipelineBindPoint pipeline_bind_point) +{ + flush_pipeline_state_impl(device, pipeline_bind_point); + flush_push_constants(); + flush_descriptor_state_impl(pipeline_bind_point); +} + +template +inline void CommandBuffer::flush_descriptor_state_impl(vk::PipelineBindPoint pipeline_bind_point) +{ + assert(command_pool.get_render_frame() && "The command pool must be associated to a render frame"); + + const auto &pipeline_layout = pipeline_state.get_pipeline_layout(); + + std::unordered_set update_descriptor_sets; + + // Iterate over the shader sets to check if they have already been bound + // If they have, add the set so that the command buffer later updates it + for (auto &set_it : pipeline_layout.get_shader_sets()) + { + uint32_t descriptor_set_id = set_it.first; + + auto descriptor_set_layout_it = descriptor_set_layout_binding_state.find(descriptor_set_id); + + if (descriptor_set_layout_it != descriptor_set_layout_binding_state.end()) + { + if (descriptor_set_layout_it->second->get_handle() != pipeline_layout.get_descriptor_set_layout(descriptor_set_id).get_handle()) + { + update_descriptor_sets.emplace(descriptor_set_id); + } + } + } + + // Validate that the bound descriptor set layouts exist in the pipeline layout + for (auto set_it = descriptor_set_layout_binding_state.begin(); set_it != descriptor_set_layout_binding_state.end();) + { + if (!pipeline_layout.has_descriptor_set_layout(set_it->first)) + { + set_it = descriptor_set_layout_binding_state.erase(set_it); + } + else + { + ++set_it; + } + } + + // Check if a descriptor set needs to be created + if (resource_binding_state.is_dirty() || !update_descriptor_sets.empty()) + { + resource_binding_state.clear_dirty(); + + // Iterate over all of the resource sets bound by the command buffer + for (auto &resource_set_it : resource_binding_state.get_resource_sets()) + { + uint32_t descriptor_set_id = resource_set_it.first; + auto &resource_set = resource_set_it.second; + + // Don't update resource set if it's not in the update list OR its state hasn't changed + if (!resource_set.is_dirty() && (update_descriptor_sets.find(descriptor_set_id) == update_descriptor_sets.end())) + { + continue; + } + + // Clear dirty flag for resource set + resource_binding_state.clear_dirty(descriptor_set_id); + + // Skip resource set if a descriptor set layout doesn't exist for it + if (!pipeline_layout.has_descriptor_set_layout(descriptor_set_id)) + { + continue; + } + + auto &descriptor_set_layout = pipeline_layout.get_descriptor_set_layout(descriptor_set_id); + + // Make descriptor set layout bound for current set + descriptor_set_layout_binding_state[descriptor_set_id] = &descriptor_set_layout; + + BindingMap buffer_infos; + BindingMap image_infos; + + std::vector dynamic_offsets; + + // Iterate over all resource bindings + for (auto &binding_it : resource_set.get_resource_bindings()) + { + auto binding_index = binding_it.first; + auto &binding_resources = binding_it.second; + + // Check if binding exists in the pipeline layout + if (auto binding_info = descriptor_set_layout.get_layout_binding(binding_index)) + { + // Iterate over all binding resources + for (auto &element_it : binding_resources) + { + auto array_element = element_it.first; + auto &resource_info = element_it.second; + + // Pointer references + auto &buffer = resource_info.buffer; + auto &sampler = resource_info.sampler; + auto &image_view = resource_info.image_view; + + // Get buffer info + if (buffer != nullptr && vkb::common::is_buffer_descriptor_type(binding_info->descriptorType)) + { + vk::DescriptorBufferInfo buffer_info{resource_info.buffer->get_handle(), resource_info.offset, resource_info.range}; + + if (vkb::common::is_dynamic_buffer_descriptor_type(binding_info->descriptorType)) + { + dynamic_offsets.push_back(to_u32(buffer_info.offset)); + buffer_info.offset = 0; + } + + buffer_infos[binding_index][array_element] = buffer_info; + } + + // Get image info + else if (image_view != nullptr || sampler != nullptr) + { + // Can be null for input attachments + vk::DescriptorImageInfo image_info{sampler ? sampler->get_handle() : nullptr, image_view->get_handle()}; + + if (image_view != nullptr) + { + // Add image layout info based on descriptor type + switch (binding_info->descriptorType) + { + case vk::DescriptorType::eCombinedImageSampler: + image_info.imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal; + break; + case vk::DescriptorType::eInputAttachment: + image_info.imageLayout = vkb::common::is_depth_format(image_view->get_format()) ? vk::ImageLayout::eDepthStencilReadOnlyOptimal : vk::ImageLayout::eShaderReadOnlyOptimal; + break; + case vk::DescriptorType::eStorageImage: + image_info.imageLayout = vk::ImageLayout::eGeneral; + break; + default: + continue; + } + } + + image_infos[binding_index][array_element] = image_info; + } + } + + assert((!update_after_bind || (buffer_infos.count(binding_index) > 0 || (image_infos.count(binding_index) > 0))) && + "binding index with no buffer or image infos can't be checked for adding to bindings_to_update"); + } + } + + vk::DescriptorSet descriptor_set_handle = command_pool.get_render_frame()->request_descriptor_set( + descriptor_set_layout, buffer_infos, image_infos, update_after_bind, command_pool.get_thread_index()); + + // Bind descriptor set + this->get_resource().bindDescriptorSets(pipeline_bind_point, pipeline_layout.get_handle(), descriptor_set_id, descriptor_set_handle, dynamic_offsets); + } + } +} + +template +inline void CommandBuffer::flush_pipeline_state_impl(vkb::core::DeviceCpp &device, vk::PipelineBindPoint pipeline_bind_point) +{ + // Create a new pipeline only if the graphics state changed + if (!pipeline_state.is_dirty()) + { + return; + } + + pipeline_state.clear_dirty(); + + // Create and bind pipeline + if (pipeline_bind_point == vk::PipelineBindPoint::eGraphics) + { + pipeline_state.set_render_pass(*current_render_pass); + auto &pipeline = device.get_resource_cache().request_graphics_pipeline(pipeline_state); + + this->get_resource().bindPipeline(pipeline_bind_point, pipeline.get_handle()); + } + else if (pipeline_bind_point == vk::PipelineBindPoint::eCompute) + { + auto &pipeline = device.get_resource_cache().request_compute_pipeline(pipeline_state); + + this->get_resource().bindPipeline(pipeline_bind_point, pipeline.get_handle()); + } + else + { + throw "Only graphics and compute pipeline bind points are supported now"; + } +} + +template +inline void CommandBuffer::flush_push_constants() +{ + if (stored_push_constants.empty()) + { + return; + } + + auto const &pipeline_layout = pipeline_state.get_pipeline_layout(); + + vk::ShaderStageFlags shader_stage = pipeline_layout.get_push_constant_range_stage(to_u32(stored_push_constants.size())); + + if (shader_stage) + { + this->get_resource().template pushConstants(pipeline_layout.get_handle(), shader_stage, 0, stored_push_constants); + } + else + { + LOGW("Push constant range [{}, {}] not found", 0, stored_push_constants.size()); + } + + stored_push_constants.clear(); +} + +template +inline bool CommandBuffer::is_render_size_optimal(const vk::Extent2D &framebuffer_extent, const vk::Rect2D &render_area) +{ + auto render_area_granularity = current_render_pass->get_render_area_granularity(); + + return ((render_area.offset.x % render_area_granularity.width == 0) && (render_area.offset.y % render_area_granularity.height == 0) && + ((render_area.extent.width % render_area_granularity.width == 0) || + (render_area.offset.x + render_area.extent.width == framebuffer_extent.width)) && + ((render_area.extent.height % render_area_granularity.height == 0) || + (render_area.offset.y + render_area.extent.height == framebuffer_extent.height))); } +} // namespace core } // namespace vkb diff --git a/framework/core/command_pool.cpp b/framework/core/command_pool.cpp deleted file mode 100644 index e47a9cf55b..0000000000 --- a/framework/core/command_pool.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "command_pool.h" - -#include "device.h" -#include "rendering/render_frame.h" - -namespace vkb -{ -CommandPool::CommandPool(Device &d, uint32_t queue_family_index, RenderFrame *render_frame, size_t thread_index, CommandBuffer::ResetMode reset_mode) : - device{d}, - render_frame{render_frame}, - thread_index{thread_index}, - reset_mode{reset_mode} -{ - VkCommandPoolCreateFlags flags; - switch (reset_mode) - { - case CommandBuffer::ResetMode::ResetIndividually: - case CommandBuffer::ResetMode::AlwaysAllocate: - flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - break; - case CommandBuffer::ResetMode::ResetPool: - default: - flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT; - break; - } - - VkCommandPoolCreateInfo create_info{VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO}; - - create_info.queueFamilyIndex = queue_family_index; - create_info.flags = flags; - - auto result = vkCreateCommandPool(device.get_handle(), &create_info, nullptr, &handle); - - if (result != VK_SUCCESS) - { - throw VulkanException{result, "Failed to create command pool"}; - } -} - -CommandPool::~CommandPool() -{ - primary_command_buffers.clear(); - secondary_command_buffers.clear(); - - // Destroy command pool - if (handle != VK_NULL_HANDLE) - { - vkDestroyCommandPool(device.get_handle(), handle, nullptr); - } -} - -CommandPool::CommandPool(CommandPool &&other) : - device{other.device}, - handle{other.handle}, - queue_family_index{other.queue_family_index}, - primary_command_buffers{std::move(other.primary_command_buffers)}, - active_primary_command_buffer_count{other.active_primary_command_buffer_count}, - secondary_command_buffers{std::move(other.secondary_command_buffers)}, - active_secondary_command_buffer_count{other.active_secondary_command_buffer_count}, - render_frame{other.render_frame}, - thread_index{other.thread_index}, - reset_mode{other.reset_mode} -{ - other.handle = VK_NULL_HANDLE; - - other.queue_family_index = 0; - - other.active_primary_command_buffer_count = 0; - - other.active_secondary_command_buffer_count = 0; -} - -Device &CommandPool::get_device() -{ - return device; -} - -uint32_t CommandPool::get_queue_family_index() const -{ - return queue_family_index; -} - -VkCommandPool CommandPool::get_handle() const -{ - return handle; -} - -RenderFrame *CommandPool::get_render_frame() -{ - return render_frame; -} - -size_t CommandPool::get_thread_index() const -{ - return thread_index; -} - -VkResult CommandPool::reset_pool() -{ - VkResult result = VK_SUCCESS; - - switch (reset_mode) - { - case CommandBuffer::ResetMode::ResetIndividually: - { - result = reset_command_buffers(); - - break; - } - case CommandBuffer::ResetMode::ResetPool: - { - result = vkResetCommandPool(device.get_handle(), handle, 0); - - if (result != VK_SUCCESS) - { - return result; - } - - result = reset_command_buffers(); - - break; - } - case CommandBuffer::ResetMode::AlwaysAllocate: - { - primary_command_buffers.clear(); - active_primary_command_buffer_count = 0; - - secondary_command_buffers.clear(); - active_secondary_command_buffer_count = 0; - - break; - } - default: - throw std::runtime_error("Unknown reset mode for command pools"); - } - - return result; -} - -VkResult CommandPool::reset_command_buffers() -{ - VkResult result = VK_SUCCESS; - - for (auto &cmd_buf : primary_command_buffers) - { - result = cmd_buf->reset(reset_mode); - - if (result != VK_SUCCESS) - { - return result; - } - } - - active_primary_command_buffer_count = 0; - - for (auto &cmd_buf : secondary_command_buffers) - { - result = cmd_buf->reset(reset_mode); - - if (result != VK_SUCCESS) - { - return result; - } - } - - active_secondary_command_buffer_count = 0; - - return result; -} - -CommandBuffer &CommandPool::request_command_buffer(VkCommandBufferLevel level) -{ - if (level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) - { - if (active_primary_command_buffer_count < primary_command_buffers.size()) - { - return *primary_command_buffers[active_primary_command_buffer_count++]; - } - - primary_command_buffers.emplace_back(std::make_unique(*this, level)); - - active_primary_command_buffer_count++; - - return *primary_command_buffers.back(); - } - else - { - if (active_secondary_command_buffer_count < secondary_command_buffers.size()) - { - return *secondary_command_buffers[active_secondary_command_buffer_count++]; - } - - secondary_command_buffers.emplace_back(std::make_unique(*this, level)); - - active_secondary_command_buffer_count++; - - return *secondary_command_buffers.back(); - } -} - -CommandBuffer::ResetMode const CommandPool::get_reset_mode() const -{ - return reset_mode; -} -} // namespace vkb diff --git a/framework/core/command_pool.h b/framework/core/command_pool.h index 90706f48e2..9620586754 100644 --- a/framework/core/command_pool.h +++ b/framework/core/command_pool.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2019, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,69 +18,166 @@ #pragma once -#include "common/helpers.h" -#include "common/vk_common.h" -#include "core/command_buffer.h" +#include "core/command_pool_base.h" +#include "core/device.h" +#include namespace vkb { -class Device; +namespace rendering +{ +template class RenderFrame; +using RenderFrameC = RenderFrame; +using RenderFrameCpp = RenderFrame; +} // namespace rendering -class CommandPool +namespace core { - public: - CommandPool(Device &device, uint32_t queue_family_index, RenderFrame *render_frame = nullptr, - size_t thread_index = 0, - CommandBuffer::ResetMode reset_mode = CommandBuffer::ResetMode::ResetPool); - - CommandPool(const CommandPool &) = delete; - - CommandPool(CommandPool &&other); - - ~CommandPool(); - - CommandPool &operator=(const CommandPool &) = delete; - - CommandPool &operator=(CommandPool &&) = delete; - - Device &get_device(); - - uint32_t get_queue_family_index() const; - - VkCommandPool get_handle() const; - - RenderFrame *get_render_frame(); - - size_t get_thread_index() const; - - VkResult reset_pool(); - - CommandBuffer &request_command_buffer(VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY); - - const CommandBuffer::ResetMode get_reset_mode() const; - - private: - Device &device; - - VkCommandPool handle{VK_NULL_HANDLE}; - - RenderFrame *render_frame{nullptr}; +template +class CommandBuffer; +using CommandBufferC = CommandBuffer; +using CommandBufferCpp = CommandBuffer; - size_t thread_index{0}; +namespace +{ +// type trait to get the default value for request_command_buffer +template +struct DefaultCommandBufferLevelValue; +template <> +struct DefaultCommandBufferLevelValue +{ + static constexpr vk::CommandBufferLevel value = vk::CommandBufferLevel::ePrimary; +}; +template <> +struct DefaultCommandBufferLevelValue +{ + static constexpr VkCommandBufferLevel value = VK_COMMAND_BUFFER_LEVEL_PRIMARY; +}; +} // namespace - uint32_t queue_family_index{0}; +template +class CommandPool : private vkb::core::CommandPoolBase +{ + public: + using CommandBufferLevelType = typename std::conditional::type; + using CommandPoolType = typename std::conditional::type; - std::vector> primary_command_buffers; + public: + CommandPool(vkb::core::Device &device, + uint32_t queue_family_index, + vkb::rendering::RenderFrame *render_frame = nullptr, + size_t thread_index = 0, + vkb::CommandBufferResetMode reset_mode = vkb::CommandBufferResetMode::ResetIndividually); + CommandPool(CommandPool const &) = delete; + CommandPool(CommandPool &&other) = default; + CommandPool &operator=(CommandPool const &) = delete; + CommandPool &operator=(CommandPool &&other) = default; + ~CommandPool() = default; + + vkb::core::Device &get_device(); + CommandPoolType get_handle() const; + uint32_t get_queue_family_index() const; + vkb::rendering::RenderFrame *get_render_frame(); + vkb::CommandBufferResetMode get_reset_mode() const; + size_t get_thread_index() const; + std::shared_ptr> request_command_buffer(CommandBufferLevelType level = DefaultCommandBufferLevelValue::value); + void reset_pool(); +}; - uint32_t active_primary_command_buffer_count{0}; +using CommandPoolC = CommandPool; +using CommandPoolCpp = CommandPool; + +template +inline vkb::core::CommandPool::CommandPool(vkb::core::Device &device, + uint32_t queue_family_index, + vkb::rendering::RenderFrame *render_frame, + size_t thread_index, + vkb::CommandBufferResetMode reset_mode) : + CommandPoolBase(reinterpret_cast(device), + queue_family_index, + reinterpret_cast(render_frame), + thread_index, + reset_mode) +{} + +template +inline typename vkb::core::Device &CommandPool::get_device() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return CommandPoolBase::get_device(); + } + else + { + return reinterpret_cast(CommandPoolBase::get_device()); + } +} + +template +inline typename vkb::core::CommandPool::CommandPoolType CommandPool::get_handle() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return CommandPoolBase::get_handle(); + } + else + { + return static_cast(CommandPoolBase::get_handle()); + } +} + +template +inline uint32_t CommandPool::get_queue_family_index() const +{ + return CommandPoolBase::get_queue_family_index(); +} - std::vector> secondary_command_buffers; +template +inline vkb::rendering::RenderFrame *CommandPool::get_render_frame() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return CommandPoolBase::get_render_frame(); + } + else + { + return reinterpret_cast(CommandPoolBase::get_render_frame()); + } +} + +template +inline vkb::CommandBufferResetMode CommandPool::get_reset_mode() const +{ + return CommandPoolBase::get_reset_mode(); +} - uint32_t active_secondary_command_buffer_count{0}; +template +inline size_t CommandPool::get_thread_index() const +{ + return CommandPoolBase::get_thread_index(); +} - CommandBuffer::ResetMode reset_mode{CommandBuffer::ResetMode::ResetPool}; +template +std::shared_ptr> CommandPool::request_command_buffer(CommandBufferLevelType level) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return CommandPoolBase::request_command_buffer(*this, level); + } + else + { + std::shared_ptr command_buffer = + CommandPoolBase::request_command_buffer(reinterpret_cast(*this), static_cast(level)); + return *reinterpret_cast *>(&command_buffer); + } +} + +template +inline void CommandPool::reset_pool() +{ + CommandPoolBase::reset_pool(); +} - VkResult reset_command_buffers(); -}; -} // namespace vkb +} // namespace core +} // namespace vkb \ No newline at end of file diff --git a/framework/core/command_pool_base.cpp b/framework/core/command_pool_base.cpp new file mode 100644 index 0000000000..26f4ae8ab7 --- /dev/null +++ b/framework/core/command_pool_base.cpp @@ -0,0 +1,175 @@ +/* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core/command_pool_base.h" +#include "core/command_buffer.h" + +namespace vkb +{ +namespace core +{ +vkb::core::CommandPoolBase::CommandPoolBase(vkb::core::DeviceCpp &device_, + uint32_t queue_family_index, + vkb::rendering::RenderFrameCpp *render_frame_, + size_t thread_index, + vkb::CommandBufferResetMode reset_mode) : + device{device_}, render_frame{render_frame_}, thread_index{thread_index}, reset_mode{reset_mode} +{ + vk::CommandPoolCreateFlags flags; + switch (reset_mode) + { + case vkb::CommandBufferResetMode::ResetIndividually: + case vkb::CommandBufferResetMode::AlwaysAllocate: + flags = vk::CommandPoolCreateFlagBits::eResetCommandBuffer; + break; + case vkb::CommandBufferResetMode::ResetPool: + default: + flags = vk::CommandPoolCreateFlagBits::eTransient; + break; + } + + vk::CommandPoolCreateInfo command_pool_create_info{.flags = flags, .queueFamilyIndex = queue_family_index}; + + handle = device.get_handle().createCommandPool(command_pool_create_info); +} + +CommandPoolBase::CommandPoolBase(CommandPoolBase &&other) : + device{other.device}, + handle{other.handle}, + render_frame{other.render_frame}, + thread_index{other.thread_index}, + queue_family_index{other.queue_family_index}, + primary_command_buffers{std::move(other.primary_command_buffers)}, + active_primary_command_buffer_count{other.active_primary_command_buffer_count}, + secondary_command_buffers{std::move(other.secondary_command_buffers)}, + active_secondary_command_buffer_count{other.active_secondary_command_buffer_count}, + reset_mode{other.reset_mode} +{ + other.handle = nullptr; +} + +CommandPoolBase::~CommandPoolBase() +{ + // clear command buffers before destroying the command pool + primary_command_buffers.clear(); + secondary_command_buffers.clear(); + + // Destroy command pool + if (handle) + { + device.get_handle().destroyCommandPool(handle); + } +} + +vkb::core::DeviceCpp &CommandPoolBase::get_device() +{ + return device; +} + +vk::CommandPool CommandPoolBase::get_handle() const +{ + return handle; +} + +uint32_t CommandPoolBase::get_queue_family_index() const +{ + return queue_family_index; +} + +vkb::rendering::RenderFrameCpp *CommandPoolBase::get_render_frame() +{ + return render_frame; +} + +vkb::CommandBufferResetMode CommandPoolBase::get_reset_mode() const +{ + return reset_mode; +} + +size_t CommandPoolBase::get_thread_index() const +{ + return thread_index; +} + +std::shared_ptr CommandPoolBase::request_command_buffer(vkb::core::CommandPoolCpp &commandPool, vk::CommandBufferLevel level) +{ + if (static_cast(level) == vk::CommandBufferLevel::ePrimary) + { + if (active_primary_command_buffer_count < primary_command_buffers.size()) + { + return primary_command_buffers[active_primary_command_buffer_count++]; + } + + primary_command_buffers.emplace_back(std::make_shared(commandPool, level)); + + active_primary_command_buffer_count++; + + return primary_command_buffers.back(); + } + else + { + if (active_secondary_command_buffer_count < secondary_command_buffers.size()) + { + return secondary_command_buffers[active_secondary_command_buffer_count++]; + } + + secondary_command_buffers.emplace_back(std::make_shared(commandPool, level)); + + active_secondary_command_buffer_count++; + + return secondary_command_buffers.back(); + } +} + +void CommandPoolBase::reset_pool() +{ + switch (reset_mode) + { + case vkb::CommandBufferResetMode::ResetIndividually: + for (auto &cmd_buf : primary_command_buffers) + { + cmd_buf->reset(reset_mode); + } + active_primary_command_buffer_count = 0; + + for (auto &cmd_buf : secondary_command_buffers) + { + cmd_buf->reset(reset_mode); + } + active_secondary_command_buffer_count = 0; + break; + + case vkb::CommandBufferResetMode::ResetPool: + device.get_handle().resetCommandPool(handle); + active_primary_command_buffer_count = 0; + active_secondary_command_buffer_count = 0; + break; + + case vkb::CommandBufferResetMode::AlwaysAllocate: + primary_command_buffers.clear(); + active_primary_command_buffer_count = 0; + secondary_command_buffers.clear(); + active_secondary_command_buffer_count = 0; + break; + + default: + throw std::runtime_error("Unknown reset mode for command pools"); + } +} + +} // namespace core +} // namespace vkb \ No newline at end of file diff --git a/framework/core/command_pool_base.h b/framework/core/command_pool_base.h new file mode 100644 index 0000000000..d0a118239f --- /dev/null +++ b/framework/core/command_pool_base.h @@ -0,0 +1,84 @@ +/* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "common/vk_common.h" +#include +#include + +namespace vkb +{ +namespace rendering +{ +template +class RenderFrame; +using RenderFrameCpp = RenderFrame; +} // namespace rendering + +namespace core +{ +template +class CommandBuffer; +using CommandBufferCpp = CommandBuffer; + +template +class CommandPool; +using CommandPoolCpp = CommandPool; + +template +class Device; +using DeviceCpp = Device; + +class CommandPoolBase +{ + public: + CommandPoolBase(vkb::core::DeviceCpp &device, + uint32_t queue_family_index, + vkb::rendering::RenderFrameCpp *render_frame = nullptr, + size_t thread_index = 0, + vkb::CommandBufferResetMode reset_mode = vkb::CommandBufferResetMode::ResetPool); + CommandPoolBase(CommandPoolBase const &) = delete; + CommandPoolBase(CommandPoolBase &&other); + CommandPoolBase &operator=(CommandPoolBase const &) = delete; + CommandPoolBase &operator=(CommandPoolBase &&other) = delete; + ~CommandPoolBase(); + + protected: + vkb::core::DeviceCpp &get_device(); + vk::CommandPool get_handle() const; + uint32_t get_queue_family_index() const; + vkb::rendering::RenderFrameCpp *get_render_frame(); + vkb::CommandBufferResetMode get_reset_mode() const; + size_t get_thread_index() const; + std::shared_ptr request_command_buffer(vkb::core::CommandPoolCpp &commandPool, vk::CommandBufferLevel level); + void reset_pool(); + + private: + vkb::core::DeviceCpp &device; + vk::CommandPool handle = nullptr; + vkb::rendering::RenderFrameCpp *render_frame = nullptr; + size_t thread_index = 0; + uint32_t queue_family_index = 0; + std::vector> primary_command_buffers; + uint32_t active_primary_command_buffer_count = 0; + std::vector> secondary_command_buffers; + uint32_t active_secondary_command_buffer_count = 0; + vkb::CommandBufferResetMode reset_mode = vkb::CommandBufferResetMode::ResetPool; +}; +} // namespace core +} // namespace vkb diff --git a/framework/core/debug.cpp b/framework/core/debug.cpp index 3fce6d451e..0ec0283516 100644 --- a/framework/core/debug.cpp +++ b/framework/core/debug.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -191,8 +191,7 @@ ScopedDebugLabel::ScopedDebugLabel(const DebugUtils &debug_utils, VkCommandBuffe } } -ScopedDebugLabel::ScopedDebugLabel(const CommandBuffer &command_buffer, - const char *name, glm::vec4 color) : +ScopedDebugLabel::ScopedDebugLabel(const vkb::core::CommandBufferC &command_buffer, const char *name, glm::vec4 color) : ScopedDebugLabel{command_buffer.get_device().get_debug_utils(), command_buffer.get_handle(), name, color} { } diff --git a/framework/core/debug.h b/framework/core/debug.h index a2404441f9..fdf6cd1e40 100644 --- a/framework/core/debug.h +++ b/framework/core/debug.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,6 +23,13 @@ namespace vkb { +namespace core +{ +template +class CommandBuffer; +using CommandBufferC = CommandBuffer; +} // namespace core + /** * @brief An interface over platform-specific debug extensions. */ @@ -32,31 +39,31 @@ class DebugUtils virtual ~DebugUtils() = default; /** - * @brief Sets the debug name for a Vulkan object. - */ + * @brief Sets the debug name for a Vulkan object. + */ virtual void set_debug_name(VkDevice device, VkObjectType object_type, uint64_t object_handle, const char *name) const = 0; /** - * @brief Tags the given Vulkan object with some data. - */ + * @brief Tags the given Vulkan object with some data. + */ virtual void set_debug_tag(VkDevice device, VkObjectType object_type, uint64_t object_handle, uint64_t tag_name, const void *tag_data, size_t tag_data_size) const = 0; /** - * @brief Inserts a command to begin a new debug label/marker scope. - */ + * @brief Inserts a command to begin a new debug label/marker scope. + */ virtual void cmd_begin_label(VkCommandBuffer command_buffer, const char *name, glm::vec4 color = {}) const = 0; /** - * @brief Inserts a command to end the current debug label/marker scope. - */ + * @brief Inserts a command to end the current debug label/marker scope. + */ virtual void cmd_end_label(VkCommandBuffer command_buffer) const = 0; /** - * @brief Inserts a (non-scoped) debug label/marker in the command buffer. - */ + * @brief Inserts a (non-scoped) debug label/marker in the command buffer. + */ virtual void cmd_insert_label(VkCommandBuffer command_buffer, const char *name, glm::vec4 color = {}) const = 0; }; @@ -134,8 +141,6 @@ class DummyDebugUtils final : public DebugUtils {} }; -class CommandBuffer; - /** * @brief A RAII debug label. * If any of EXT_debug_utils or EXT_debug_marker is available, this: @@ -148,8 +153,7 @@ class ScopedDebugLabel final ScopedDebugLabel(const DebugUtils &debug_utils, VkCommandBuffer command_buffer, const char *name, glm::vec4 color = {}); - ScopedDebugLabel(const CommandBuffer &command_buffer, - const char *name, glm::vec4 color = {}); + ScopedDebugLabel(const vkb::core::CommandBufferC &command_buffer, const char *name, glm::vec4 color = {}); ~ScopedDebugLabel(); diff --git a/framework/core/descriptor_pool.cpp b/framework/core/descriptor_pool.cpp index db58541a1b..ee5b7d4ea8 100644 --- a/framework/core/descriptor_pool.cpp +++ b/framework/core/descriptor_pool.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2022, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,7 @@ namespace vkb { -DescriptorPool::DescriptorPool(Device & device, +DescriptorPool::DescriptorPool(vkb::core::DeviceC &device, const DescriptorSetLayout &descriptor_set_layout, uint32_t pool_size) : device{device}, diff --git a/framework/core/descriptor_pool.h b/framework/core/descriptor_pool.h index cc49d2df0a..8e252aa3f1 100644 --- a/framework/core/descriptor_pool.h +++ b/framework/core/descriptor_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,9 +24,15 @@ namespace vkb { -class Device; class DescriptorSetLayout; +namespace core +{ +template +class Device; +using DeviceC = Device; +} // namespace core + /** * @brief Manages an array of fixed size VkDescriptorPool and is able to allocate descriptor sets */ @@ -35,7 +41,7 @@ class DescriptorPool public: static const uint32_t MAX_SETS_PER_POOL = 16; - DescriptorPool(Device & device, + DescriptorPool(vkb::core::DeviceC &device, const DescriptorSetLayout &descriptor_set_layout, uint32_t pool_size = MAX_SETS_PER_POOL); @@ -60,7 +66,7 @@ class DescriptorPool VkResult free(VkDescriptorSet descriptor_set); private: - Device &device; + vkb::core::DeviceC &device; const DescriptorSetLayout *descriptor_set_layout{nullptr}; diff --git a/framework/core/descriptor_set.cpp b/framework/core/descriptor_set.cpp index 5285c0ed86..356f5379cf 100644 --- a/framework/core/descriptor_set.cpp +++ b/framework/core/descriptor_set.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,16 +16,13 @@ */ #include "descriptor_set.h" - #include "common/resource_caching.h" -#include "core/util/logging.hpp" -#include "descriptor_pool.h" -#include "descriptor_set_layout.h" -#include "device.h" +#include "core/device.h" +#include "core/physical_device.h" namespace vkb { -DescriptorSet::DescriptorSet(Device &device, +DescriptorSet::DescriptorSet(vkb::core::DeviceC &device, const DescriptorSetLayout &descriptor_set_layout, DescriptorPool &descriptor_pool, const BindingMap &buffer_infos, @@ -181,7 +178,7 @@ void DescriptorSet::update(const std::vector &bindings_to_update) { const auto &write_operation = write_descriptor_sets[i]; - if (std::find(bindings_to_update.begin(), bindings_to_update.end(), write_operation.dstBinding) != bindings_to_update.end()) + if (std::ranges::find(bindings_to_update, write_operation.dstBinding) != bindings_to_update.end()) { size_t write_operation_hash = 0; hash_param(write_operation_hash, write_operation); diff --git a/framework/core/descriptor_set.h b/framework/core/descriptor_set.h index 17a8c3db84..4f8c935717 100644 --- a/framework/core/descriptor_set.h +++ b/framework/core/descriptor_set.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2022, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,10 +22,16 @@ namespace vkb { -class Device; class DescriptorSetLayout; class DescriptorPool; +namespace core +{ +template +class Device; +using DeviceC = Device; +} // namespace core + /** * @brief A descriptor set handle allocated from a \ref DescriptorPool. * Destroying the handle has no effect, as the pool manages the lifecycle of its descriptor sets. @@ -44,11 +50,11 @@ class DescriptorSet * @param buffer_infos The descriptors that describe buffer data * @param image_infos The descriptors that describe image data */ - DescriptorSet(Device & device, - const DescriptorSetLayout & descriptor_set_layout, - DescriptorPool & descriptor_pool, + DescriptorSet(vkb::core::DeviceC &device, + const DescriptorSetLayout &descriptor_set_layout, + DescriptorPool &descriptor_pool, const BindingMap &buffer_infos = {}, - const BindingMap & image_infos = {}); + const BindingMap &image_infos = {}); DescriptorSet(const DescriptorSet &) = delete; @@ -68,7 +74,7 @@ class DescriptorSet * @param new_image_infos A map of image descriptors and their respective bindings */ void reset(const BindingMap &new_buffer_infos = {}, - const BindingMap & new_image_infos = {}); + const BindingMap &new_image_infos = {}); /** * @brief Updates the contents of the DescriptorSet by performing the write operations @@ -97,7 +103,7 @@ class DescriptorSet void prepare(); private: - Device &device; + vkb::core::DeviceC &device; const DescriptorSetLayout &descriptor_set_layout; diff --git a/framework/core/descriptor_set_layout.cpp b/framework/core/descriptor_set_layout.cpp index 501a1041f2..eb67c0b76a 100644 --- a/framework/core/descriptor_set_layout.cpp +++ b/framework/core/descriptor_set_layout.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -72,10 +72,12 @@ inline VkDescriptorType find_descriptor_type(ShaderResourceType resource_type, b inline bool validate_binding(const VkDescriptorSetLayoutBinding &binding, const std::vector &blacklist) { - return !(std::find_if(blacklist.begin(), blacklist.end(), [binding](const VkDescriptorType &type) { return type == binding.descriptorType; }) != blacklist.end()); + return !(std::ranges::find_if(blacklist, [binding](const VkDescriptorType &type) { return type == binding.descriptorType; }) != blacklist.end()); } -inline bool validate_flags(const PhysicalDevice &gpu, const std::vector &bindings, const std::vector &flags) +inline bool validate_flags(vkb::core::PhysicalDeviceC const &gpu, + const std::vector &bindings, + const std::vector &flags) { // Assume bindings are valid if there are no flags if (flags.empty()) @@ -94,7 +96,7 @@ inline bool validate_flags(const PhysicalDevice &gpu, const std::vector &shader_modules, const std::vector &resource_set) : @@ -157,12 +159,12 @@ DescriptorSetLayout::DescriptorSetLayout(Device & devi // Handle update-after-bind extensions VkDescriptorSetLayoutBindingFlagsCreateInfoEXT binding_flags_create_info{VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT}; - if (std::find_if(resource_set.begin(), resource_set.end(), - [](const ShaderResource &shader_resource) { return shader_resource.mode == ShaderResourceMode::UpdateAfterBind; }) != resource_set.end()) + if (std::ranges::find_if(resource_set, + [](const ShaderResource &shader_resource) { return shader_resource.mode == ShaderResourceMode::UpdateAfterBind; }) != resource_set.end()) { // Spec states you can't have ANY dynamic resources if you have one of the bindings set to update-after-bind - if (std::find_if(resource_set.begin(), resource_set.end(), - [](const ShaderResource &shader_resource) { return shader_resource.mode == ShaderResourceMode::Dynamic; }) != resource_set.end()) + if (std::ranges::find_if(resource_set, + [](const ShaderResource &shader_resource) { return shader_resource.mode == ShaderResourceMode::Dynamic; }) != resource_set.end()) { throw std::runtime_error("Cannot create descriptor set layout, dynamic resources are not allowed if at least one resource is update-after-bind."); } @@ -176,7 +178,7 @@ DescriptorSetLayout::DescriptorSetLayout(Device & devi binding_flags_create_info.pBindingFlags = binding_flags.data(); create_info.pNext = &binding_flags_create_info; - create_info.flags |= std::find(binding_flags.begin(), binding_flags.end(), VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT) != binding_flags.end() ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT : 0; + create_info.flags |= std::ranges::find(binding_flags, VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT) != binding_flags.end() ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT : 0; } // Create the Vulkan descriptor set layout handle diff --git a/framework/core/descriptor_set_layout.h b/framework/core/descriptor_set_layout.h index 71a6daceac..d36e555cce 100644 --- a/framework/core/descriptor_set_layout.h +++ b/framework/core/descriptor_set_layout.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,11 +23,17 @@ namespace vkb { class DescriptorPool; -class Device; class ShaderModule; struct ShaderResource; +namespace core +{ +template +class Device; +using DeviceC = Device; +} // namespace core + /** * @brief Caches DescriptorSet objects for the shader's set index. * Creates a DescriptorPool to allocate the DescriptorSet objects @@ -42,7 +48,7 @@ class DescriptorSetLayout * @param shader_modules The shader modules this set layout will be used for * @param resource_set A grouping of shader resources belonging to the same set */ - DescriptorSetLayout(Device & device, + DescriptorSetLayout(vkb::core::DeviceC &device, const uint32_t set_index, const std::vector &shader_modules, const std::vector &resource_set); @@ -74,7 +80,7 @@ class DescriptorSetLayout const std::vector &get_shader_modules() const; private: - Device &device; + vkb::core::DeviceC &device; VkDescriptorSetLayout handle{VK_NULL_HANDLE}; diff --git a/framework/core/device.cpp b/framework/core/device.cpp deleted file mode 100644 index 1a852ca2ca..0000000000 --- a/framework/core/device.cpp +++ /dev/null @@ -1,557 +0,0 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "device.h" - -#define VMA_IMPLEMENTATION -#include - -namespace vkb -{ -Device::Device(PhysicalDevice &gpu, - VkSurfaceKHR surface, - std::unique_ptr &&debug_utils, - std::unordered_map requested_extensions) : - vkb::core::VulkanResourceC{VK_NULL_HANDLE, this}, // Recursive, but valid - debug_utils{std::move(debug_utils)}, - gpu{gpu}, - resource_cache{*this} -{ - LOGI("Selected GPU: {}", gpu.get_properties().deviceName); - - // Prepare the device queues - uint32_t queue_family_properties_count = to_u32(gpu.get_queue_family_properties().size()); - std::vector queue_create_infos(queue_family_properties_count, {VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO}); - std::vector> queue_priorities(queue_family_properties_count); - - for (uint32_t queue_family_index = 0U; queue_family_index < queue_family_properties_count; ++queue_family_index) - { - const VkQueueFamilyProperties &queue_family_property = gpu.get_queue_family_properties()[queue_family_index]; - - if (gpu.has_high_priority_graphics_queue()) - { - uint32_t graphics_queue_family = get_queue_family_index(VK_QUEUE_GRAPHICS_BIT); - if (graphics_queue_family == queue_family_index) - { - queue_priorities[queue_family_index].reserve(queue_family_property.queueCount); - queue_priorities[queue_family_index].push_back(1.0f); - for (uint32_t i = 1; i < queue_family_property.queueCount; i++) - { - queue_priorities[queue_family_index].push_back(0.5f); - } - } - else - { - queue_priorities[queue_family_index].resize(queue_family_property.queueCount, 0.5f); - } - } - else - { - queue_priorities[queue_family_index].resize(queue_family_property.queueCount, 0.5f); - } - - VkDeviceQueueCreateInfo &queue_create_info = queue_create_infos[queue_family_index]; - - queue_create_info.queueFamilyIndex = queue_family_index; - queue_create_info.queueCount = queue_family_property.queueCount; - queue_create_info.pQueuePriorities = queue_priorities[queue_family_index].data(); - } - - // Check extensions to enable Vma Dedicated Allocation - bool can_get_memory_requirements = is_extension_supported("VK_KHR_get_memory_requirements2"); - bool has_dedicated_allocation = is_extension_supported("VK_KHR_dedicated_allocation"); - - if (can_get_memory_requirements && has_dedicated_allocation) - { - enabled_extensions.push_back("VK_KHR_get_memory_requirements2"); - enabled_extensions.push_back("VK_KHR_dedicated_allocation"); - - LOGI("Dedicated Allocation enabled"); - } - - // For performance queries, we also use host query reset since queryPool resets cannot - // live in the same command buffer as beginQuery - if (is_extension_supported("VK_KHR_performance_query") && - is_extension_supported("VK_EXT_host_query_reset")) - { - auto perf_counter_features = - gpu.get_extension_features(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR); - auto host_query_reset_features = - gpu.get_extension_features(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES); - - if (perf_counter_features.performanceCounterQueryPools && host_query_reset_features.hostQueryReset) - { - gpu.add_extension_features(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR) - .performanceCounterQueryPools = VK_TRUE; - gpu.add_extension_features(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES).hostQueryReset = - VK_TRUE; - enabled_extensions.push_back("VK_KHR_performance_query"); - enabled_extensions.push_back("VK_EXT_host_query_reset"); - LOGI("Performance query enabled"); - } - } - - // Check that extensions are supported before trying to create the device - std::vector unsupported_extensions{}; - for (auto &extension : requested_extensions) - { - if (is_extension_supported(extension.first)) - { - enabled_extensions.emplace_back(extension.first); - } - else - { - unsupported_extensions.emplace_back(extension.first); - } - } - - if (enabled_extensions.size() > 0) - { - LOGI("Device supports the following requested extensions:"); - for (auto &extension : enabled_extensions) - { - LOGI(" \t{}", extension); - } - } - - if (unsupported_extensions.size() > 0) - { - auto error = false; - for (auto &extension : unsupported_extensions) - { - auto extension_is_optional = requested_extensions[extension]; - if (extension_is_optional) - { - LOGW("Optional device extension {} not available, some features may be disabled", extension); - } - else - { - LOGE("Required device extension {} not available, cannot run", extension); - error = true; - } - } - - if (error) - { - throw VulkanException(VK_ERROR_EXTENSION_NOT_PRESENT, "Extensions not present"); - } - } - - VkDeviceCreateInfo create_info{VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO}; - - // Latest requested feature will have the pNext's all set up for device creation. - create_info.pNext = gpu.get_extension_feature_chain(); - - create_info.pQueueCreateInfos = queue_create_infos.data(); - create_info.queueCreateInfoCount = to_u32(queue_create_infos.size()); - create_info.enabledExtensionCount = to_u32(enabled_extensions.size()); - create_info.ppEnabledExtensionNames = enabled_extensions.data(); - - const auto requested_gpu_features = gpu.get_requested_features(); - create_info.pEnabledFeatures = &requested_gpu_features; - - VkResult result = vkCreateDevice(gpu.get_handle(), &create_info, nullptr, &get_handle()); - - if (result != VK_SUCCESS) - { - throw VulkanException{result, "Cannot create device"}; - } - - queues.resize(queue_family_properties_count); - - for (uint32_t queue_family_index = 0U; queue_family_index < queue_family_properties_count; ++queue_family_index) - { - const VkQueueFamilyProperties &queue_family_property = gpu.get_queue_family_properties()[queue_family_index]; - - VkBool32 present_supported = gpu.is_present_supported(surface, queue_family_index); - - for (uint32_t queue_index = 0U; queue_index < queue_family_property.queueCount; ++queue_index) - { - queues[queue_family_index].emplace_back(*this, queue_family_index, queue_family_property, present_supported, queue_index); - } - } - - prepare_memory_allocator(); - - command_pool = std::make_unique(*this, get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, 0).get_family_index()); - fence_pool = std::make_unique(*this); -} - -Device::Device(PhysicalDevice &gpu, VkDevice &vulkan_device, VkSurfaceKHR surface) : - VulkanResource{vulkan_device}, - gpu{gpu}, - resource_cache{*this} -{ - debug_utils = std::make_unique(); -} - -Device::~Device() -{ - resource_cache.clear(); - - command_pool.reset(); - fence_pool.reset(); - - vkb::allocated::shutdown(); - - vkDestroyDevice(get_handle(), nullptr); -} - -bool Device::is_extension_supported(const std::string &requested_extension) const -{ - return gpu.is_extension_supported(requested_extension); -} - -bool Device::is_enabled(const char *extension) const -{ - return std::find_if(enabled_extensions.begin(), enabled_extensions.end(), [extension](const char *enabled_extension) { return strcmp(extension, enabled_extension) == 0; }) != enabled_extensions.end(); -} - -const PhysicalDevice &Device::get_gpu() const -{ - return gpu; -} - -DriverVersion Device::get_driver_version() const -{ - DriverVersion version; - - switch (gpu.get_properties().vendorID) - { - case 0x10DE: - { - // Nvidia - version.major = (gpu.get_properties().driverVersion >> 22) & 0x3ff; - version.minor = (gpu.get_properties().driverVersion >> 14) & 0x0ff; - version.patch = (gpu.get_properties().driverVersion >> 6) & 0x0ff; - // Ignoring optional tertiary info in lower 6 bits - break; - } - default: - { - version.major = VK_VERSION_MAJOR(gpu.get_properties().driverVersion); - version.minor = VK_VERSION_MINOR(gpu.get_properties().driverVersion); - version.patch = VK_VERSION_PATCH(gpu.get_properties().driverVersion); - } - } - - return version; -} - -bool Device::is_image_format_supported(VkFormat format) const -{ - VkImageFormatProperties format_properties; - - auto result = vkGetPhysicalDeviceImageFormatProperties(gpu.get_handle(), - format, - VK_IMAGE_TYPE_2D, - VK_IMAGE_TILING_OPTIMAL, - VK_IMAGE_USAGE_SAMPLED_BIT, - 0, // no create flags - &format_properties); - return result != VK_ERROR_FORMAT_NOT_SUPPORTED; -} - -uint32_t Device::get_memory_type(uint32_t bits, VkMemoryPropertyFlags properties, VkBool32 *memory_type_found) const -{ - for (uint32_t i = 0; i < gpu.get_memory_properties().memoryTypeCount; i++) - { - if ((bits & 1) == 1) - { - if ((gpu.get_memory_properties().memoryTypes[i].propertyFlags & properties) == properties) - { - if (memory_type_found) - { - *memory_type_found = true; - } - return i; - } - } - bits >>= 1; - } - - if (memory_type_found) - { - *memory_type_found = false; - return 0; - } - else - { - throw std::runtime_error("Could not find a matching memory type"); - } -} - -const Queue &Device::get_queue(uint32_t queue_family_index, uint32_t queue_index) -{ - return queues[queue_family_index][queue_index]; -} - -const Queue &Device::get_queue_by_flags(VkQueueFlags required_queue_flags, uint32_t queue_index) const -{ - for (uint32_t queue_family_index = 0U; queue_family_index < queues.size(); ++queue_family_index) - { - Queue const &first_queue = queues[queue_family_index][0]; - - VkQueueFlags queue_flags = first_queue.get_properties().queueFlags; - uint32_t queue_count = first_queue.get_properties().queueCount; - - if (((queue_flags & required_queue_flags) == required_queue_flags) && queue_index < queue_count) - { - return queues[queue_family_index][queue_index]; - } - } - - throw std::runtime_error("Queue not found"); -} - -const Queue &Device::get_queue_by_present(uint32_t queue_index) const -{ - for (uint32_t queue_family_index = 0U; queue_family_index < queues.size(); ++queue_family_index) - { - Queue const &first_queue = queues[queue_family_index][0]; - - uint32_t queue_count = first_queue.get_properties().queueCount; - - if (first_queue.support_present() && queue_index < queue_count) - { - return queues[queue_family_index][queue_index]; - } - } - - throw std::runtime_error("Queue not found"); -} - -void Device::add_queue(size_t global_index, uint32_t family_index, VkQueueFamilyProperties properties, VkBool32 can_present) -{ - if (queues.size() < global_index + 1) - { - queues.resize(global_index + 1); - } - queues[global_index].emplace_back(*this, family_index, properties, can_present, 0); -} - -uint32_t Device::get_num_queues_for_queue_family(uint32_t queue_family_index) -{ - const auto &queue_family_properties = gpu.get_queue_family_properties(); - return queue_family_properties[queue_family_index].queueCount; -} - -uint32_t Device::get_queue_family_index(VkQueueFlagBits queue_flag) -{ - const auto &queue_family_properties = gpu.get_queue_family_properties(); - - // Dedicated queue for compute - // Try to find a queue family index that supports compute but not graphics - if (queue_flag & VK_QUEUE_COMPUTE_BIT) - { - for (uint32_t i = 0; i < static_cast(queue_family_properties.size()); i++) - { - if ((queue_family_properties[i].queueFlags & queue_flag) && !(queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)) - { - return i; - break; - } - } - } - - // Dedicated queue for transfer - // Try to find a queue family index that supports transfer but not graphics and compute - if (queue_flag & VK_QUEUE_TRANSFER_BIT) - { - for (uint32_t i = 0; i < static_cast(queue_family_properties.size()); i++) - { - if ((queue_family_properties[i].queueFlags & queue_flag) && !(queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && !(queue_family_properties[i].queueFlags & VK_QUEUE_COMPUTE_BIT)) - { - return i; - break; - } - } - } - - // For other queue types or if no separate compute queue is present, return the first one to support the requested flags - for (uint32_t i = 0; i < static_cast(queue_family_properties.size()); i++) - { - if (queue_family_properties[i].queueFlags & queue_flag) - { - return i; - break; - } - } - - throw std::runtime_error("Could not find a matching queue family index"); -} - -const Queue &Device::get_suitable_graphics_queue() const -{ - for (uint32_t queue_family_index = 0U; queue_family_index < queues.size(); ++queue_family_index) - { - Queue const &first_queue = queues[queue_family_index][0]; - - uint32_t queue_count = first_queue.get_properties().queueCount; - - if (first_queue.support_present() && 0 < queue_count) - { - return queues[queue_family_index][0]; - } - } - - return get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); -} - -void Device::copy_buffer(vkb::core::BufferC &src, vkb::core::BufferC &dst, VkQueue queue, VkBufferCopy *copy_region) -{ - assert(dst.get_size() <= src.get_size()); - assert(src.get_handle()); - - VkCommandBuffer command_buffer = create_command_buffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); - - VkBufferCopy buffer_copy{}; - if (copy_region == nullptr) - { - buffer_copy.size = src.get_size(); - } - else - { - buffer_copy = *copy_region; - } - - vkCmdCopyBuffer(command_buffer, src.get_handle(), dst.get_handle(), 1, &buffer_copy); - - flush_command_buffer(command_buffer, queue); -} - -VkCommandPool Device::create_command_pool(uint32_t queue_index, VkCommandPoolCreateFlags flags) -{ - VkCommandPoolCreateInfo command_pool_info = {}; - command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - command_pool_info.queueFamilyIndex = queue_index; - command_pool_info.flags = flags; - VkCommandPool command_pool; - VK_CHECK(vkCreateCommandPool(get_handle(), &command_pool_info, nullptr, &command_pool)); - return command_pool; -} - -VkCommandBuffer Device::create_command_buffer(VkCommandBufferLevel level, bool begin) const -{ - assert(command_pool && "No command pool exists in the device"); - - VkCommandBufferAllocateInfo cmd_buf_allocate_info{}; - cmd_buf_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - cmd_buf_allocate_info.commandPool = command_pool->get_handle(); - cmd_buf_allocate_info.level = level; - cmd_buf_allocate_info.commandBufferCount = 1; - - VkCommandBuffer command_buffer; - VK_CHECK(vkAllocateCommandBuffers(get_handle(), &cmd_buf_allocate_info, &command_buffer)); - - // If requested, also start recording for the new command buffer - if (begin) - { - VkCommandBufferBeginInfo command_buffer_info{}; - command_buffer_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - VK_CHECK(vkBeginCommandBuffer(command_buffer, &command_buffer_info)); - } - - return command_buffer; -} - -void Device::flush_command_buffer(VkCommandBuffer command_buffer, VkQueue queue, bool free, VkSemaphore signalSemaphore) const -{ - if (command_buffer == VK_NULL_HANDLE) - { - return; - } - - VK_CHECK(vkEndCommandBuffer(command_buffer)); - - VkSubmitInfo submit_info{}; - submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submit_info.commandBufferCount = 1; - submit_info.pCommandBuffers = &command_buffer; - if (signalSemaphore) - { - submit_info.pSignalSemaphores = &signalSemaphore; - submit_info.signalSemaphoreCount = 1; - } - - // Create fence to ensure that the command buffer has finished executing - VkFenceCreateInfo fence_info{}; - fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - fence_info.flags = VK_FLAGS_NONE; - - VkFence fence; - VK_CHECK(vkCreateFence(get_handle(), &fence_info, nullptr, &fence)); - - // Submit to the queue - VkResult result = vkQueueSubmit(queue, 1, &submit_info, fence); - // Wait for the fence to signal that command buffer has finished executing - VK_CHECK(vkWaitForFences(get_handle(), 1, &fence, VK_TRUE, DEFAULT_FENCE_TIMEOUT)); - - vkDestroyFence(get_handle(), fence, nullptr); - - if (command_pool && free) - { - vkFreeCommandBuffers(get_handle(), command_pool->get_handle(), 1, &command_buffer); - } -} - -CommandPool &Device::get_command_pool() const -{ - return *command_pool; -} - -FencePool &Device::get_fence_pool() const -{ - return *fence_pool; -} - -void Device::create_internal_fence_pool() -{ - fence_pool = std::make_unique(*this); -} - -void Device::create_internal_command_pool() -{ - command_pool = std::make_unique(*this, get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, 0).get_family_index()); -} - -void Device::prepare_memory_allocator() -{ - vkb::allocated::init(*this); -} - -CommandBuffer &Device::request_command_buffer() const -{ - return command_pool->request_command_buffer(); -} - -VkFence Device::request_fence() const -{ - return fence_pool->request_fence(); -} - -VkResult Device::wait_idle() const -{ - return vkDeviceWaitIdle(get_handle()); -} - -ResourceCache &Device::get_resource_cache() -{ - return resource_cache; -} -} // namespace vkb diff --git a/framework/core/device.h b/framework/core/device.h index e934356bdb..0d127d9853 100644 --- a/framework/core/device.h +++ b/framework/core/device.h @@ -1,5 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,40 +17,64 @@ #pragma once -#include "common/helpers.h" +#include "common/hpp_vk_common.h" #include "common/vk_common.h" -#include "core/command_buffer.h" -#include "core/command_pool.h" -#include "core/debug.h" -#include "core/descriptor_set.h" -#include "core/descriptor_set_layout.h" -#include "core/framebuffer.h" -#include "core/instance.h" +#include "core/buffer.h" #include "core/physical_device.h" -#include "core/pipeline.h" -#include "core/pipeline_layout.h" -#include "core/queue.h" -#include "core/render_pass.h" -#include "core/shader_module.h" -#include "core/swapchain.h" -#include "core/util/logging.hpp" -#include "core/vulkan_resource.h" -#include "fence_pool.h" -#include "rendering/pipeline_state.h" -#include "rendering/render_target.h" -#include "resource_cache.h" +#include "hpp_debug.h" +#include "hpp_fence_pool.h" +#include "hpp_queue.h" +#include "hpp_resource_cache.h" +#include "queue.h" +#include +#include namespace vkb { -struct DriverVersion -{ - uint16_t major; - uint16_t minor; - uint16_t patch; -}; +class FencePool; +class DebugUtils; +class PhysicalDevice; +class ResourceCache; -class Device : public vkb::core::VulkanResourceC +namespace core +{ +template +class CommandPool; +using CommandPoolC = CommandPool; +using CommandPoolCpp = CommandPool; + +template +class Device + : public vkb::core::VulkanResource::type> { + public: + using Bool32Type = typename std::conditional::type; + using BufferCopyType = typename std::conditional::type; + using CommandBufferLevelType = typename std::conditional::type; + using CommandBufferType = typename std::conditional::type; + using CommandPoolCreateFlagsType = typename std::conditional::type; + using CommandPoolType = typename std::conditional::type; + using DeviceMemoryType = typename std::conditional::type; + using DeviceType = typename std::conditional::type; + using Extent2DType = typename std::conditional::type; + using FenceType = typename std::conditional::type; + using FormatType = typename std::conditional::type; + using ImageType = typename std::conditional::type; + using ImageUsageFlagsType = typename std::conditional::type; + using MemoryPropertyFlagsType = typename std::conditional::type; + using QueueFamilyPropertiesType = typename std::conditional::type; + using QueueFlagBitsType = typename std::conditional::type; + using QueueFlagsType = typename std::conditional::type; + using QueueType = typename std::conditional::type; + using ResultType = typename std::conditional::type; + using SemaphoreType = typename std::conditional::type; + using SurfaceType = typename std::conditional::type; + + using DebugUtilsType = typename std::conditional::type; + using FencePoolType = typename std::conditional::type; + using CoreQueueType = typename std::conditional::type; + using ResourceCacheType = typename std::conditional::type; + public: /** * @brief Device constructor @@ -59,11 +82,13 @@ class Device : public vkb::core::VulkanResourceC * @param surface The surface * @param debug_utils The debug utils to be associated to this device * @param requested_extensions (Optional) List of required device extensions and whether support is optional or not + * @param request_gpu_features (Optional) A function that will be called to request specific gpu features before device creation */ - Device(PhysicalDevice &gpu, - VkSurfaceKHR surface, - std::unique_ptr &&debug_utils, - std::unordered_map requested_extensions = {}); + Device(PhysicalDevice &gpu, + SurfaceType surface, + std::unique_ptr &&debug_utils, + std::unordered_map const &requested_extensions = {}, + std::function &)> request_gpu_features = {}); /** * @brief Device constructor @@ -71,164 +96,690 @@ class Device : public vkb::core::VulkanResourceC * @param vulkan_device A valid Vulkan device * @param surface The surface */ - Device(PhysicalDevice &gpu, - VkDevice &vulkan_device, - VkSurfaceKHR surface); + Device(PhysicalDevice &gpu, DeviceType &vulkan_device, SurfaceType surface); Device(const Device &) = delete; - - Device(Device &&) = delete; - + Device(Device &&) = delete; ~Device(); Device &operator=(const Device &) = delete; + Device &operator=(Device &&) = delete; + + void add_queue(size_t global_index, uint32_t family_index, QueueFamilyPropertiesType const &properties, Bool32Type can_present); + void copy_buffer( + vkb::core::Buffer const &src, vkb::core::Buffer &dst, QueueType queue, BufferCopyType const *copy_region = nullptr); + CommandBufferType create_command_buffer(CommandBufferLevelType level, bool begin = false) const; + CommandPoolType create_command_pool(uint32_t queue_index, CommandPoolCreateFlagsType flags = 0); + std::pair create_image( + FormatType format, Extent2DType const &extent, uint32_t mip_levels, ImageUsageFlagsType usage, MemoryPropertyFlagsType properties) const; + void create_internal_command_pool(); + void create_internal_fence_pool(); + void flush_command_buffer(CommandBufferType command_buffer, QueueType queue, bool free = true, SemaphoreType signal_semaphore = VK_NULL_HANDLE) const; + vkb::core::CommandPool &get_command_pool() const; + DebugUtilsType const &get_debug_utils() const; + FencePoolType &get_fence_pool() const; + PhysicalDevice const &get_gpu() const; + CoreQueueType const &get_queue(uint32_t queue_family_index, uint32_t queue_index) const; + CoreQueueType const &get_queue_by_flags(QueueFlagsType queue_flags, uint32_t queue_index) const; + CoreQueueType const &get_queue_by_present(uint32_t queue_index) const; + ResourceCacheType &get_resource_cache(); + bool is_extension_enabled(const char *extension) const; + bool is_image_format_supported(FormatType format) const; + void wait_idle() const; - Device &operator=(Device &&) = delete; + private: + void copy_buffer_impl(vk::Device device, vkb::core::BufferCpp const &src, vkb::core::BufferCpp &dst, vk::Queue queue, vk::BufferCopy const *copy_region); + vk::CommandBuffer create_command_buffer_impl(vk::Device device, vk::CommandBufferLevel level, bool begin) const; + std::pair create_image_impl( + vk::Device device, vk::Format format, vk::Extent2D const &extent, uint32_t mip_levels, vk::ImageUsageFlags usage, vk::MemoryPropertyFlags properties) + const; + void flush_command_buffer_impl( + vk::Device device, vk::CommandBuffer command_buffer, vk::Queue queue, bool free = true, vk::Semaphore signal_semaphore = nullptr) const; + vkb::core::HPPQueue const &get_queue_by_flags_impl(vk::QueueFlags queue_flags, uint32_t queue_index) const; + void init(std::unordered_map const &requested_extensions, std::function &)> request_gpu_features); - const PhysicalDevice &get_gpu() const; + private: + std::unique_ptr command_pool; + std::unique_ptr debug_utils; + std::vector enabled_extensions{}; + std::unique_ptr fence_pool; + vkb::core::PhysicalDeviceCpp &gpu; + std::vector> queues; + vkb::HPPResourceCache resource_cache; + vk::SurfaceKHR surface = nullptr; +}; - /** - * @brief Returns the debug utils associated with this Device. - */ - inline const DebugUtils &get_debug_utils() const +using DeviceC = Device; +using DeviceCpp = Device; + +} // namespace core +} // namespace vkb + +#include "core/command_pool.h" + +namespace vkb +{ +namespace core +{ + +template <> +inline Device::Device(vkb::core::PhysicalDeviceCpp &gpu, + vk::SurfaceKHR surface, + std::unique_ptr &&debug_utils, + std::unordered_map const &requested_extensions, + std::function request_gpu_features) : + vkb::core::VulkanResourceCpp{nullptr, this}, debug_utils{std::move(debug_utils)}, gpu{gpu}, resource_cache{*this}, surface(surface) +{ + init(requested_extensions, request_gpu_features); +} + +template <> +inline Device::Device(vkb::core::PhysicalDeviceC &gpu, + VkSurfaceKHR surface, + std::unique_ptr &&debug_utils, + std::unordered_map const &requested_extensions, + std::function request_gpu_features) : + vkb::core::VulkanResourceC{VK_NULL_HANDLE, this}, debug_utils{reinterpret_cast(debug_utils.release())}, gpu{reinterpret_cast(gpu)}, resource_cache{*reinterpret_cast(this)}, surface(static_cast(surface)) +{ + init(requested_extensions, request_gpu_features); +} + +template <> +inline Device::Device(vkb::core::PhysicalDeviceCpp &gpu, vk::Device &vulkan_device, vk::SurfaceKHR surface) : + VulkanResource{vulkan_device}, gpu{gpu}, surface{surface}, resource_cache{*this} +{ + debug_utils = std::make_unique(); +} + +template <> +inline Device::Device(vkb::core::PhysicalDeviceC &gpu, VkDevice &vulkan_device, VkSurfaceKHR surface) : + VulkanResource{vulkan_device}, gpu{reinterpret_cast(gpu)}, resource_cache{*reinterpret_cast(this)}, surface{static_cast(surface)} +{ + debug_utils = std::make_unique(); +} + +template +inline Device::~Device() +{ + resource_cache.clear(); + command_pool.reset(); + fence_pool.reset(); + vkb::allocated::shutdown(); + if (this->get_handle()) + { + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_handle().destroy(); + } + else + { + static_cast(this->get_handle()).destroy(); + } + } +} + +template +inline void Device::add_queue(size_t global_index, uint32_t family_index, QueueFamilyPropertiesType const &properties, Bool32Type can_present) +{ + if (queues.size() <= global_index) + { + queues.resize(global_index + 1); + } + if constexpr (bindingType == vkb::BindingType::Cpp) + { + queues[global_index].emplace_back(*this, family_index, properties, can_present, 0); + } + else + { + queues[global_index].emplace_back(*reinterpret_cast(this), + family_index, + reinterpret_cast(properties), + static_cast(can_present), + 0); + } +} + +template +inline void Device::copy_buffer(vkb::core::Buffer const &src, + vkb::core::Buffer &dst, + QueueType queue, + BufferCopyType const *copy_region) +{ + assert(dst.get_size() <= src.get_size()); + assert(src.get_handle()); + + if constexpr (bindingType == vkb::BindingType::Cpp) + { + copy_buffer_impl(this->get_handle(), src, dst, queue, copy_region); + } + else + { + copy_buffer_impl(static_cast(this->get_handle()), reinterpret_cast(src), + reinterpret_cast(dst), + static_cast(queue), + reinterpret_cast(copy_region)); + } +} + +template +inline typename Device::CommandBufferType Device::create_command_buffer(CommandBufferLevelType level, bool begin) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return create_command_buffer_impl(this->get_handle(), level, begin); + } + else + { + return static_cast( + create_command_buffer_impl(static_cast(this->get_handle()), static_cast(level), begin)); + } +} + +template +inline typename Device::CommandPoolType Device::create_command_pool(uint32_t queue_index, CommandPoolCreateFlagsType flags) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + vk::CommandPoolCreateInfo command_pool_info{.flags = flags, .queueFamilyIndex = queue_index}; + return this->get_handle().createCommandPool(command_pool_info); + } + else + { + vk::CommandPoolCreateInfo command_pool_info{.flags = static_cast(flags), .queueFamilyIndex = queue_index}; + return static_cast(this->get_handle()).createCommandPool(command_pool_info); + } +} + +template +inline std::pair::ImageType, typename Device::DeviceMemoryType> Device::create_image( + FormatType format, Extent2DType const &extent, uint32_t mip_levels, ImageUsageFlagsType usage, MemoryPropertyFlagsType properties) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return create_image_impl(this->get_handle(), format, extent, mip_levels, usage, properties); + } + else + { + return static_cast>(create_image_impl(static_cast(this->get_handle()), + static_cast(format), + static_cast(extent), + mip_levels, + static_cast(usage), + static_cast(properties))); + } +} + +template +inline void Device::create_internal_command_pool() +{ + uint32_t familyIndex = get_queue_by_flags_impl(vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eCompute, 0).get_family_index(); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + command_pool = std::make_unique(*this, familyIndex); + } + else + { + command_pool = std::make_unique(*reinterpret_cast(this), familyIndex); + } +} + +template +inline void Device::create_internal_fence_pool() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + fence_pool = std::make_unique(*this); + } + else + { + fence_pool = std::make_unique(*reinterpret_cast(this)); + } +} + +template +inline void Device::flush_command_buffer(CommandBufferType command_buffer, QueueType queue, bool free, SemaphoreType signal_semaphore) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + flush_command_buffer_impl(this->get_handle(), command_buffer, queue, free, signal_semaphore); + } + else + { + flush_command_buffer_impl(static_cast(this->get_handle()), + static_cast(command_buffer), + static_cast(queue), + free, + static_cast(signal_semaphore)); + } +} + +template +inline vkb::core::CommandPool &Device::get_command_pool() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return *command_pool; + } + else + { + return reinterpret_cast(*command_pool); + } +} + +template +inline typename Device::DebugUtilsType const &Device::get_debug_utils() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) { return *debug_utils; } + else + { + return reinterpret_cast(*debug_utils); + } +} - /** - * @return The version of the driver of the current physical device - */ - DriverVersion get_driver_version() const; +template +inline typename Device::FencePoolType &Device::get_fence_pool() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return *fence_pool; + } + else + { + return reinterpret_cast(*fence_pool); + } +} - /** - * @return Whether an image format is supported by the GPU - */ - bool is_image_format_supported(VkFormat format) const; +template +inline PhysicalDevice const &Device::get_gpu() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return gpu; + } + else + { + return reinterpret_cast(gpu); + } +} - const Queue &get_queue(uint32_t queue_family_index, uint32_t queue_index); +template +inline typename Device::CoreQueueType const &Device::get_queue(uint32_t queue_family_index, uint32_t queue_index) const +{ + assert(queue_family_index < queues.size() && "Queue family index out of bounds"); + assert(queue_index < queues[queue_family_index].size() && "Queue index out of bounds"); - const Queue &get_queue_by_flags(VkQueueFlags queue_flags, uint32_t queue_index) const; + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return queues[queue_family_index][queue_index]; + } + else + { + return reinterpret_cast(queues[queue_family_index][queue_index]); + } +} - const Queue &get_queue_by_present(uint32_t queue_index) const; +template +inline typename Device::CoreQueueType const &Device::get_queue_by_flags(QueueFlagsType required_queue_flags, + uint32_t queue_index) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return get_queue_by_flags_impl(required_queue_flags, queue_index); + } + else + { + return reinterpret_cast(get_queue_by_flags_impl(static_cast(required_queue_flags), queue_index)); + } +} - /** - * @brief Manually adds a new queue from a given family index to this device - * @param global_index Index at where the queue should be placed inside the already existing list of queues - * @param family_index Index of the queue family from which the queue will be created - * @param properties Vulkan queue family properties - * @param can_present True if the queue is able to present images - */ - void add_queue(size_t global_index, uint32_t family_index, VkQueueFamilyProperties properties, VkBool32 can_present); +template +inline typename Device::CoreQueueType const &Device::get_queue_by_present(uint32_t queue_index) const +{ + auto queueIt = + std::ranges::find_if(queues, + [queue_index](const std::vector &queue_family) { return !queue_family.empty() && queue_index < queue_family[0].get_properties().queueCount && queue_family[0].support_present(); }); + if (queueIt != queues.end()) + { + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return (*queueIt)[queue_index]; + } + else + { + return reinterpret_cast((*queueIt)[queue_index]); + } + } - /** - * @brief Finds a suitable graphics queue to submit to - * @return The first present supported queue, otherwise just any graphics queue - */ - const Queue &get_suitable_graphics_queue() const; + throw std::runtime_error("Queue not found"); +} - bool is_extension_supported(const std::string &extension) const; +template +inline typename Device::ResourceCacheType &Device::get_resource_cache() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return resource_cache; + } + else + { + return reinterpret_cast(resource_cache); + } +} - bool is_enabled(const char *extension) const; +template +inline bool Device::is_extension_enabled(const char *extension) const +{ + return std::ranges::find_if(enabled_extensions, [extension](const char *enabled_extension) { return strcmp(extension, enabled_extension) == 0; }) != + enabled_extensions.end(); +} - uint32_t get_queue_family_index(VkQueueFlagBits queue_flag); +template +inline bool Device::is_image_format_supported(FormatType format) const +{ + // as we want to check for an error (vk::Result::eErrorFormatNotSupported) we use the non-throwing version of getImageFormatProperties here + vk::ImageFormatProperties format_properties; + return vk::Result::eErrorFormatNotSupported != + gpu.get_handle().getImageFormatProperties( + static_cast(format), vk::ImageType::e2D, vk::ImageTiling::eOptimal, vk::ImageUsageFlagBits::eSampled, {}, &format_properties); +} + +template +inline void Device::wait_idle() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + this->get_handle().waitIdle(); + } + else + { + static_cast(this->get_handle()).waitIdle(); + } +} - uint32_t get_num_queues_for_queue_family(uint32_t queue_family_index); +template +inline void Device::copy_buffer_impl( + vk::Device device, vkb::core::BufferCpp const &src, vkb::core::BufferCpp &dst, vk::Queue queue, vk::BufferCopy const *copy_region) +{ + vk::CommandBuffer command_buffer = create_command_buffer_impl(device, vk::CommandBufferLevel::ePrimary, true); - CommandPool &get_command_pool() const; + vk::BufferCopy buffer_copy; + if (copy_region == nullptr) + { + buffer_copy.size = src.get_size(); + } + else + { + buffer_copy = *copy_region; + } - /** - * @brief Checks that a given memory type is supported by the GPU - * @param bits The memory requirement type bits - * @param properties The memory property to search for - * @param memory_type_found True if found, false if not found - * @returns The memory type index of the found memory type - */ - uint32_t get_memory_type(uint32_t bits, VkMemoryPropertyFlags properties, VkBool32 *memory_type_found = nullptr) const; + command_buffer.copyBuffer(src.get_handle(), dst.get_handle(), buffer_copy); - /** - * @brief Copies a buffer from one to another - * @param src The buffer to copy from - * @param dst The buffer to copy to - * @param queue The queue to submit the copy command to - * @param copy_region The amount to copy, if null copies the entire buffer - */ - void copy_buffer(vkb::core::BufferC &src, vkb::core::BufferC &dst, VkQueue queue, VkBufferCopy *copy_region = nullptr); + flush_command_buffer_impl(device, command_buffer, queue); +} - /** - * @brief Creates a command pool - * @param queue_index The queue index this command pool is associated with - * @param flags The command pool flags - * @returns A valid VkCommandPool - */ - VkCommandPool create_command_pool(uint32_t queue_index, VkCommandPoolCreateFlags flags = 0); +template +inline vk::CommandBuffer Device::create_command_buffer_impl(vk::Device device, vk::CommandBufferLevel level, bool begin) const +{ + assert(command_pool && "No command pool exists in the device"); - /** - * @brief Requests a command buffer from the device's command pool - * @param level The command buffer level - * @param begin Whether the command buffer should be implicitly started before it's returned - * @returns A valid VkCommandBuffer - */ - VkCommandBuffer create_command_buffer(VkCommandBufferLevel level, bool begin = false) const; + vk::CommandBufferAllocateInfo command_buffer_allocate_info{.commandPool = command_pool->get_handle(), .level = level, .commandBufferCount = 1}; + vk::CommandBuffer command_buffer = device.allocateCommandBuffers(command_buffer_allocate_info).front(); - /** - * @brief Submits and frees up a given command buffer - * @param command_buffer The command buffer - * @param queue The queue to submit the work to - * @param free Whether the command buffer should be implicitly freed up - * @param signalSemaphore An optional semaphore to signal when the commands have been executed - */ - void flush_command_buffer(VkCommandBuffer command_buffer, VkQueue queue, bool free = true, VkSemaphore signalSemaphore = VK_NULL_HANDLE) const; + // If requested, also start recording for the new command buffer + if (begin) + { + command_buffer.begin(vk::CommandBufferBeginInfo()); + } - /** - * @brief Requests a command buffer from the general command_pool - * @return A new command buffer - */ - CommandBuffer &request_command_buffer() const; + return command_buffer; +} - FencePool &get_fence_pool() const; +template +inline std::pair Device::create_image_impl( + vk::Device device, vk::Format format, vk::Extent2D const &extent, uint32_t mip_levels, vk::ImageUsageFlags usage, vk::MemoryPropertyFlags properties) const +{ + vk::ImageCreateInfo image_create_info{.imageType = vk::ImageType::e2D, + .format = format, + .extent = {.width = extent.width, .height = extent.height, .depth = 1}, + .mipLevels = mip_levels, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eOptimal, + .usage = usage}; + + vk::Image image = device.createImage(image_create_info); + + vk::MemoryRequirements memory_requirements = device.getImageMemoryRequirements(image); + + vk::MemoryAllocateInfo memory_allocation{.allocationSize = memory_requirements.size, + .memoryTypeIndex = gpu.get_memory_type(memory_requirements.memoryTypeBits, properties)}; + vk::DeviceMemory memory = device.allocateMemory(memory_allocation); + device.bindImageMemory(image, memory, 0); + + return std::make_pair(image, memory); +} + +template +inline void Device::flush_command_buffer_impl( + vk::Device device, vk::CommandBuffer command_buffer, vk::Queue queue, bool free, vk::Semaphore signal_semaphore) const +{ + if (command_buffer) + { + command_buffer.end(); + + vk::SubmitInfo submit_info{.commandBufferCount = 1, .pCommandBuffers = &command_buffer}; + if (signal_semaphore) + { + submit_info.setSignalSemaphores(signal_semaphore); + } + + // Create fence to ensure that the command buffer has finished executing + vk::Fence fence = device.createFence({}); + + // Submit to the queue + queue.submit(submit_info, fence); + + // Wait for the fence to signal that command buffer has finished executing + vk::Result result = device.waitForFences(fence, true, DEFAULT_FENCE_TIMEOUT); + if (result != vk::Result::eSuccess) + { + LOGE("Detected Vulkan error: {}", vkb::to_string(result)); + abort(); + } + + device.destroyFence(fence); + + if (command_pool && free) + { + device.freeCommandBuffers(command_pool->get_handle(), command_buffer); + } + } +} - /** - * @brief Creates the fence pool used by this device - */ - void create_internal_fence_pool(); +template +vkb::core::HPPQueue const &Device::get_queue_by_flags_impl(vk::QueueFlags required_queue_flags, uint32_t queue_index) const +{ + auto queueIt = + std::ranges::find_if(queues, + [required_queue_flags, queue_index](const std::vector &queue) { + assert(!queue.empty()); + vk::QueueFamilyProperties const &properties = queue[0].get_properties(); + return ((properties.queueFlags & required_queue_flags) == required_queue_flags) && (queue_index < properties.queueCount); + }); + + if (queueIt == queues.end()) + { + throw std::runtime_error("Queue not found"); + } - /** - * @brief Creates the command pool used by this device - */ - void create_internal_command_pool(); + return (*queueIt)[queue_index]; +} - /** - * @brief Creates and sets up the Vulkan memory allocator - */ - void prepare_memory_allocator(); +template +inline void Device::init(std::unordered_map const &requested_extensions, std::function &)> request_gpu_features) +{ + LOGI("Selected GPU: {}", *gpu.get_properties().deviceName); - /** - * @brief Requests a fence to the fence pool - * @return A vulkan fence - */ - VkFence request_fence() const; + // Prepare the device queues + std::vector queue_family_properties = gpu.get_queue_family_properties(); + std::vector queue_create_infos; + std::vector> queue_priorities; + + queue_create_infos.reserve(queue_family_properties.size()); + queue_priorities.reserve(queue_family_properties.size()); + for (uint32_t queue_family_index = 0U; queue_family_index < queue_family_properties.size(); ++queue_family_index) + { + auto const &queue_family_property = queue_family_properties[queue_family_index]; + + queue_priorities.push_back(std::vector(queue_family_property.queueCount, 0.5f)); + if (gpu.has_high_priority_graphics_queue() && + (vkb::common::get_queue_family_index(queue_family_properties, vk::QueueFlagBits::eGraphics) == queue_family_index)) + { + queue_priorities.back()[0] = 0.5f; + } + + queue_create_infos.push_back({.queueFamilyIndex = queue_family_index, + .queueCount = queue_family_property.queueCount, + .pQueuePriorities = queue_priorities[queue_family_index].data()}); + } - VkResult wait_idle() const; + // Check extensions to enable Vma Dedicated Allocation + bool can_get_memory_requirements = gpu.is_extension_supported("VK_KHR_get_memory_requirements2"); + bool has_dedicated_allocation = gpu.is_extension_supported("VK_KHR_dedicated_allocation"); - ResourceCache &get_resource_cache(); + if (can_get_memory_requirements && has_dedicated_allocation) + { + enabled_extensions.push_back("VK_KHR_get_memory_requirements2"); + enabled_extensions.push_back("VK_KHR_dedicated_allocation"); - private: - const PhysicalDevice &gpu; + LOGI("Dedicated Allocation enabled"); + } - VkSurfaceKHR surface{VK_NULL_HANDLE}; + // For performance queries, we also use host query reset since queryPool resets cannot + // live in the same command buffer as beginQuery + if (gpu.is_extension_supported("VK_KHR_performance_query") && + gpu.is_extension_supported("VK_EXT_host_query_reset")) + { + auto perf_counter_features = gpu.get_extension_features(); + auto host_query_reset_features = gpu.get_extension_features(); + + if (perf_counter_features.performanceCounterQueryPools && host_query_reset_features.hostQueryReset) + { + gpu.add_extension_features().performanceCounterQueryPools = VK_TRUE; + gpu.add_extension_features().hostQueryReset = VK_TRUE; + enabled_extensions.push_back("VK_KHR_performance_query"); + enabled_extensions.push_back("VK_EXT_host_query_reset"); + LOGI("Performance query enabled"); + } + } - std::unique_ptr debug_utils; + // Check that extensions are supported before trying to create the device + std::vector unsupported_extensions{}; + for (auto &extension : requested_extensions) + { + if (gpu.is_extension_supported(extension.first)) + { + enabled_extensions.emplace_back(extension.first); + } + else + { + unsupported_extensions.emplace_back(extension.first); + } + } - std::vector enabled_extensions{}; + if (enabled_extensions.size() > 0) + { + LOGI("Device supports the following requested extensions:"); + for (auto &extension : enabled_extensions) + { + LOGI(" \t{}", extension); + } + } - std::vector> queues; + if (unsupported_extensions.size() > 0) + { + auto error = false; + for (auto &extension : unsupported_extensions) + { + auto extIt = requested_extensions.find(extension); + assert(extIt != requested_extensions.end()); + if (extIt->second) + { + LOGW("Optional device extension {} not available, some features may be disabled", extension); + } + else + { + LOGE("Required device extension {} not available, cannot run", extension); + error = true; + } + } + + if (error) + { + throw VulkanException(VK_ERROR_EXTENSION_NOT_PRESENT, "Extensions not present"); + } + } - /// A command pool associated to the primary queue - std::unique_ptr command_pool; + if constexpr (bindingType == vkb::BindingType::Cpp) + { + request_gpu_features(gpu); + } + else + { + request_gpu_features(reinterpret_cast(gpu)); + } - /// A fence pool associated to the primary queue - std::unique_ptr fence_pool; + // Latest requested feature will have the pNext's all set up for device creation. + vk::DeviceCreateInfo create_info{.pNext = gpu.get_extension_feature_chain(), + .queueCreateInfoCount = static_cast(queue_create_infos.size()), + .pQueueCreateInfos = queue_create_infos.data(), + .enabledExtensionCount = static_cast(enabled_extensions.size()), + .ppEnabledExtensionNames = enabled_extensions.data(), + .pEnabledFeatures = &gpu.get_requested_features()}; - ResourceCache resource_cache; -}; + this->set_handle(gpu.get_handle().createDevice(create_info)); + + queues.resize(queue_family_properties.size()); + + for (uint32_t queue_family_index = 0U; queue_family_index < queue_family_properties.size(); ++queue_family_index) + { + const vk::QueueFamilyProperties &queue_family_property = gpu.get_queue_family_properties()[queue_family_index]; + + vk::Bool32 present_supported = gpu.get_handle().getSurfaceSupportKHR(queue_family_index, surface); + + for (uint32_t queue_index = 0U; queue_index < queue_family_property.queueCount; ++queue_index) + { + if constexpr (bindingType == BindingType::Cpp) + { + queues[queue_family_index].emplace_back(*this, queue_family_index, queue_family_property, present_supported, queue_index); + } + else + { + queues[queue_family_index].emplace_back( + *reinterpret_cast(this), queue_family_index, queue_family_property, present_supported, queue_index); + } + } + } + + vkb::allocated::init(*this); + + if constexpr (bindingType == BindingType::Cpp) + { + command_pool = std::make_unique( + *this, get_queue_by_flags_impl(vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eCompute, 0).get_family_index()); + fence_pool = std::make_unique(*this); + } + else + { + command_pool = std::make_unique( + *reinterpret_cast(this), + get_queue_by_flags_impl(vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eCompute, 0).get_family_index()); + fence_pool = std::make_unique(*reinterpret_cast(this)); + } +} + +} // namespace core } // namespace vkb diff --git a/framework/core/framebuffer.cpp b/framework/core/framebuffer.cpp index 7db75bd398..e8197d0932 100644 --- a/framework/core/framebuffer.cpp +++ b/framework/core/framebuffer.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ const VkExtent2D &Framebuffer::get_extent() const return extent; } -Framebuffer::Framebuffer(Device &device, const RenderTarget &render_target, const RenderPass &render_pass) : +Framebuffer::Framebuffer(vkb::core::DeviceC &device, const RenderTarget &render_target, const RenderPass &render_pass) : device{device}, extent{render_target.get_extent()} { diff --git a/framework/core/framebuffer.h b/framework/core/framebuffer.h index a68f479ceb..c6f6013662 100644 --- a/framework/core/framebuffer.h +++ b/framework/core/framebuffer.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -19,17 +19,23 @@ #include "common/helpers.h" #include "common/vk_common.h" -#include "core/render_pass.h" -#include "rendering/render_target.h" namespace vkb { +class RenderPass; +class RenderTarget; + +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core class Framebuffer { public: - Framebuffer(Device &device, const RenderTarget &render_target, const RenderPass &render_pass); + Framebuffer(vkb::core::DeviceC &device, const RenderTarget &render_target, const RenderPass &render_pass); Framebuffer(const Framebuffer &) = delete; @@ -46,7 +52,7 @@ class Framebuffer const VkExtent2D &get_extent() const; private: - Device &device; + vkb::core::DeviceC &device; VkFramebuffer handle{VK_NULL_HANDLE}; diff --git a/framework/core/hpp_allocated.h b/framework/core/hpp_allocated.h deleted file mode 100644 index ddec31938d..0000000000 --- a/framework/core/hpp_allocated.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Bradley Austin Davis. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "allocated.h" -#include "vulkan_resource.h" - -namespace vkb -{ -namespace allocated -{ -template -class HPPAllocated : public Allocated< - HandleType, - vk::DeviceMemory, - vkb::core::VulkanResourceCpp> -{ - using Parent = Allocated>; - - public: - using Parent::get_handle; - using Parent::Parent; - using Parent::update; - - HPPAllocated() = delete; - HPPAllocated(HPPAllocated const &) = delete; - HPPAllocated(HPPAllocated &&rhs) = default; - HPPAllocated &operator=(HPPAllocated const &) = delete; - HPPAllocated &operator=(HPPAllocated &&rhs) = default; - - // Import the base class constructors - template - HPPAllocated(const VmaAllocationCreateInfo &alloc_create_info, Args &&...args) : - Parent(alloc_create_info, std::forward(args)...) - {} - - /** - * @brief Copies byte data into the buffer - * @param data The data to copy from - * @param offset The offset to start the copying into the mapped data - */ - template - vk::DeviceSize update(const vk::ArrayProxy &data, size_t offset = 0) - { - return Parent::update(static_cast(data.data()), data.size() * sizeof(T), offset); - } - - /** - * @brief Copies byte data into the buffer - * @param data The data to copy from - * @param count The number of array elements - * @param offset The offset to start the copying into the mapped data - */ - template - vk::DeviceSize update_from_array(const T *data, size_t count, size_t offset = 0) - { - return update(vk::ArrayProxy{data, count}, offset); - } -}; - -} // namespace allocated -} // namespace vkb diff --git a/framework/core/hpp_command_buffer.cpp b/framework/core/hpp_command_buffer.cpp deleted file mode 100644 index 230349b961..0000000000 --- a/framework/core/hpp_command_buffer.cpp +++ /dev/null @@ -1,756 +0,0 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "core/hpp_command_buffer.h" -#include "rendering/subpass.h" -#include -#include -#include -#include - -namespace vkb -{ -namespace core -{ -HPPCommandBuffer::HPPCommandBuffer(vkb::core::HPPCommandPool &command_pool, vk::CommandBufferLevel level) : - VulkanResource(nullptr, &command_pool.get_device()), - level(level), - command_pool(command_pool), - max_push_constants_size(get_device().get_gpu().get_properties().limits.maxPushConstantsSize) -{ - vk::CommandBufferAllocateInfo allocate_info(command_pool.get_handle(), level, 1); - - set_handle(get_device().get_handle().allocateCommandBuffers(allocate_info).front()); -} - -HPPCommandBuffer::HPPCommandBuffer(HPPCommandBuffer &&other) : - VulkanResource(std::move(other)), - level(other.level), - command_pool(other.command_pool), - current_render_pass(std::exchange(other.current_render_pass, {})), - pipeline_state(std::exchange(other.pipeline_state, {})), - resource_binding_state(std::exchange(other.resource_binding_state, {})), - stored_push_constants(std::exchange(other.stored_push_constants, {})), - max_push_constants_size(std::exchange(other.max_push_constants_size, {})), - last_framebuffer_extent(std::exchange(other.last_framebuffer_extent, {})), - last_render_area_extent(std::exchange(other.last_render_area_extent, {})), - update_after_bind(std::exchange(other.update_after_bind, {})), - descriptor_set_layout_binding_state(std::exchange(other.descriptor_set_layout_binding_state, {})) -{ -} - -HPPCommandBuffer::~HPPCommandBuffer() -{ - // Destroy command buffer - if (get_handle()) - { - get_device().get_handle().freeCommandBuffers(command_pool.get_handle(), get_handle()); - } -} - -vk::Result HPPCommandBuffer::begin(vk::CommandBufferUsageFlags flags, HPPCommandBuffer *primary_cmd_buf) -{ - if (level == vk::CommandBufferLevel::eSecondary) - { - assert(primary_cmd_buf && "A primary command buffer pointer must be provided when calling begin from a secondary one"); - auto const &render_pass_binding = primary_cmd_buf->get_current_render_pass(); - - return begin(flags, render_pass_binding.render_pass, render_pass_binding.framebuffer, primary_cmd_buf->get_current_subpass_index()); - } - - return begin(flags, nullptr, nullptr, 0); -} - -vk::Result HPPCommandBuffer::begin(vk::CommandBufferUsageFlags flags, const vkb::core::HPPRenderPass *render_pass, const vkb::core::HPPFramebuffer *framebuffer, uint32_t subpass_index) -{ - // Reset state - pipeline_state.reset(); - resource_binding_state.reset(); - descriptor_set_layout_binding_state.clear(); - stored_push_constants.clear(); - - vk::CommandBufferBeginInfo begin_info(flags); - vk::CommandBufferInheritanceInfo inheritance; - - if (level == vk::CommandBufferLevel::eSecondary) - { - assert((render_pass && framebuffer) && "Render pass and framebuffer must be provided when calling begin from a secondary one"); - - current_render_pass.render_pass = render_pass; - current_render_pass.framebuffer = framebuffer; - - inheritance.renderPass = current_render_pass.render_pass->get_handle(); - inheritance.framebuffer = current_render_pass.framebuffer->get_handle(); - inheritance.subpass = subpass_index; - - begin_info.pInheritanceInfo = &inheritance; - } - - get_handle().begin(begin_info); - return vk::Result::eSuccess; -} - -void HPPCommandBuffer::begin_query(const vkb::core::HPPQueryPool &query_pool, uint32_t query, vk::QueryControlFlags flags) -{ - get_handle().beginQuery(query_pool.get_handle(), query, flags); -} - -void HPPCommandBuffer::begin_render_pass(const vkb::rendering::HPPRenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector &clear_values, - const std::vector> &subpasses, - vk::SubpassContents contents) -{ - // Reset state - pipeline_state.reset(); - resource_binding_state.reset(); - descriptor_set_layout_binding_state.clear(); - - auto &render_pass = get_render_pass(render_target, load_store_infos, subpasses); - auto &framebuffer = get_device().get_resource_cache().request_framebuffer(render_target, render_pass); - - begin_render_pass(render_target, render_pass, framebuffer, clear_values, contents); -} - -void HPPCommandBuffer::begin_render_pass(const vkb::rendering::HPPRenderTarget &render_target, - const vkb::core::HPPRenderPass &render_pass, - const vkb::core::HPPFramebuffer &framebuffer, - const std::vector &clear_values, - vk::SubpassContents contents) -{ - current_render_pass.render_pass = &render_pass; - current_render_pass.framebuffer = &framebuffer; - - // Begin render pass - vk::RenderPassBeginInfo begin_info( - current_render_pass.render_pass->get_handle(), current_render_pass.framebuffer->get_handle(), {{}, render_target.get_extent()}, clear_values); - - const auto &framebuffer_extent = current_render_pass.framebuffer->get_extent(); - - // Test the requested render area to confirm that it is optimal and could not cause a performance reduction - if (!is_render_size_optimal(framebuffer_extent, begin_info.renderArea)) - { - // Only prints the warning if the framebuffer or render area are different since the last time the render size was not optimal - if ((framebuffer_extent != last_framebuffer_extent) || (begin_info.renderArea.extent != last_render_area_extent)) - { - LOGW("Render target extent is not an optimal size, this may result in reduced performance."); - } - - last_framebuffer_extent = framebuffer_extent; - last_render_area_extent = begin_info.renderArea.extent; - } - - get_handle().beginRenderPass(begin_info, contents); - - // Update blend state attachments for first subpass - auto blend_state = pipeline_state.get_color_blend_state(); - blend_state.attachments.resize(current_render_pass.render_pass->get_color_output_count(pipeline_state.get_subpass_index())); - pipeline_state.set_color_blend_state(blend_state); -} - -void HPPCommandBuffer::bind_buffer( - const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, vk::DeviceSize range, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_buffer(buffer, offset, range, set, binding, array_element); -} - -void HPPCommandBuffer::bind_image( - const vkb::core::HPPImageView &image_view, const vkb::core::HPPSampler &sampler, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_image(image_view, sampler, set, binding, array_element); -} - -void HPPCommandBuffer::bind_image(const vkb::core::HPPImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_image(image_view, set, binding, array_element); -} - -void HPPCommandBuffer::bind_index_buffer(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, vk::IndexType index_type) -{ - get_handle().bindIndexBuffer(buffer.get_handle(), offset, index_type); -} - -void HPPCommandBuffer::bind_input(const vkb::core::HPPImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element) -{ - resource_binding_state.bind_input(image_view, set, binding, array_element); -} - -void HPPCommandBuffer::bind_lighting(vkb::rendering::LightingStateCpp &lighting_state, uint32_t set, uint32_t binding) -{ - bind_buffer(lighting_state.light_buffer.get_buffer(), lighting_state.light_buffer.get_offset(), lighting_state.light_buffer.get_size(), set, binding, 0); - - set_specialization_constant(0, to_u32(lighting_state.directional_lights.size())); - set_specialization_constant(1, to_u32(lighting_state.point_lights.size())); - set_specialization_constant(2, to_u32(lighting_state.spot_lights.size())); -} - -void HPPCommandBuffer::bind_pipeline_layout(vkb::core::HPPPipelineLayout &pipeline_layout) -{ - pipeline_state.set_pipeline_layout(pipeline_layout); -} - -void HPPCommandBuffer::bind_vertex_buffers(uint32_t first_binding, - const std::vector> &buffers, - const std::vector &offsets) -{ - std::vector buffer_handles(buffers.size(), nullptr); - std::transform(buffers.begin(), buffers.end(), buffer_handles.begin(), [](const vkb::core::BufferCpp &buffer) { return buffer.get_handle(); }); - get_handle().bindVertexBuffers(first_binding, buffer_handles, offsets); -} - -void HPPCommandBuffer::blit_image(const vkb::core::HPPImage &src_img, const vkb::core::HPPImage &dst_img, const std::vector ®ions) -{ - get_handle().blitImage( - src_img.get_handle(), vk::ImageLayout::eTransferSrcOptimal, dst_img.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions, vk::Filter::eNearest); -} - -void HPPCommandBuffer::buffer_memory_barrier(const vkb::core::BufferCpp &buffer, - vk::DeviceSize offset, - vk::DeviceSize size, - const vkb::common::HPPBufferMemoryBarrier &memory_barrier) -{ - vk::BufferMemoryBarrier buffer_memory_barrier(memory_barrier.src_access_mask, memory_barrier.dst_access_mask, {}, {}, buffer.get_handle(), offset, size); - - vk::PipelineStageFlags src_stage_mask = memory_barrier.src_stage_mask; - vk::PipelineStageFlags dst_stage_mask = memory_barrier.dst_stage_mask; - - get_handle().pipelineBarrier(src_stage_mask, dst_stage_mask, {}, {}, buffer_memory_barrier, {}); -} - -void HPPCommandBuffer::clear(vk::ClearAttachment attachment, vk::ClearRect rect) -{ - get_handle().clearAttachments(attachment, rect); -} - -void HPPCommandBuffer::copy_buffer(const vkb::core::BufferCpp &src_buffer, const vkb::core::BufferCpp &dst_buffer, vk::DeviceSize size) -{ - vk::BufferCopy copy_region({}, {}, size); - get_handle().copyBuffer(src_buffer.get_handle(), dst_buffer.get_handle(), copy_region); -} - -void HPPCommandBuffer::copy_buffer_to_image(const vkb::core::BufferCpp &buffer, - const vkb::core::HPPImage &image, - const std::vector ®ions) -{ - get_handle().copyBufferToImage(buffer.get_handle(), image.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions); -} - -void HPPCommandBuffer::copy_image(const vkb::core::HPPImage &src_img, const vkb::core::HPPImage &dst_img, const std::vector ®ions) -{ - get_handle().copyImage(src_img.get_handle(), vk::ImageLayout::eTransferSrcOptimal, dst_img.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions); -} - -void HPPCommandBuffer::copy_image_to_buffer(const vkb::core::HPPImage &image, - vk::ImageLayout image_layout, - const vkb::core::BufferCpp &buffer, - const std::vector ®ions) -{ - get_handle().copyImageToBuffer(image.get_handle(), image_layout, buffer.get_handle(), regions); -} - -void HPPCommandBuffer::dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z) -{ - flush(vk::PipelineBindPoint::eCompute); - get_handle().dispatch(group_count_x, group_count_y, group_count_z); -} - -void HPPCommandBuffer::dispatch_indirect(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset) -{ - flush(vk::PipelineBindPoint::eCompute); - get_handle().dispatchIndirect(buffer.get_handle(), offset); -} - -void HPPCommandBuffer::draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance) -{ - flush(vk::PipelineBindPoint::eGraphics); - get_handle().draw(vertex_count, instance_count, first_vertex, first_instance); -} - -void HPPCommandBuffer::draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance) -{ - flush(vk::PipelineBindPoint::eGraphics); - get_handle().drawIndexed(index_count, instance_count, first_index, vertex_offset, first_instance); -} - -void HPPCommandBuffer::draw_indexed_indirect(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, uint32_t draw_count, uint32_t stride) -{ - flush(vk::PipelineBindPoint::eGraphics); - get_handle().drawIndexedIndirect(buffer.get_handle(), offset, draw_count, stride); -} - -vk::Result HPPCommandBuffer::end() -{ - get_handle().end(); - - return vk::Result::eSuccess; -} - -void HPPCommandBuffer::end_query(const vkb::core::HPPQueryPool &query_pool, uint32_t query) -{ - get_handle().endQuery(query_pool.get_handle(), query); -} - -void HPPCommandBuffer::end_render_pass() -{ - get_handle().endRenderPass(); -} - -void HPPCommandBuffer::execute_commands(HPPCommandBuffer &secondary_command_buffer) -{ - get_handle().executeCommands(secondary_command_buffer.get_handle()); -} - -void HPPCommandBuffer::execute_commands(std::vector &secondary_command_buffers) -{ - std::vector sec_cmd_buf_handles(secondary_command_buffers.size(), nullptr); - std::transform(secondary_command_buffers.begin(), - secondary_command_buffers.end(), - sec_cmd_buf_handles.begin(), - [](const vkb::core::HPPCommandBuffer *sec_cmd_buf) { return sec_cmd_buf->get_handle(); }); - get_handle().executeCommands(sec_cmd_buf_handles); -} - -vkb::core::HPPRenderPass &HPPCommandBuffer::get_render_pass(const vkb::rendering::HPPRenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector> &subpasses) -{ - // Create render pass - assert(subpasses.size() > 0 && "Cannot create a render pass without any subpass"); - - std::vector subpass_infos(subpasses.size()); - auto subpass_info_it = subpass_infos.begin(); - for (auto &subpass : subpasses) - { - subpass_info_it->input_attachments = subpass->get_input_attachments(); - subpass_info_it->output_attachments = subpass->get_output_attachments(); - subpass_info_it->color_resolve_attachments = subpass->get_color_resolve_attachments(); - subpass_info_it->disable_depth_stencil_attachment = subpass->get_disable_depth_stencil_attachment(); - subpass_info_it->depth_stencil_resolve_mode = subpass->get_depth_stencil_resolve_mode(); - subpass_info_it->depth_stencil_resolve_attachment = subpass->get_depth_stencil_resolve_attachment(); - subpass_info_it->debug_name = subpass->get_debug_name(); - - ++subpass_info_it; - } - - return get_device().get_resource_cache().request_render_pass(render_target.get_attachments(), load_store_infos, subpass_infos); -} - -void HPPCommandBuffer::image_memory_barrier(const vkb::core::HPPImageView &image_view, const vkb::common::HPPImageMemoryBarrier &memory_barrier) const -{ - // Adjust barrier's subresource range for depth images - auto subresource_range = image_view.get_subresource_range(); - auto format = image_view.get_format(); - if (vkb::common::is_depth_only_format(format)) - { - subresource_range.aspectMask = vk::ImageAspectFlagBits::eDepth; - } - else if (vkb::common::is_depth_stencil_format(format)) - { - subresource_range.aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil; - } - - vk::ImageMemoryBarrier image_memory_barrier(memory_barrier.src_access_mask, - memory_barrier.dst_access_mask, - memory_barrier.old_layout, - memory_barrier.new_layout, - memory_barrier.old_queue_family, - memory_barrier.new_queue_family, - image_view.get_image().get_handle(), - subresource_range); - - vk::PipelineStageFlags src_stage_mask = memory_barrier.src_stage_mask; - vk::PipelineStageFlags dst_stage_mask = memory_barrier.dst_stage_mask; - - get_handle().pipelineBarrier(src_stage_mask, dst_stage_mask, {}, {}, {}, image_memory_barrier); -} - -void HPPCommandBuffer::next_subpass() -{ - // Increment subpass index - pipeline_state.set_subpass_index(pipeline_state.get_subpass_index() + 1); - - // Update blend state attachments - auto blend_state = pipeline_state.get_color_blend_state(); - blend_state.attachments.resize(current_render_pass.render_pass->get_color_output_count(pipeline_state.get_subpass_index())); - pipeline_state.set_color_blend_state(blend_state); - - // Reset descriptor sets - resource_binding_state.reset(); - descriptor_set_layout_binding_state.clear(); - - // Clear stored push constants - stored_push_constants.clear(); - - get_handle().nextSubpass(vk::SubpassContents::eInline); -} - -void HPPCommandBuffer::push_constants(const std::vector &values) -{ - uint32_t push_constant_size = to_u32(stored_push_constants.size() + values.size()); - - if (push_constant_size > max_push_constants_size) - { - LOGE("Push constant limit of {} exceeded (pushing {} bytes for a total of {} bytes)", max_push_constants_size, values.size(), push_constant_size); - throw std::runtime_error("Push constant limit exceeded."); - } - else - { - stored_push_constants.insert(stored_push_constants.end(), values.begin(), values.end()); - } -} - -vk::Result HPPCommandBuffer::reset(ResetMode reset_mode) -{ - assert(reset_mode == command_pool.get_reset_mode() && "Command buffer reset mode must match the one used by the pool to allocate it"); - - if (reset_mode == ResetMode::ResetIndividually) - { - get_handle().reset(vk::CommandBufferResetFlagBits::eReleaseResources); - } - - return vk::Result::eSuccess; -} - -void HPPCommandBuffer::reset_query_pool(const vkb::core::HPPQueryPool &query_pool, uint32_t first_query, uint32_t query_count) -{ - get_handle().resetQueryPool(query_pool.get_handle(), first_query, query_count); -} - -void HPPCommandBuffer::resolve_image(const vkb::core::HPPImage &src_img, const vkb::core::HPPImage &dst_img, const std::vector ®ions) -{ - get_handle().resolveImage(src_img.get_handle(), vk::ImageLayout::eTransferSrcOptimal, dst_img.get_handle(), vk::ImageLayout::eTransferDstOptimal, regions); -} - -void HPPCommandBuffer::set_blend_constants(const std::array &blend_constants) -{ - get_handle().setBlendConstants(blend_constants.data()); -} - -void HPPCommandBuffer::set_color_blend_state(const vkb::rendering::HPPColorBlendState &state_info) -{ - pipeline_state.set_color_blend_state(state_info); -} - -void HPPCommandBuffer::set_depth_bias(float depth_bias_constant_factor, float depth_bias_clamp, float depth_bias_slope_factor) -{ - get_handle().setDepthBias(depth_bias_constant_factor, depth_bias_clamp, depth_bias_slope_factor); -} - -void HPPCommandBuffer::set_depth_bounds(float min_depth_bounds, float max_depth_bounds) -{ - get_handle().setDepthBounds(min_depth_bounds, max_depth_bounds); -} - -void HPPCommandBuffer::set_depth_stencil_state(const vkb::rendering::HPPDepthStencilState &state_info) -{ - pipeline_state.set_depth_stencil_state(state_info); -} - -void HPPCommandBuffer::set_input_assembly_state(const vkb::rendering::HPPInputAssemblyState &state_info) -{ - pipeline_state.set_input_assembly_state(state_info); -} - -void HPPCommandBuffer::set_line_width(float line_width) -{ - get_handle().setLineWidth(line_width); -} - -void HPPCommandBuffer::set_multisample_state(const vkb::rendering::HPPMultisampleState &state_info) -{ - pipeline_state.set_multisample_state(state_info); -} - -void HPPCommandBuffer::set_rasterization_state(const vkb::rendering::HPPRasterizationState &state_info) -{ - pipeline_state.set_rasterization_state(state_info); -} - -void HPPCommandBuffer::set_scissor(uint32_t first_scissor, const std::vector &scissors) -{ - get_handle().setScissor(first_scissor, scissors); -} - -void HPPCommandBuffer::set_specialization_constant(uint32_t constant_id, const std::vector &data) -{ - pipeline_state.set_specialization_constant(constant_id, data); -} - -void HPPCommandBuffer::set_update_after_bind(bool update_after_bind_) -{ - update_after_bind = update_after_bind_; -} - -void HPPCommandBuffer::set_vertex_input_state(const vkb::rendering::HPPVertexInputState &state_info) -{ - pipeline_state.set_vertex_input_state(state_info); -} - -void HPPCommandBuffer::set_viewport(uint32_t first_viewport, const std::vector &viewports) -{ - get_handle().setViewport(first_viewport, viewports); -} - -void HPPCommandBuffer::set_viewport_state(const vkb::rendering::HPPViewportState &state_info) -{ - pipeline_state.set_viewport_state(state_info); -} - -void HPPCommandBuffer::update_buffer(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, const std::vector &data) -{ - get_handle().updateBuffer(buffer.get_handle(), offset, data); -} - -void HPPCommandBuffer::write_timestamp(vk::PipelineStageFlagBits pipeline_stage, const vkb::core::HPPQueryPool &query_pool, uint32_t query) -{ - get_handle().writeTimestamp(pipeline_stage, query_pool.get_handle(), query); -} - -void HPPCommandBuffer::flush(vk::PipelineBindPoint pipeline_bind_point) -{ - flush_pipeline_state(pipeline_bind_point); - flush_push_constants(); - flush_descriptor_state(pipeline_bind_point); -} - -void HPPCommandBuffer::flush_descriptor_state(vk::PipelineBindPoint pipeline_bind_point) -{ - assert(command_pool.get_render_frame() && "The command pool must be associated to a render frame"); - - const auto &pipeline_layout = pipeline_state.get_pipeline_layout(); - - std::unordered_set update_descriptor_sets; - - // Iterate over the shader sets to check if they have already been bound - // If they have, add the set so that the command buffer later updates it - for (auto &set_it : pipeline_layout.get_shader_sets()) - { - uint32_t descriptor_set_id = set_it.first; - - auto descriptor_set_layout_it = descriptor_set_layout_binding_state.find(descriptor_set_id); - - if (descriptor_set_layout_it != descriptor_set_layout_binding_state.end()) - { - if (descriptor_set_layout_it->second->get_handle() != pipeline_layout.get_descriptor_set_layout(descriptor_set_id).get_handle()) - { - update_descriptor_sets.emplace(descriptor_set_id); - } - } - } - - // Validate that the bound descriptor set layouts exist in the pipeline layout - for (auto set_it = descriptor_set_layout_binding_state.begin(); set_it != descriptor_set_layout_binding_state.end();) - { - if (!pipeline_layout.has_descriptor_set_layout(set_it->first)) - { - set_it = descriptor_set_layout_binding_state.erase(set_it); - } - else - { - ++set_it; - } - } - - // Check if a descriptor set needs to be created - if (resource_binding_state.is_dirty() || !update_descriptor_sets.empty()) - { - resource_binding_state.clear_dirty(); - - // Iterate over all of the resource sets bound by the command buffer - for (auto &resource_set_it : resource_binding_state.get_resource_sets()) - { - uint32_t descriptor_set_id = resource_set_it.first; - auto &resource_set = resource_set_it.second; - - // Don't update resource set if it's not in the update list OR its state hasn't changed - if (!resource_set.is_dirty() && (update_descriptor_sets.find(descriptor_set_id) == update_descriptor_sets.end())) - { - continue; - } - - // Clear dirty flag for resource set - resource_binding_state.clear_dirty(descriptor_set_id); - - // Skip resource set if a descriptor set layout doesn't exist for it - if (!pipeline_layout.has_descriptor_set_layout(descriptor_set_id)) - { - continue; - } - - auto &descriptor_set_layout = pipeline_layout.get_descriptor_set_layout(descriptor_set_id); - - // Make descriptor set layout bound for current set - descriptor_set_layout_binding_state[descriptor_set_id] = &descriptor_set_layout; - - BindingMap buffer_infos; - BindingMap image_infos; - - std::vector dynamic_offsets; - - // Iterate over all resource bindings - for (auto &binding_it : resource_set.get_resource_bindings()) - { - auto binding_index = binding_it.first; - auto &binding_resources = binding_it.second; - - // Check if binding exists in the pipeline layout - if (auto binding_info = descriptor_set_layout.get_layout_binding(binding_index)) - { - // Iterate over all binding resources - for (auto &element_it : binding_resources) - { - auto array_element = element_it.first; - auto &resource_info = element_it.second; - - // Pointer references - auto &buffer = resource_info.buffer; - auto &sampler = resource_info.sampler; - auto &image_view = resource_info.image_view; - - // Get buffer info - if (buffer != nullptr && vkb::common::is_buffer_descriptor_type(binding_info->descriptorType)) - { - vk::DescriptorBufferInfo buffer_info(resource_info.buffer->get_handle(), resource_info.offset, resource_info.range); - - if (vkb::common::is_dynamic_buffer_descriptor_type(binding_info->descriptorType)) - { - dynamic_offsets.push_back(to_u32(buffer_info.offset)); - buffer_info.offset = 0; - } - - buffer_infos[binding_index][array_element] = buffer_info; - } - - // Get image info - else if (image_view != nullptr || sampler != nullptr) - { - // Can be null for input attachments - vk::DescriptorImageInfo image_info(sampler ? sampler->get_handle() : nullptr, image_view->get_handle()); - - if (image_view != nullptr) - { - // Add image layout info based on descriptor type - switch (binding_info->descriptorType) - { - case vk::DescriptorType::eCombinedImageSampler: - image_info.imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal; - break; - case vk::DescriptorType::eInputAttachment: - image_info.imageLayout = - vkb::common::is_depth_format(image_view->get_format()) ? vk::ImageLayout::eDepthStencilReadOnlyOptimal : vk::ImageLayout::eShaderReadOnlyOptimal; - break; - case vk::DescriptorType::eStorageImage: - image_info.imageLayout = vk::ImageLayout::eGeneral; - break; - default: - continue; - } - } - - image_infos[binding_index][array_element] = image_info; - } - } - - assert((!update_after_bind || - (buffer_infos.count(binding_index) > 0 || (image_infos.count(binding_index) > 0))) && - "binding index with no buffer or image infos can't be checked for adding to bindings_to_update"); - } - } - - vk::DescriptorSet descriptor_set_handle = command_pool.get_render_frame()->request_descriptor_set( - descriptor_set_layout, buffer_infos, image_infos, update_after_bind, command_pool.get_thread_index()); - - // Bind descriptor set - get_handle().bindDescriptorSets(pipeline_bind_point, pipeline_layout.get_handle(), descriptor_set_id, descriptor_set_handle, dynamic_offsets); - } - } -} - -void HPPCommandBuffer::flush_pipeline_state(vk::PipelineBindPoint pipeline_bind_point) -{ - // Create a new pipeline only if the graphics state changed - if (!pipeline_state.is_dirty()) - { - return; - } - - pipeline_state.clear_dirty(); - - // Create and bind pipeline - if (pipeline_bind_point == vk::PipelineBindPoint::eGraphics) - { - pipeline_state.set_render_pass(*current_render_pass.render_pass); - auto &pipeline = get_device().get_resource_cache().request_graphics_pipeline(pipeline_state); - - get_handle().bindPipeline(pipeline_bind_point, pipeline.get_handle()); - } - else if (pipeline_bind_point == vk::PipelineBindPoint::eCompute) - { - auto &pipeline = get_device().get_resource_cache().request_compute_pipeline(pipeline_state); - - get_handle().bindPipeline(pipeline_bind_point, pipeline.get_handle()); - } - else - { - throw "Only graphics and compute pipeline bind points are supported now"; - } -} - -void HPPCommandBuffer::flush_push_constants() -{ - if (stored_push_constants.empty()) - { - return; - } - - const vkb::core::HPPPipelineLayout &pipeline_layout = pipeline_state.get_pipeline_layout(); - - vk::ShaderStageFlags shader_stage = pipeline_layout.get_push_constant_range_stage(to_u32(stored_push_constants.size())); - - if (shader_stage) - { - get_handle().pushConstants(pipeline_layout.get_handle(), shader_stage, 0, stored_push_constants); - } - else - { - LOGW("Push constant range [{}, {}] not found", 0, stored_push_constants.size()); - } - - stored_push_constants.clear(); -} - -const HPPCommandBuffer::RenderPassBinding &HPPCommandBuffer::get_current_render_pass() const -{ - return current_render_pass; -} - -const uint32_t HPPCommandBuffer::get_current_subpass_index() const -{ - return pipeline_state.get_subpass_index(); -} - -const bool HPPCommandBuffer::is_render_size_optimal(const vk::Extent2D &framebuffer_extent, const vk::Rect2D &render_area) -{ - auto render_area_granularity = current_render_pass.render_pass->get_render_area_granularity(); - - return ((render_area.offset.x % render_area_granularity.width == 0) && (render_area.offset.y % render_area_granularity.height == 0) && - ((render_area.extent.width % render_area_granularity.width == 0) || (render_area.offset.x + render_area.extent.width == framebuffer_extent.width)) && - ((render_area.extent.height % render_area_granularity.height == 0) || (render_area.offset.y + render_area.extent.height == framebuffer_extent.height))); -} - -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_command_buffer.h b/framework/core/hpp_command_buffer.h deleted file mode 100644 index 20ec82a2dd..0000000000 --- a/framework/core/hpp_command_buffer.h +++ /dev/null @@ -1,257 +0,0 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace vkb -{ -namespace rendering -{ -template -struct LightingState; -using LightingStateCpp = LightingState; -template -class Subpass; -using SubpassCpp = Subpass; -} // namespace rendering - -namespace core -{ -class HPPCommandPool; -class HPPDescriptorSetLayout; - -/** - * @brief Helper class to manage and record a command buffer, building and - * keeping track of pipeline state and resource bindings - */ -class HPPCommandBuffer : public vkb::core::VulkanResourceCpp -{ - public: - struct RenderPassBinding - { - const vkb::core::HPPRenderPass *render_pass; - const vkb::core::HPPFramebuffer *framebuffer; - }; - - enum class ResetMode - { - ResetPool, - ResetIndividually, - AlwaysAllocate, - }; - - public: - HPPCommandBuffer(vkb::core::HPPCommandPool &command_pool, vk::CommandBufferLevel level); - HPPCommandBuffer(HPPCommandBuffer &&other); - ~HPPCommandBuffer(); - - HPPCommandBuffer(const HPPCommandBuffer &) = delete; - HPPCommandBuffer &operator=(const HPPCommandBuffer &) = delete; - HPPCommandBuffer &operator=(HPPCommandBuffer &&) = delete; - - /** - * @brief Sets the command buffer so that it is ready for recording - * If it is a secondary command buffer, a pointer to the - * primary command buffer it inherits from must be provided - * @param flags Usage behavior for the command buffer - * @param primary_cmd_buf (optional) - * @return Whether it succeeded or not - */ - vk::Result begin(vk::CommandBufferUsageFlags flags, HPPCommandBuffer *primary_cmd_buf = nullptr); - - /** - * @brief Sets the command buffer so that it is ready for recording - * If it is a secondary command buffer, pointers to the - * render pass and framebuffer as well as subpass index must be provided - * @param flags Usage behavior for the command buffer - * @param render_pass - * @param framebuffer - * @param subpass_index - * @return Whether it succeeded or not - */ - vk::Result begin(vk::CommandBufferUsageFlags flags, const vkb::core::HPPRenderPass *render_pass, const vkb::core::HPPFramebuffer *framebuffer, uint32_t subpass_index); - - void begin_query(const vkb::core::HPPQueryPool &query_pool, uint32_t query, vk::QueryControlFlags flags); - void begin_render_pass(const vkb::rendering::HPPRenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector &clear_values, - const std::vector> &subpasses, - vk::SubpassContents contents = vk::SubpassContents::eInline); - void begin_render_pass(const vkb::rendering::HPPRenderTarget &render_target, - const vkb::core::HPPRenderPass &render_pass, - const vkb::core::HPPFramebuffer &framebuffer, - const std::vector &clear_values, - vk::SubpassContents contents = vk::SubpassContents::eInline); - void bind_buffer(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, vk::DeviceSize range, uint32_t set, uint32_t binding, uint32_t array_element); - void bind_image(const vkb::core::HPPImageView &image_view, const vkb::core::HPPSampler &sampler, uint32_t set, uint32_t binding, uint32_t array_element); - void bind_image(const vkb::core::HPPImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element); - void bind_index_buffer(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, vk::IndexType index_type); - void bind_input(const vkb::core::HPPImageView &image_view, uint32_t set, uint32_t binding, uint32_t array_element); - void bind_lighting(vkb::rendering::LightingStateCpp &lighting_state, uint32_t set, uint32_t binding); - void bind_pipeline_layout(vkb::core::HPPPipelineLayout &pipeline_layout); - void bind_vertex_buffers(uint32_t first_binding, - const std::vector> &buffers, - const std::vector &offsets); - void blit_image(const vkb::core::HPPImage &src_img, const vkb::core::HPPImage &dst_img, const std::vector ®ions); - void buffer_memory_barrier(const vkb::core::BufferCpp &buffer, - vk::DeviceSize offset, - vk::DeviceSize size, - const vkb::common::HPPBufferMemoryBarrier &memory_barrier); - void clear(vk::ClearAttachment info, vk::ClearRect rect); - void copy_buffer(const vkb::core::BufferCpp &src_buffer, const vkb::core::BufferCpp &dst_buffer, vk::DeviceSize size); - void copy_buffer_to_image(const vkb::core::BufferCpp &buffer, const vkb::core::HPPImage &image, const std::vector ®ions); - void copy_image(const vkb::core::HPPImage &src_img, const vkb::core::HPPImage &dst_img, const std::vector ®ions); - void copy_image_to_buffer(const vkb::core::HPPImage &image, - vk::ImageLayout image_layout, - const vkb::core::BufferCpp &buffer, - const std::vector ®ions); - void dispatch(uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z); - void dispatch_indirect(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset); - void draw(uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance); - void draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, int32_t vertex_offset, uint32_t first_instance); - void draw_indexed_indirect(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, uint32_t draw_count, uint32_t stride); - vk::Result end(); - void end_query(const vkb::core::HPPQueryPool &query_pool, uint32_t query); - void end_render_pass(); - void execute_commands(HPPCommandBuffer &secondary_command_buffer); - void execute_commands(std::vector &secondary_command_buffers); - vkb::core::HPPRenderPass &get_render_pass(const vkb::rendering::HPPRenderTarget &render_target, - const std::vector &load_store_infos, - const std::vector> &subpasses); - void image_memory_barrier(const vkb::core::HPPImageView &image_view, const vkb::common::HPPImageMemoryBarrier &memory_barrier) const; - void next_subpass(); - - /** - * @brief Records byte data into the command buffer to be pushed as push constants to each draw call - * @param values The byte data to store - */ - void push_constants(const std::vector &values); - template - void push_constants(const T &value) - { - auto data = to_bytes(value); - - uint32_t size = to_u32(stored_push_constants.size() + data.size()); - - if (size > max_push_constants_size) - { - LOGE("Push constant limit exceeded ({} / {} bytes)", size, max_push_constants_size); - throw std::runtime_error("Cannot overflow push constant limit"); - } - - stored_push_constants.insert(stored_push_constants.end(), data.begin(), data.end()); - } - - /** - * @brief Reset the command buffer to a state where it can be recorded to - * @param reset_mode How to reset the buffer, should match the one used by the pool to allocate it - */ - vk::Result reset(ResetMode reset_mode); - - void reset_query_pool(const vkb::core::HPPQueryPool &query_pool, uint32_t first_query, uint32_t query_count); - void resolve_image(const vkb::core::HPPImage &src_img, const vkb::core::HPPImage &dst_img, const std::vector ®ions); - void set_blend_constants(const std::array &blend_constants); - void set_color_blend_state(const vkb::rendering::HPPColorBlendState &state_info); - void set_depth_bias(float depth_bias_constant_factor, float depth_bias_clamp, float depth_bias_slope_factor); - void set_depth_bounds(float min_depth_bounds, float max_depth_bounds); - void set_depth_stencil_state(const vkb::rendering::HPPDepthStencilState &state_info); - void set_input_assembly_state(const vkb::rendering::HPPInputAssemblyState &state_info); - void set_line_width(float line_width); - void set_multisample_state(const vkb::rendering::HPPMultisampleState &state_info); - void set_rasterization_state(const vkb::rendering::HPPRasterizationState &state_info); - void set_scissor(uint32_t first_scissor, const std::vector &scissors); - - template - void set_specialization_constant(uint32_t constant_id, const T &data); - - void set_specialization_constant(uint32_t constant_id, const std::vector &data); - - void set_update_after_bind(bool update_after_bind_); - void set_vertex_input_state(const vkb::rendering::HPPVertexInputState &state_info); - void set_viewport(uint32_t first_viewport, const std::vector &viewports); - void set_viewport_state(const vkb::rendering::HPPViewportState &state_info); - void update_buffer(const vkb::core::BufferCpp &buffer, vk::DeviceSize offset, const std::vector &data); - void write_timestamp(vk::PipelineStageFlagBits pipeline_stage, const vkb::core::HPPQueryPool &query_pool, uint32_t query); - - private: - /** - * @brief Flushes the command buffer, pushing the new changes - * @param pipeline_bind_point The type of pipeline we want to flush - */ - void flush(vk::PipelineBindPoint pipeline_bind_point); - - /** - * @brief Flush the descriptor set state - */ - void flush_descriptor_state(vk::PipelineBindPoint pipeline_bind_point); - - /** - * @brief Flush the pipeline state - */ - void flush_pipeline_state(vk::PipelineBindPoint pipeline_bind_point); - - /** - * @brief Flush the push constant state - */ - void flush_push_constants(); - - const RenderPassBinding &get_current_render_pass() const; - const uint32_t get_current_subpass_index() const; - - /** - * @brief Check that the render area is an optimal size by comparing to the render area granularity - */ - const bool is_render_size_optimal(const vk::Extent2D &extent, const vk::Rect2D &render_area); - - private: - const vk::CommandBufferLevel level = {}; - vkb::core::HPPCommandPool &command_pool; - RenderPassBinding current_render_pass = {}; - vkb::rendering::HPPPipelineState pipeline_state = {}; - vkb::HPPResourceBindingState resource_binding_state = {}; - std::vector stored_push_constants = {}; - uint32_t max_push_constants_size = {}; - vk::Extent2D last_framebuffer_extent = {}; - vk::Extent2D last_render_area_extent = {}; - - // If true, it becomes the responsibility of the caller to update ANY descriptor bindings - // that contain update after bind, as they wont be implicitly updated - bool update_after_bind = false; - - std::unordered_map descriptor_set_layout_binding_state; -}; - -template -inline void HPPCommandBuffer::set_specialization_constant(uint32_t constant_id, const T &data) -{ - set_specialization_constant(constant_id, to_bytes(data)); -} - -template <> -inline void HPPCommandBuffer::set_specialization_constant(std::uint32_t constant_id, const bool &data) -{ - set_specialization_constant(constant_id, to_bytes(to_u32(data))); -} -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_command_pool.cpp b/framework/core/hpp_command_pool.cpp deleted file mode 100644 index 5d2eb4fc1d..0000000000 --- a/framework/core/hpp_command_pool.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -namespace vkb -{ -namespace core -{ -HPPCommandPool::HPPCommandPool(HPPDevice &d, - uint32_t queue_family_index, - vkb::rendering::HPPRenderFrame *render_frame, - size_t thread_index, - HPPCommandBuffer::ResetMode reset_mode) : - device{d}, render_frame{render_frame}, thread_index{thread_index}, reset_mode{reset_mode} -{ - vk::CommandPoolCreateFlags flags; - switch (reset_mode) - { - case HPPCommandBuffer::ResetMode::ResetIndividually: - case HPPCommandBuffer::ResetMode::AlwaysAllocate: - flags = vk::CommandPoolCreateFlagBits::eResetCommandBuffer; - break; - case HPPCommandBuffer::ResetMode::ResetPool: - default: - flags = vk::CommandPoolCreateFlagBits::eTransient; - break; - } - - vk::CommandPoolCreateInfo command_pool_create_info(flags, queue_family_index); - - handle = device.get_handle().createCommandPool(command_pool_create_info); -} - -HPPCommandPool::HPPCommandPool(HPPCommandPool &&other) : - device(other.device), - handle(std::exchange(other.handle, {})), - queue_family_index(std::exchange(other.queue_family_index, {})), - primary_command_buffers{std::move(other.primary_command_buffers)}, - active_primary_command_buffer_count(std::exchange(other.active_primary_command_buffer_count, {})), - secondary_command_buffers{std::move(other.secondary_command_buffers)}, - active_secondary_command_buffer_count(std::exchange(other.active_secondary_command_buffer_count, {})), - render_frame(std::exchange(other.render_frame, {})), - thread_index(std::exchange(other.thread_index, {})), - reset_mode(std::exchange(other.reset_mode, {})) -{ -} - -HPPCommandPool::~HPPCommandPool() -{ - // clear command buffers before destroying the command pool - primary_command_buffers.clear(); - secondary_command_buffers.clear(); - - // Destroy command pool - if (handle) - { - device.get_handle().destroyCommandPool(handle); - } -} - -HPPDevice &HPPCommandPool::get_device() -{ - return device; -} - -vk::CommandPool HPPCommandPool::get_handle() const -{ - return handle; -} - -uint32_t HPPCommandPool::get_queue_family_index() const -{ - return queue_family_index; -} - -vkb::rendering::HPPRenderFrame *HPPCommandPool::get_render_frame() -{ - return render_frame; -} - -size_t HPPCommandPool::get_thread_index() const -{ - return thread_index; -} - -void HPPCommandPool::reset_pool() -{ - switch (reset_mode) - { - case HPPCommandBuffer::ResetMode::ResetIndividually: - reset_command_buffers(); - break; - - case HPPCommandBuffer::ResetMode::ResetPool: - device.get_handle().resetCommandPool(handle); - reset_command_buffers(); - break; - - case HPPCommandBuffer::ResetMode::AlwaysAllocate: - primary_command_buffers.clear(); - active_primary_command_buffer_count = 0; - secondary_command_buffers.clear(); - active_secondary_command_buffer_count = 0; - break; - - default: - throw std::runtime_error("Unknown reset mode for command pools"); - } -} - -HPPCommandBuffer &HPPCommandPool::request_command_buffer(vk::CommandBufferLevel level) -{ - if (level == vk::CommandBufferLevel::ePrimary) - { - if (active_primary_command_buffer_count < primary_command_buffers.size()) - { - return *primary_command_buffers[active_primary_command_buffer_count++]; - } - - primary_command_buffers.emplace_back(std::make_unique(*this, level)); - - active_primary_command_buffer_count++; - - return *primary_command_buffers.back(); - } - else - { - if (active_secondary_command_buffer_count < secondary_command_buffers.size()) - { - return *secondary_command_buffers[active_secondary_command_buffer_count++]; - } - - secondary_command_buffers.emplace_back(std::make_unique(*this, level)); - - active_secondary_command_buffer_count++; - - return *secondary_command_buffers.back(); - } -} - -HPPCommandBuffer::ResetMode HPPCommandPool::get_reset_mode() const -{ - return reset_mode; -} - -void HPPCommandPool::reset_command_buffers() -{ - for (auto &cmd_buf : primary_command_buffers) - { - cmd_buf->reset(reset_mode); - } - active_primary_command_buffer_count = 0; - - for (auto &cmd_buf : secondary_command_buffers) - { - cmd_buf->reset(reset_mode); - } - active_secondary_command_buffer_count = 0; -} -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_command_pool.h b/framework/core/hpp_command_pool.h deleted file mode 100644 index ababc9fb66..0000000000 --- a/framework/core/hpp_command_pool.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include - -namespace vkb -{ -namespace rendering -{ -class HPPRenderFrame; -} - -namespace core -{ -class HPPDevice; - -class HPPCommandPool -{ - public: - HPPCommandPool(HPPDevice &device, - uint32_t queue_family_index, - vkb::rendering::HPPRenderFrame *render_frame = nullptr, - size_t thread_index = 0, - HPPCommandBuffer::ResetMode reset_mode = HPPCommandBuffer::ResetMode::ResetPool); - HPPCommandPool(const HPPCommandPool &) = delete; - HPPCommandPool(HPPCommandPool &&other); - ~HPPCommandPool(); - - HPPCommandPool &operator=(const HPPCommandPool &) = delete; - HPPCommandPool &operator=(HPPCommandPool &&) = delete; - - HPPDevice &get_device(); - vk::CommandPool get_handle() const; - uint32_t get_queue_family_index() const; - vkb::rendering::HPPRenderFrame *get_render_frame(); - HPPCommandBuffer::ResetMode get_reset_mode() const; - size_t get_thread_index() const; - HPPCommandBuffer &request_command_buffer(vk::CommandBufferLevel level = vk::CommandBufferLevel::ePrimary); - void reset_pool(); - - private: - void reset_command_buffers(); - - private: - HPPDevice &device; - vk::CommandPool handle = nullptr; - vkb::rendering::HPPRenderFrame *render_frame = nullptr; - size_t thread_index = 0; - uint32_t queue_family_index = 0; - std::vector> primary_command_buffers; - uint32_t active_primary_command_buffer_count = 0; - std::vector> secondary_command_buffers; - uint32_t active_secondary_command_buffer_count = 0; - HPPCommandBuffer::ResetMode reset_mode = HPPCommandBuffer::ResetMode::ResetPool; -}; -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_debug.cpp b/framework/core/hpp_debug.cpp index 1b688b2256..aefb947fcf 100644 --- a/framework/core/hpp_debug.cpp +++ b/framework/core/hpp_debug.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -15,9 +15,9 @@ * limitations under the License. */ -#include "hpp_debug.h" -#include "core/hpp_command_buffer.h" -#include "core/hpp_device.h" +#include "core/hpp_debug.h" +#include "core/command_buffer.h" +#include "core/device.h" namespace vkb { @@ -25,20 +25,20 @@ namespace core { void HPPDebugUtilsExtDebugUtils::set_debug_name(vk::Device device, vk::ObjectType object_type, uint64_t object_handle, const char *name) const { - vk::DebugUtilsObjectNameInfoEXT name_info(object_type, object_handle, name); + vk::DebugUtilsObjectNameInfoEXT name_info{.objectType = object_type, .objectHandle = object_handle, .pObjectName = name}; device.setDebugUtilsObjectNameEXT(name_info); } void HPPDebugUtilsExtDebugUtils::set_debug_tag( vk::Device device, vk::ObjectType object_type, uint64_t object_handle, uint64_t tag_name, const void *tag_data, size_t tag_data_size) const { - vk::DebugUtilsObjectTagInfoEXT tag_info(object_type, object_handle, tag_name, tag_data_size, tag_data); + vk::DebugUtilsObjectTagInfoEXT tag_info{.objectType = object_type, .objectHandle = object_handle, .tagName = tag_name, .tagSize = tag_data_size, .pTag = tag_data}; device.setDebugUtilsObjectTagEXT(tag_info); } void HPPDebugUtilsExtDebugUtils::cmd_begin_label(vk::CommandBuffer command_buffer, const char *name, glm::vec4 const color) const { - vk::DebugUtilsLabelEXT label_info(name, reinterpret_cast const &>(*&color[0])); + vk::DebugUtilsLabelEXT label_info{.pLabelName = name, .color = reinterpret_cast const &>(*&color[0])}; command_buffer.beginDebugUtilsLabelEXT(label_info); } @@ -49,26 +49,27 @@ void HPPDebugUtilsExtDebugUtils::cmd_end_label(vk::CommandBuffer command_buffer) void HPPDebugUtilsExtDebugUtils::cmd_insert_label(vk::CommandBuffer command_buffer, const char *name, glm::vec4 const color) const { - vk::DebugUtilsLabelEXT label_info(name, reinterpret_cast const &>(*&color[0])); + vk::DebugUtilsLabelEXT label_info{.pLabelName = name, .color = reinterpret_cast const &>(*&color[0])}; command_buffer.insertDebugUtilsLabelEXT(label_info); } void HPPDebugMarkerExtDebugUtils::set_debug_name(vk::Device device, vk::ObjectType object_type, uint64_t object_handle, const char *name) const { - vk::DebugMarkerObjectNameInfoEXT name_info(vk::debugReportObjectType(object_type), object_handle, name); + vk::DebugMarkerObjectNameInfoEXT name_info{.objectType = vk::debugReportObjectType(object_type), .object = object_handle, .pObjectName = name}; device.debugMarkerSetObjectNameEXT(name_info); } void HPPDebugMarkerExtDebugUtils::set_debug_tag( vk::Device device, vk::ObjectType object_type, uint64_t object_handle, uint64_t tag_name, const void *tag_data, size_t tag_data_size) const { - vk::DebugMarkerObjectTagInfoEXT tag_info(vk::debugReportObjectType(object_type), object_handle, tag_name, tag_data_size, tag_data); + vk::DebugMarkerObjectTagInfoEXT tag_info{ + .objectType = vk::debugReportObjectType(object_type), .object = object_handle, .tagName = tag_name, .tagSize = tag_data_size, .pTag = tag_data}; device.debugMarkerSetObjectTagEXT(tag_info); } void HPPDebugMarkerExtDebugUtils::cmd_begin_label(vk::CommandBuffer command_buffer, const char *name, glm::vec4 const color) const { - vk::DebugMarkerMarkerInfoEXT marker_info(name, reinterpret_cast const &>(*&color[0])); + vk::DebugMarkerMarkerInfoEXT marker_info{.pMarkerName = name, .color = reinterpret_cast const &>(*&color[0])}; command_buffer.debugMarkerBeginEXT(marker_info); } @@ -79,7 +80,7 @@ void HPPDebugMarkerExtDebugUtils::cmd_end_label(vk::CommandBuffer command_buffer void HPPDebugMarkerExtDebugUtils::cmd_insert_label(vk::CommandBuffer command_buffer, const char *name, glm::vec4 const color) const { - vk::DebugMarkerMarkerInfoEXT marker_info(name, reinterpret_cast const &>(*&color[0])); + vk::DebugMarkerMarkerInfoEXT marker_info{.pMarkerName = name, .color = reinterpret_cast const &>(*&color[0])}; command_buffer.debugMarkerInsertEXT(marker_info); } @@ -98,7 +99,9 @@ HPPScopedDebugLabel::HPPScopedDebugLabel(const HPPDebugUtils &debug_utils, } } -HPPScopedDebugLabel::HPPScopedDebugLabel(const vkb::core::HPPCommandBuffer &command_buffer, std::string const &name, glm::vec4 const color) : +HPPScopedDebugLabel::HPPScopedDebugLabel(const vkb::core::CommandBufferCpp &command_buffer, + std::string const &name, + glm::vec4 const color) : HPPScopedDebugLabel{command_buffer.get_device().get_debug_utils(), command_buffer.get_handle(), name, color} { } diff --git a/framework/core/hpp_debug.h b/framework/core/hpp_debug.h index e836fa22d2..bcd577b9e4 100644 --- a/framework/core/hpp_debug.h +++ b/framework/core/hpp_debug.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,14 +17,17 @@ #pragma once -#include +#include "common/vk_common.h" +#include #include namespace vkb { namespace core { -class HPPCommandBuffer; +template +class CommandBuffer; +using CommandBufferCpp = CommandBuffer; /** * @brief An interface over platform-specific debug extensions. @@ -136,7 +139,7 @@ class HPPScopedDebugLabel final public: HPPScopedDebugLabel(const vkb::core::HPPDebugUtils &debug_utils, vk::CommandBuffer command_buffer, std::string const &name, glm::vec4 const color = {}); - HPPScopedDebugLabel(const vkb::core::HPPCommandBuffer &command_buffer, std::string const &name, glm::vec4 const color = {}); + HPPScopedDebugLabel(const vkb::core::CommandBufferCpp &command_buffer, std::string const &name, glm::vec4 const color = {}); ~HPPScopedDebugLabel(); diff --git a/framework/core/hpp_descriptor_pool.h b/framework/core/hpp_descriptor_pool.h index b149763b14..d3641788e8 100644 --- a/framework/core/hpp_descriptor_pool.h +++ b/framework/core/hpp_descriptor_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,7 +24,10 @@ namespace vkb { namespace core { -class HPPDevice; +template +class Device; +using DeviceCpp = Device; +using DeviceC = Device; /** * @brief facade class around vkb::DescriptorPool, providing a vulkan.hpp-based interface @@ -36,8 +39,9 @@ class HPPDescriptorPool : private vkb::DescriptorPool public: using vkb::DescriptorPool::reset; - HPPDescriptorPool(vkb::core::HPPDevice &device, const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, uint32_t pool_size = MAX_SETS_PER_POOL) : - vkb::DescriptorPool(reinterpret_cast(device), reinterpret_cast(descriptor_set_layout), pool_size) + HPPDescriptorPool(vkb::core::DeviceCpp &device, const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, uint32_t pool_size = MAX_SETS_PER_POOL) : + vkb::DescriptorPool( + reinterpret_cast(device), reinterpret_cast(descriptor_set_layout), pool_size) {} }; } // namespace core diff --git a/framework/core/hpp_descriptor_set.h b/framework/core/hpp_descriptor_set.h index fe44a8fc9d..a4a418a492 100644 --- a/framework/core/hpp_descriptor_set.h +++ b/framework/core/hpp_descriptor_set.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -36,12 +36,12 @@ class HPPDescriptorSet : private vkb::DescriptorSet using vkb::DescriptorSet::apply_writes; using vkb::DescriptorSet::update; - HPPDescriptorSet(vkb::core::HPPDevice &device, + HPPDescriptorSet(vkb::core::DeviceCpp &device, const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, vkb::core::HPPDescriptorPool &descriptor_pool, const BindingMap &buffer_infos = {}, const BindingMap &image_infos = {}) : - vkb::DescriptorSet(reinterpret_cast(device), + vkb::DescriptorSet(reinterpret_cast(device), reinterpret_cast(descriptor_set_layout), reinterpret_cast(descriptor_pool), reinterpret_cast const &>(buffer_infos), diff --git a/framework/core/hpp_descriptor_set_layout.h b/framework/core/hpp_descriptor_set_layout.h index 4a2b6614eb..94461d5434 100644 --- a/framework/core/hpp_descriptor_set_layout.h +++ b/framework/core/hpp_descriptor_set_layout.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,7 +24,11 @@ namespace vkb { namespace core { -class HPPDevice; +template +class Device; +using DeviceCpp = Device; +using DeviceC = Device; + class HPPShaderModule; struct HPPShaderResource; @@ -39,11 +43,11 @@ class HPPDescriptorSetLayout : private vkb::DescriptorSetLayout using vkb::DescriptorSetLayout::get_index; public: - HPPDescriptorSetLayout(vkb::core::HPPDevice &device, + HPPDescriptorSetLayout(vkb::core::DeviceCpp &device, const uint32_t set_index, const std::vector &shader_modules, const std::vector &resource_set) : - vkb::DescriptorSetLayout(reinterpret_cast(device), + vkb::DescriptorSetLayout(reinterpret_cast(device), set_index, reinterpret_cast const &>(shader_modules), reinterpret_cast const &>(resource_set)) diff --git a/framework/core/hpp_device.cpp b/framework/core/hpp_device.cpp deleted file mode 100644 index b7ddfa76c8..0000000000 --- a/framework/core/hpp_device.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include -#include - -namespace vkb -{ -namespace core -{ -HPPDevice::HPPDevice(vkb::core::HPPPhysicalDevice &gpu, - vk::SurfaceKHR surface, - std::unique_ptr &&debug_utils, - std::unordered_map requested_extensions) : - VulkanResource{nullptr, this}, // Recursive, but valid - debug_utils{std::move(debug_utils)}, - gpu{gpu}, - resource_cache{*this} -{ - LOGI("Selected GPU: {}", gpu.get_properties().deviceName.data()); - - // Prepare the device queues - std::vector queue_family_properties = gpu.get_queue_family_properties(); - std::vector queue_create_infos(queue_family_properties.size()); - std::vector> queue_priorities(queue_family_properties.size()); - - for (uint32_t queue_family_index = 0U; queue_family_index < queue_family_properties.size(); ++queue_family_index) - { - vk::QueueFamilyProperties const &queue_family_property = queue_family_properties[queue_family_index]; - - if (gpu.has_high_priority_graphics_queue()) - { - uint32_t graphics_queue_family = get_queue_family_index(vk::QueueFlagBits::eGraphics); - if (graphics_queue_family == queue_family_index) - { - queue_priorities[queue_family_index].reserve(queue_family_property.queueCount); - queue_priorities[queue_family_index].push_back(1.0f); - for (uint32_t i = 1; i < queue_family_property.queueCount; i++) - { - queue_priorities[queue_family_index].push_back(0.5f); - } - } - else - { - queue_priorities[queue_family_index].resize(queue_family_property.queueCount, 0.5f); - } - } - else - { - queue_priorities[queue_family_index].resize(queue_family_property.queueCount, 0.5f); - } - - vk::DeviceQueueCreateInfo &queue_create_info = queue_create_infos[queue_family_index]; - - queue_create_info.queueFamilyIndex = queue_family_index; - queue_create_info.queueCount = queue_family_property.queueCount; - queue_create_info.pQueuePriorities = queue_priorities[queue_family_index].data(); - } - - // Check extensions to enable Vma Dedicated Allocation - bool can_get_memory_requirements = is_extension_supported(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); - bool has_dedicated_allocation = is_extension_supported(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); - - if (can_get_memory_requirements && has_dedicated_allocation) - { - enabled_extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); - enabled_extensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); - - LOGI("Dedicated Allocation enabled"); - } - - // For performance queries, we also use host query reset since queryPool resets cannot - // live in the same command buffer as beginQuery - if (is_extension_supported(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME) && is_extension_supported(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) - { - auto perf_counter_features = gpu.get_extension_features(); - auto host_query_reset_features = gpu.get_extension_features(); - - if (perf_counter_features.performanceCounterQueryPools && host_query_reset_features.hostQueryReset) - { - gpu.add_extension_features().performanceCounterQueryPools = true; - gpu.add_extension_features().hostQueryReset = true; - enabled_extensions.push_back(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME); - enabled_extensions.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME); - LOGI("Performance query enabled"); - } - } - - // Check that extensions are supported before trying to create the device - std::vector unsupported_extensions{}; - for (auto &extension : requested_extensions) - { - if (is_extension_supported(extension.first)) - { - enabled_extensions.emplace_back(extension.first); - } - else - { - unsupported_extensions.emplace_back(extension.first); - } - } - - if (enabled_extensions.size() > 0) - { - LOGI("HPPDevice supports the following requested extensions:"); - for (auto &extension : enabled_extensions) - { - LOGI(" \t{}", extension); - } - } - - if (unsupported_extensions.size() > 0) - { - auto error = false; - for (auto &extension : unsupported_extensions) - { - auto extension_is_optional = requested_extensions[extension]; - if (extension_is_optional) - { - LOGW("Optional device extension {} not available, some features may be disabled", extension); - } - else - { - LOGE("Required device extension {} not available, cannot run", extension); - error = true; - } - } - - if (error) - { - throw vkb::common::HPPVulkanException(vk::Result::eErrorExtensionNotPresent, "Extensions not present"); - } - } - - vk::DeviceCreateInfo create_info({}, queue_create_infos, {}, enabled_extensions, &gpu.get_mutable_requested_features()); - - // Latest requested feature will have the pNext's all set up for device creation. - create_info.pNext = gpu.get_extension_feature_chain(); - - set_handle(gpu.get_handle().createDevice(create_info)); - - queues.resize(queue_family_properties.size()); - - for (uint32_t queue_family_index = 0U; queue_family_index < queue_family_properties.size(); ++queue_family_index) - { - vk::QueueFamilyProperties const &queue_family_property = queue_family_properties[queue_family_index]; - - vk::Bool32 present_supported = gpu.get_handle().getSurfaceSupportKHR(queue_family_index, surface); - - for (uint32_t queue_index = 0U; queue_index < queue_family_property.queueCount; ++queue_index) - { - queues[queue_family_index].emplace_back(*this, queue_family_index, queue_family_property, present_supported, queue_index); - } - } - - vkb::allocated::init(*this); - - command_pool = std::make_unique( - *this, get_queue_by_flags(vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eCompute, 0).get_family_index()); - fence_pool = std::make_unique(*this); -} - -HPPDevice::~HPPDevice() -{ - resource_cache.clear(); - - command_pool.reset(); - fence_pool.reset(); - - vkb::allocated::shutdown(); - - if (get_handle()) - { - get_handle().destroy(); - } -} - -bool HPPDevice::is_extension_supported(std::string const &requested_extension) const -{ - return gpu.is_extension_supported(requested_extension); -} - -bool HPPDevice::is_enabled(std::string const &extension) const -{ - return std::find_if(enabled_extensions.begin(), - enabled_extensions.end(), - [extension](const char *enabled_extension) { return extension == enabled_extension; }) != enabled_extensions.end(); -} - -vkb::core::HPPPhysicalDevice const &HPPDevice::get_gpu() const -{ - return gpu; -} - -vkb::core::HPPDebugUtils const &HPPDevice::get_debug_utils() const -{ - return *debug_utils; -} - -vkb::core::HPPQueue const &HPPDevice::get_queue(uint32_t queue_family_index, uint32_t queue_index) const -{ - return queues[queue_family_index][queue_index]; -} - -vkb::core::HPPQueue const &HPPDevice::get_queue_by_flags(vk::QueueFlags required_queue_flags, uint32_t queue_index) const -{ - for (size_t queue_family_index = 0U; queue_family_index < queues.size(); ++queue_family_index) - { - vkb::core::HPPQueue const &first_queue = queues[queue_family_index][0]; - - vk::QueueFlags queue_flags = first_queue.get_properties().queueFlags; - uint32_t queue_count = first_queue.get_properties().queueCount; - - if (((queue_flags & required_queue_flags) == required_queue_flags) && queue_index < queue_count) - { - return queues[queue_family_index][queue_index]; - } - } - - throw std::runtime_error("Queue not found"); -} - -vkb::core::HPPQueue const &HPPDevice::get_queue_by_present(uint32_t queue_index) const -{ - for (uint32_t queue_family_index = 0U; queue_family_index < queues.size(); ++queue_family_index) - { - vkb::core::HPPQueue const &first_queue = queues[queue_family_index][0]; - - uint32_t queue_count = first_queue.get_properties().queueCount; - - if (first_queue.support_present() && queue_index < queue_count) - { - return queues[queue_family_index][queue_index]; - } - } - - throw std::runtime_error("Queue not found"); -} - -uint32_t HPPDevice::get_queue_family_index(vk::QueueFlagBits queue_flag) const -{ - const auto &queue_family_properties = gpu.get_queue_family_properties(); - - // Dedicated queue for compute - // Try to find a queue family index that supports compute but not graphics - if (queue_flag & vk::QueueFlagBits::eCompute) - { - for (uint32_t i = 0; i < static_cast(queue_family_properties.size()); i++) - { - if ((queue_family_properties[i].queueFlags & queue_flag) && !(queue_family_properties[i].queueFlags & vk::QueueFlagBits::eGraphics)) - { - return i; - break; - } - } - } - - // Dedicated queue for transfer - // Try to find a queue family index that supports transfer but not graphics and compute - if (queue_flag & vk::QueueFlagBits::eTransfer) - { - for (uint32_t i = 0; i < static_cast(queue_family_properties.size()); i++) - { - if ((queue_family_properties[i].queueFlags & queue_flag) && !(queue_family_properties[i].queueFlags & vk::QueueFlagBits::eGraphics) && - !(queue_family_properties[i].queueFlags & vk::QueueFlagBits::eCompute)) - { - return i; - break; - } - } - } - - // For other queue types or if no separate compute queue is present, return the first one to support the requested - // flags - for (uint32_t i = 0; i < static_cast(queue_family_properties.size()); i++) - { - if (queue_family_properties[i].queueFlags & queue_flag) - { - return i; - break; - } - } - - throw std::runtime_error("Could not find a matching queue family index"); -} - -vkb::core::HPPQueue const &HPPDevice::get_suitable_graphics_queue() const -{ - for (size_t queue_family_index = 0U; queue_family_index < queues.size(); ++queue_family_index) - { - vkb::core::HPPQueue const &first_queue = queues[queue_family_index][0]; - - uint32_t queue_count = first_queue.get_properties().queueCount; - - if (first_queue.support_present() && 0 < queue_count) - { - return queues[queue_family_index][0]; - } - } - - return get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0); -} - -std::pair HPPDevice::create_image(vk::Format format, vk::Extent2D const &extent, uint32_t mip_levels, vk::ImageUsageFlags usage, vk::MemoryPropertyFlags properties) const -{ - vk::Device device = get_handle(); - - vk::ImageCreateInfo image_create_info({}, vk::ImageType::e2D, format, vk::Extent3D(extent, 1), mip_levels, 1, vk::SampleCountFlagBits::e1, vk::ImageTiling::eOptimal, usage); - vk::Image image = device.createImage(image_create_info); - - vk::MemoryRequirements memory_requirements = device.getImageMemoryRequirements(image); - - vk::MemoryAllocateInfo memory_allocation(memory_requirements.size, get_gpu().get_memory_type(memory_requirements.memoryTypeBits, properties)); - vk::DeviceMemory memory = device.allocateMemory(memory_allocation); - device.bindImageMemory(image, memory, 0); - - return std::make_pair(image, memory); -} - -void HPPDevice::copy_buffer(vkb::core::BufferCpp &src, vkb::core::BufferCpp &dst, vk::Queue queue, vk::BufferCopy *copy_region) const -{ - assert(dst.get_size() <= src.get_size()); - assert(src.get_handle()); - - vk::CommandBuffer command_buffer = create_command_buffer(vk::CommandBufferLevel::ePrimary, true); - - vk::BufferCopy buffer_copy{}; - if (copy_region) - { - buffer_copy = *copy_region; - } - else - { - buffer_copy.size = src.get_size(); - } - - command_buffer.copyBuffer(src.get_handle(), dst.get_handle(), buffer_copy); - - flush_command_buffer(command_buffer, queue); -} - -vk::CommandBuffer HPPDevice::create_command_buffer(vk::CommandBufferLevel level, bool begin) const -{ - assert(command_pool && "No command pool exists in the device"); - - vk::CommandBuffer command_buffer = get_handle().allocateCommandBuffers({command_pool->get_handle(), level, 1}).front(); - - // If requested, also start recording for the new command buffer - if (begin) - { - command_buffer.begin(vk::CommandBufferBeginInfo()); - } - - return command_buffer; -} - -void HPPDevice::flush_command_buffer(vk::CommandBuffer command_buffer, vk::Queue queue, bool free, vk::Semaphore signalSemaphore) const -{ - if (!command_buffer) - { - return; - } - - command_buffer.end(); - - vk::SubmitInfo submit_info({}, {}, command_buffer); - if (signalSemaphore) - { - submit_info.setSignalSemaphores(signalSemaphore); - } - - // Create fence to ensure that the command buffer has finished executing - vk::Fence fence = get_handle().createFence({}); - - // Submit to the queue - queue.submit(submit_info, fence); - - // Wait for the fence to signal that command buffer has finished executing - vk::Result result = get_handle().waitForFences(fence, true, DEFAULT_FENCE_TIMEOUT); - if (result != vk::Result::eSuccess) - { - LOGE("Detected Vulkan error: {}", vkb::to_string(result)); - abort(); - } - - get_handle().destroyFence(fence); - - if (command_pool && free) - { - get_handle().freeCommandBuffers(command_pool->get_handle(), command_buffer); - } -} - -vkb::core::HPPCommandPool &HPPDevice::get_command_pool() -{ - return *command_pool; -} - -vkb::HPPFencePool &HPPDevice::get_fence_pool() -{ - return *fence_pool; -} - -vkb::HPPResourceCache &HPPDevice::get_resource_cache() -{ - return resource_cache; -} -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_device.h b/framework/core/hpp_device.h deleted file mode 100644 index 70e2fcbbad..0000000000 --- a/framework/core/hpp_device.h +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "core/vulkan_resource.h" -#include -#include -#include -#include -#include -#include -#include -#include - -namespace vkb -{ -namespace core -{ -class HPPBuffer; - -class HPPDevice : public vkb::core::VulkanResourceCpp -{ - public: - /** - * @brief HPPDevice constructor - * @param gpu A valid Vulkan physical device and the requested gpu features - * @param surface The surface - * @param debug_utils The debug utils to be associated to this device - * @param requested_extensions (Optional) List of required device extensions and whether support is optional or not - */ - HPPDevice(vkb::core::HPPPhysicalDevice &gpu, - vk::SurfaceKHR surface, - std::unique_ptr &&debug_utils, - std::unordered_map requested_extensions = {}); - - HPPDevice(const HPPDevice &) = delete; - - HPPDevice(HPPDevice &&) = delete; - - ~HPPDevice(); - - HPPDevice &operator=(const HPPDevice &) = delete; - - HPPDevice &operator=(HPPDevice &&) = delete; - - vkb::core::HPPPhysicalDevice const &get_gpu() const; - - /** - * @brief Returns the debug utils associated with this HPPDevice. - */ - vkb::core::HPPDebugUtils const &get_debug_utils() const; - - vkb::core::HPPQueue const &get_queue(uint32_t queue_family_index, uint32_t queue_index) const; - - vkb::core::HPPQueue const &get_queue_by_flags(vk::QueueFlags queue_flags, uint32_t queue_index) const; - - vkb::core::HPPQueue const &get_queue_by_present(uint32_t queue_index) const; - - /** - * @brief Finds a suitable graphics queue to submit to - * @return The first present supported queue, otherwise just any graphics queue - */ - vkb::core::HPPQueue const &get_suitable_graphics_queue() const; - - bool is_extension_supported(std::string const &extension) const; - - bool is_enabled(std::string const &extension) const; - - uint32_t get_queue_family_index(vk::QueueFlagBits queue_flag) const; - - vkb::core::HPPCommandPool &get_command_pool(); - - /** - * @brief Creates a vulkan image and associated device memory - * @param format The image format - * @param extent The image extent - * @param mip_levels The mip levels of the image - * @param usage The image usage - * @param properties The device memory property flags - * @returns A valid vk::Image and a corresponding vk::DeviceMemory - */ - std::pair create_image(vk::Format format, vk::Extent2D const &extent, uint32_t mip_levels, vk::ImageUsageFlags usage, vk::MemoryPropertyFlags properties) const; - - /** - * @brief Copies a buffer from one to another - * @param src The buffer to copy from - * @param dst The buffer to copy to - * @param queue The queue to submit the copy command to - * @param copy_region The amount to copy, if null copies the entire buffer - */ - void copy_buffer(vkb::core::BufferCpp &src, vkb::core::BufferCpp &dst, vk::Queue queue, vk::BufferCopy *copy_region = nullptr) const; - - /** - * @brief Requests a command buffer from the device's command pool - * @param level The command buffer level - * @param begin Whether the command buffer should be implicitly started before it's returned - * @returns A valid vk::CommandBuffer - */ - vk::CommandBuffer create_command_buffer(vk::CommandBufferLevel level, bool begin = false) const; - - /** - * @brief Submits and frees up a given command buffer - * @param command_buffer The command buffer - * @param queue The queue to submit the work to - * @param free Whether the command buffer should be implicitly freed up - * @param signalSemaphore An optional semaphore to signal when the commands have been executed - */ - void flush_command_buffer(vk::CommandBuffer command_buffer, vk::Queue queue, bool free = true, vk::Semaphore signalSemaphore = VK_NULL_HANDLE) const; - - vkb::HPPFencePool &get_fence_pool(); - - vkb::HPPResourceCache &get_resource_cache(); - - private: - vkb::core::HPPPhysicalDevice const &gpu; - - vk::SurfaceKHR surface{nullptr}; - - std::unique_ptr debug_utils; - - std::vector enabled_extensions{}; - - std::vector> queues; - - /// A command pool associated to the primary queue - std::unique_ptr command_pool; - - /// A fence pool associated to the primary queue - std::unique_ptr fence_pool; - - vkb::HPPResourceCache resource_cache; -}; -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_framebuffer.h b/framework/core/hpp_framebuffer.h index e5433f9221..3006f2a1c4 100644 --- a/framework/core/hpp_framebuffer.h +++ b/framework/core/hpp_framebuffer.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -40,8 +40,8 @@ class HPPRenderPass; class HPPFramebuffer : private vkb::Framebuffer { public: - HPPFramebuffer(vkb::core::HPPDevice &device, const vkb::rendering::HPPRenderTarget &render_target, const vkb::core::HPPRenderPass &render_pass) : - vkb::Framebuffer(reinterpret_cast(device), + HPPFramebuffer(vkb::core::DeviceCpp &device, const vkb::rendering::HPPRenderTarget &render_target, const vkb::core::HPPRenderPass &render_pass) : + vkb::Framebuffer(reinterpret_cast(device), reinterpret_cast(render_target), reinterpret_cast(render_pass)) {} diff --git a/framework/core/hpp_image.h b/framework/core/hpp_image.h index 9a780e44b5..3939f664ca 100644 --- a/framework/core/hpp_image.h +++ b/framework/core/hpp_image.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,8 +18,8 @@ #pragma once #include "builder_base.h" +#include "core/allocated.h" #include "core/vulkan_resource.h" -#include "hpp_allocated.h" #include namespace vkb @@ -31,15 +31,14 @@ class HPPImageView; class HPPImage; using HPPImagePtr = std::unique_ptr; -struct HPPImageBuilder : public vkb::BuilderBaseCpp +struct HPPImageBuilder : public vkb::allocated::BuilderBaseCpp { private: - using Parent = vkb::BuilderBaseCpp; + using Parent = vkb::allocated::BuilderBaseCpp; public: - HPPImageBuilder(vk::Extent3D const &extent) : - // Better reasonable defaults than vk::ImageCreateInfo default ctor - Parent(vk::ImageCreateInfo{{}, vk::ImageType::e2D, vk::Format::eR8G8B8A8Unorm, extent, 1, 1}) + HPPImageBuilder(vk::Extent3D const &extent) : // Better reasonable defaults than vk::ImageCreateInfo default ctor + Parent(vk::ImageCreateInfo{.imageType = vk::ImageType::e2D, .format = vk::Format::eR8G8B8A8Unorm, .extent = extent, .mipLevels = 1, .arrayLayers = 1}) { } @@ -101,14 +100,14 @@ struct HPPImageBuilder : public vkb::BuilderBaseCpp +class HPPImage : public vkb::allocated::AllocatedCpp { public: - HPPImage(HPPDevice &device, + HPPImage(vkb::core::DeviceCpp &device, vk::Image handle, const vk::Extent3D &extent, vk::Format format, @@ -116,7 +115,7 @@ class HPPImage : public allocated::HPPAllocated vk::SampleCountFlagBits sample_count = vk::SampleCountFlagBits::e1); //[[deprecated("Use the HPPImageBuilder ctor instead")]] - HPPImage(HPPDevice &device, + HPPImage(vkb::core::DeviceCpp &device, const vk::Extent3D &extent, vk::Format format, vk::ImageUsageFlags image_usage, @@ -129,7 +128,7 @@ class HPPImage : public allocated::HPPAllocated uint32_t num_queue_families = 0, const uint32_t *queue_families = nullptr); - HPPImage(HPPDevice &device, + HPPImage(vkb::core::DeviceCpp &device, HPPImageBuilder const &builder); HPPImage(const HPPImage &) = delete; diff --git a/framework/core/hpp_image_core.cpp b/framework/core/hpp_image_core.cpp index b8935abc5b..9058102ffc 100644 --- a/framework/core/hpp_image_core.cpp +++ b/framework/core/hpp_image_core.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -15,9 +15,9 @@ * limitations under the License. */ +#include "core/device.h" #include "core/hpp_image.h" - -#include "core/hpp_device.h" +#include "core/hpp_image_view.h" namespace vkb { @@ -44,17 +44,17 @@ inline vk::ImageType find_image_type(vk::Extent3D const &extent) namespace core { -HPPImage HPPImageBuilder::build(HPPDevice &device) const +HPPImage HPPImageBuilder::build(vkb::core::DeviceCpp &device) const { return HPPImage(device, *this); } -HPPImagePtr HPPImageBuilder::build_unique(HPPDevice &device) const +HPPImagePtr HPPImageBuilder::build_unique(vkb::core::DeviceCpp &device) const { return std::make_unique(device, *this); } -HPPImage::HPPImage(HPPDevice &device, +HPPImage::HPPImage(vkb::core::DeviceCpp &device, const vk::Extent3D &extent, vk::Format format, vk::ImageUsageFlags image_usage, @@ -78,10 +78,10 @@ HPPImage::HPPImage(HPPDevice &device, .with_queue_families(num_queue_families, queue_families)} {} -HPPImage::HPPImage(HPPDevice &device, HPPImageBuilder const &builder) : - HPPAllocated{builder.get_allocation_create_info(), nullptr, &device}, create_info{builder.get_create_info()} +HPPImage::HPPImage(vkb::core::DeviceCpp &device, HPPImageBuilder const &builder) : + vkb::allocated::AllocatedCpp{builder.get_allocation_create_info(), nullptr, &device}, create_info{builder.get_create_info()} { - get_handle() = create_image(create_info.operator const VkImageCreateInfo &()); + get_handle() = create_image(create_info); subresource.arrayLayer = create_info.arrayLayers; subresource.mipLevel = create_info.mipLevels; if (!builder.get_debug_name().empty()) @@ -90,13 +90,13 @@ HPPImage::HPPImage(HPPDevice &device, HPPImageBuilder const &builder) : } } -HPPImage::HPPImage(HPPDevice &device, +HPPImage::HPPImage(vkb::core::DeviceCpp &device, vk::Image handle, const vk::Extent3D &extent, vk::Format format, vk::ImageUsageFlags image_usage, vk::SampleCountFlagBits sample_count) : - HPPAllocated{handle, &device} + vkb::allocated::AllocatedCpp{handle, &device} { create_info.samples = sample_count; create_info.format = format; @@ -109,7 +109,7 @@ HPPImage::HPPImage(HPPDevice &device, } HPPImage::HPPImage(HPPImage &&other) noexcept : - HPPAllocated{std::move(other)}, + vkb::allocated::AllocatedCpp{std::move(other)}, create_info(std::exchange(other.create_info, {})), subresource(std::exchange(other.subresource, {})), views(std::exchange(other.views, {})) @@ -132,7 +132,7 @@ uint8_t *HPPImage::map() { LOGW("Mapping image memory that is not linear"); } - return Allocated::map(); + return vkb::allocated::AllocatedCpp::map(); } vk::ImageType HPPImage::get_type() const diff --git a/framework/core/hpp_image_view.cpp b/framework/core/hpp_image_view.cpp index 000d27dcac..bc6059b601 100644 --- a/framework/core/hpp_image_view.cpp +++ b/framework/core/hpp_image_view.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,9 +16,9 @@ */ #include "core/hpp_image_view.h" - #include "common/hpp_vk_common.h" -#include "core/hpp_device.h" +#include "core/device.h" +#include "core/hpp_image.h" #include namespace vkb @@ -39,14 +39,14 @@ HPPImageView::HPPImageView(vkb::core::HPPImage &img, this->format = format = image->get_format(); } - subresource_range = - vk::ImageSubresourceRange((std::string(vk::componentName(format, 0)) == "D") ? vk::ImageAspectFlagBits::eDepth : vk::ImageAspectFlagBits::eColor, - mip_level, - n_mip_levels == 0 ? image->get_subresource().mipLevel : n_mip_levels, - array_layer, - n_array_layers == 0 ? image->get_subresource().arrayLayer : n_array_layers); + subresource_range = vk::ImageSubresourceRange{.aspectMask = (std::string(vk::componentName(format, 0)) == "D") ? vk::ImageAspectFlagBits::eDepth : vk::ImageAspectFlagBits::eColor, + .baseMipLevel = mip_level, + .levelCount = n_mip_levels == 0 ? image->get_subresource().mipLevel : n_mip_levels, + .baseArrayLayer = array_layer, + .layerCount = n_array_layers == 0 ? image->get_subresource().arrayLayer : n_array_layers}; - vk::ImageViewCreateInfo image_view_create_info({}, image->get_handle(), view_type, format, {}, subresource_range); + vk::ImageViewCreateInfo image_view_create_info{ + .image = image->get_handle(), .viewType = view_type, .format = format, .subresourceRange = subresource_range}; set_handle(get_device().get_handle().createImageView(image_view_create_info)); @@ -92,8 +92,8 @@ void HPPImageView::set_image(vkb::core::HPPImage &img) vk::ImageSubresourceLayers HPPImageView::get_subresource_layers() const { - return vk::ImageSubresourceLayers( - subresource_range.aspectMask, subresource_range.baseMipLevel, subresource_range.baseArrayLayer, subresource_range.layerCount); + return vk::ImageSubresourceLayers{ + subresource_range.aspectMask, subresource_range.baseMipLevel, subresource_range.baseArrayLayer, subresource_range.layerCount}; } vk::ImageSubresourceRange HPPImageView::get_subresource_range() const diff --git a/framework/core/hpp_image_view.h b/framework/core/hpp_image_view.h index b6b761bb21..cc3880e401 100644 --- a/framework/core/hpp_image_view.h +++ b/framework/core/hpp_image_view.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,13 +17,14 @@ #pragma once -#include "core/hpp_image.h" #include "core/vulkan_resource.h" namespace vkb { namespace core { +class HPPImage; + class HPPImageView : public vkb::core::VulkanResourceCpp { public: diff --git a/framework/core/hpp_instance.cpp b/framework/core/hpp_instance.cpp deleted file mode 100644 index 669de59481..0000000000 --- a/framework/core/hpp_instance.cpp +++ /dev/null @@ -1,504 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include -#include -#include - -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) -# define USE_VALIDATION_LAYERS -#endif - -#if defined(USE_VALIDATION_LAYERS) && (defined(VKB_VALIDATION_LAYERS_GPU_ASSISTED) || defined(VKB_VALIDATION_LAYERS_BEST_PRACTICES) || defined(VKB_VALIDATION_LAYERS_SYNCHRONIZATION)) -# define USE_VALIDATION_LAYER_FEATURES -#endif - -namespace vkb -{ -namespace -{ -#ifdef USE_VALIDATION_LAYERS -VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_type, - const VkDebugUtilsMessengerCallbackDataEXT *callback_data, - void *user_data) -{ - // Log debug message - if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) - { - LOGW("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); - } - else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) - { - LOGE("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); - } - return VK_FALSE; -} - -static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT /*type*/, - uint64_t /*object*/, size_t /*location*/, int32_t /*message_code*/, - const char *layer_prefix, const char *message, void * /*user_data*/) -{ - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) - { - LOGE("{}: {}", layer_prefix, message); - } - else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) - { - LOGW("{}: {}", layer_prefix, message); - } - else if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) - { - LOGW("{}: {}", layer_prefix, message); - } - else - { - LOGI("{}: {}", layer_prefix, message); - } - return VK_FALSE; -} -#endif - -bool validate_layers(const std::vector &required, - const std::vector &available) -{ - for (auto layer : required) - { - bool found = false; - for (auto &available_layer : available) - { - if (strcmp(available_layer.layerName, layer) == 0) - { - found = true; - break; - } - } - - if (!found) - { - LOGE("Validation Layer {} not found", layer); - return false; - } - } - - return true; -} -} // namespace - -namespace core -{ -std::vector get_optimal_validation_layers(const std::vector &supported_instance_layers) -{ - std::vector> validation_layer_priority_list = - { - // The preferred validation layer is "VK_LAYER_KHRONOS_validation" - {"VK_LAYER_KHRONOS_validation"}, - - // Otherwise we fallback to using the LunarG meta layer - {"VK_LAYER_LUNARG_standard_validation"}, - - // Otherwise we attempt to enable the individual layers that compose the LunarG meta layer since it doesn't exist - { - "VK_LAYER_GOOGLE_threading", - "VK_LAYER_LUNARG_parameter_validation", - "VK_LAYER_LUNARG_object_tracker", - "VK_LAYER_LUNARG_core_validation", - "VK_LAYER_GOOGLE_unique_objects", - }, - - // Otherwise as a last resort we fallback to attempting to enable the LunarG core layer - {"VK_LAYER_LUNARG_core_validation"}}; - - for (auto &validation_layers : validation_layer_priority_list) - { - if (validate_layers(validation_layers, supported_instance_layers)) - { - return validation_layers; - } - - LOGW("Couldn't enable validation layers (see log for error) - falling back"); - } - - // Else return nothing - return {}; -} - -Optional HPPInstance::selected_gpu_index; - -namespace -{ -bool enable_extension(const char *required_ext_name, - const std::vector &available_exts, - std::vector &enabled_extensions) -{ - for (auto &avail_ext_it : available_exts) - { - if (strcmp(avail_ext_it.extensionName, required_ext_name) == 0) - { - auto it = std::find_if(enabled_extensions.begin(), enabled_extensions.end(), - [required_ext_name](const char *enabled_ext_name) { - return strcmp(enabled_ext_name, required_ext_name) == 0; - }); - if (it != enabled_extensions.end()) - { - // Extension is already enabled - } - else - { - LOGI("Extension {} found, enabling it", required_ext_name); - enabled_extensions.emplace_back(required_ext_name); - } - return true; - } - } - - LOGI("Extension {} not found", required_ext_name); - return false; -} - -bool enable_all_extensions(const std::vector required_ext_names, - const std::vector &available_exts, - std::vector &enabled_extensions) -{ - using std::placeholders::_1; - - return std::all_of(required_ext_names.begin(), required_ext_names.end(), - std::bind(enable_extension, _1, available_exts, enabled_extensions)); -} - -} // namespace - -HPPInstance::HPPInstance(const std::string &application_name, - const std::unordered_map &required_extensions, - const std::vector &required_validation_layers, - const std::vector &required_layer_settings, - uint32_t api_version) -{ - std::vector available_instance_extensions = vk::enumerateInstanceExtensionProperties(); - -#ifdef USE_VALIDATION_LAYERS - // Check if VK_EXT_debug_utils is supported, which supersedes VK_EXT_Debug_Report - const bool has_debug_utils = enable_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, - available_instance_extensions, enabled_extensions); - bool has_debug_report = false; - - if (!has_debug_utils) - { - has_debug_report = enable_extension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, - available_instance_extensions, enabled_extensions); - if (!has_debug_report) - { - LOGW("Neither of {} or {} are available; disabling debug reporting", - VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_EXTENSION_NAME); - } - } -#endif - -#if (defined(VKB_ENABLE_PORTABILITY)) - enable_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, available_instance_extensions, enabled_extensions); - bool portability_enumeration_available = enable_extension(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, available_instance_extensions, enabled_extensions); -#endif - -#ifdef USE_VALIDATION_LAYER_FEATURES - bool validation_features = false; - { - std::vector available_layer_instance_extensions = vk::enumerateInstanceExtensionProperties(std::string("VK_LAYER_KHRONOS_validation")); - - for (auto &available_extension : available_layer_instance_extensions) - { - if (strcmp(available_extension.extensionName, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME) == 0) - { - validation_features = true; - LOGI("{} is available, enabling it", VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME); - enabled_extensions.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME); - } - } - } -#endif - - // Specific surface extensions are obtained from Window::get_required_surface_extensions - // They are already added to required_extensions by VulkanSample::prepare - - // If using VK_EXT_headless_surface, we still create and use a surface - enabled_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); - - // VK_KHR_get_physical_device_properties2 is a prerequisite of VK_KHR_performance_query - // which will be used for stats gathering where available. - enable_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, - available_instance_extensions, enabled_extensions); - - auto extension_error = false; - for (auto extension : required_extensions) - { - auto extension_name = extension.first; - auto extension_is_optional = extension.second; - if (!enable_extension(extension_name, available_instance_extensions, enabled_extensions)) - { - if (extension_is_optional) - { - LOGW("Optional instance extension {} not available, some features may be disabled", extension_name); - } - else - { - LOGE("Required instance extension {} not available, cannot run", extension_name); - extension_error = true; - } - extension_error = extension_error || !extension_is_optional; - } - } - - if (extension_error) - { - throw std::runtime_error("Required instance extensions are missing."); - } - - std::vector supported_validation_layers = vk::enumerateInstanceLayerProperties(); - - std::vector requested_validation_layers(required_validation_layers); - -#ifdef USE_VALIDATION_LAYERS - // Determine the optimal validation layers to enable that are necessary for useful debugging - std::vector optimal_validation_layers = get_optimal_validation_layers(supported_validation_layers); - requested_validation_layers.insert(requested_validation_layers.end(), optimal_validation_layers.begin(), optimal_validation_layers.end()); -#endif - - if (validate_layers(requested_validation_layers, supported_validation_layers)) - { - LOGI("Enabled Validation Layers:") - for (const auto &layer : requested_validation_layers) - { - LOGI(" \t{}", layer); - } - } - else - { - throw std::runtime_error("Required validation layers are missing."); - } - - vk::ApplicationInfo app_info(application_name.c_str(), 0, "Vulkan Samples", 0, api_version); - - vk::InstanceCreateInfo instance_info({}, &app_info, requested_validation_layers, enabled_extensions); - -#ifdef USE_VALIDATION_LAYERS - vk::DebugUtilsMessengerCreateInfoEXT debug_utils_create_info; - vk::DebugReportCallbackCreateInfoEXT debug_report_create_info; - if (has_debug_utils) - { - debug_utils_create_info = - vk::DebugUtilsMessengerCreateInfoEXT({}, - vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, - vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, - debug_utils_messenger_callback); - - instance_info.pNext = &debug_utils_create_info; - } - else if (has_debug_report) - { - debug_report_create_info = vk::DebugReportCallbackCreateInfoEXT( - vk::DebugReportFlagBitsEXT::eError | vk::DebugReportFlagBitsEXT::eWarning | vk::DebugReportFlagBitsEXT::ePerformanceWarning, debug_callback); - - instance_info.pNext = &debug_report_create_info; - } -#endif - -#if (defined(VKB_ENABLE_PORTABILITY)) - if (portability_enumeration_available) - { - instance_info.flags |= vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR; - } -#endif - -#ifdef USE_VALIDATION_LAYER_FEATURES - vk::ValidationFeaturesEXT validation_features_info; - std::vector enable_features{}; - if (validation_features) - { -# if defined(VKB_VALIDATION_LAYERS_GPU_ASSISTED) - enable_features.push_back(vk::ValidationFeatureEnableEXT::eGpuAssistedReserveBindingSlot); - enable_features.push_back(vk::ValidationFeatureEnableEXT::eGpuAssisted); -# endif -# if defined(VKB_VALIDATION_LAYERS_BEST_PRACTICES) - enable_features.push_back(vk::ValidationFeatureEnableEXT::eBestPractices); -# endif - validation_features_info.setEnabledValidationFeatures(enable_features); - validation_features_info.pNext = instance_info.pNext; - instance_info.pNext = &validation_features_info; - } -#endif - - vk::LayerSettingsCreateInfoEXT layerSettingsCreateInfo; - - // If layer settings extension enabled by sample, then activate layer settings during instance creation - if (std::find(enabled_extensions.begin(), enabled_extensions.end(), VK_EXT_LAYER_SETTINGS_EXTENSION_NAME) != enabled_extensions.end()) - { - layerSettingsCreateInfo.settingCount = static_cast(required_layer_settings.size()); - layerSettingsCreateInfo.pSettings = required_layer_settings.data(); - layerSettingsCreateInfo.pNext = instance_info.pNext; - instance_info.pNext = &layerSettingsCreateInfo; - } - - // Create the Vulkan instance - handle = vk::createInstance(instance_info); - - // initialize the Vulkan-Hpp default dispatcher on the instance - VULKAN_HPP_DEFAULT_DISPATCHER.init(handle); - - // Need to load volk for all the not-yet Vulkan-Hpp calls - volkLoadInstance(handle); - -#ifdef USE_VALIDATION_LAYERS - if (has_debug_utils) - { - debug_utils_messenger = handle.createDebugUtilsMessengerEXT(debug_utils_create_info); - } - else if (has_debug_report) - { - debug_report_callback = handle.createDebugReportCallbackEXT(debug_report_create_info); - } -#endif - - query_gpus(); -} - -HPPInstance::HPPInstance(vk::Instance instance) : - handle{instance} -{ - if (handle) - { - query_gpus(); - } - else - { - throw std::runtime_error("HPPInstance not valid"); - } -} - -HPPInstance::~HPPInstance() -{ -#ifdef USE_VALIDATION_LAYERS - if (debug_utils_messenger) - { - handle.destroyDebugUtilsMessengerEXT(debug_utils_messenger); - } - if (debug_report_callback) - { - handle.destroyDebugReportCallbackEXT(debug_report_callback); - } -#endif - - if (handle) - { - handle.destroy(); - } -} - -const std::vector &HPPInstance::get_extensions() -{ - return enabled_extensions; -} - -vkb::core::HPPPhysicalDevice &HPPInstance::get_first_gpu() -{ - assert(!gpus.empty() && "No physical devices were found on the system."); - - // Find a discrete GPU - for (auto &gpu : gpus) - { - if (gpu->get_properties().deviceType == vk::PhysicalDeviceType::eDiscreteGpu) - { - return *gpu; - } - } - - // Otherwise just pick the first one - LOGW("Couldn't find a discrete physical device, picking default GPU"); - return *gpus[0]; -} - -vk::Instance HPPInstance::get_handle() const -{ - return handle; -} - -vkb::core::HPPPhysicalDevice &HPPInstance::get_suitable_gpu(vk::SurfaceKHR surface, bool headless_surface) -{ - assert(!gpus.empty() && "No physical devices were found on the system."); - - // A GPU can be explicitly selected via the command line (see plugins/gpu_selection.cpp), this overrides the below GPU selection algorithm - if (selected_gpu_index.has_value()) - { - LOGI("Explicitly selecting GPU {}", selected_gpu_index.value()); - if (selected_gpu_index.value() > gpus.size() - 1) - { - throw std::runtime_error("Selected GPU index is not within no. of available GPUs"); - } - return *gpus[selected_gpu_index.value()]; - } - if ( headless_surface ) - { - LOGW("Using headless surface with multiple GPUs. Considered explicitly selecting the target GPU.") - } - - // Find a discrete GPU - for (auto &gpu : gpus) - { - if (gpu->get_properties().deviceType == vk::PhysicalDeviceType::eDiscreteGpu) - { - // See if it work with the surface - size_t queue_count = gpu->get_queue_family_properties().size(); - for (uint32_t queue_idx = 0; static_cast(queue_idx) < queue_count; queue_idx++) - { - if (gpu->get_handle().getSurfaceSupportKHR(queue_idx, surface)) - { - return *gpu; - } - } - } - } - - // Otherwise just pick the first one - LOGW("Couldn't find a discrete physical device, picking default GPU"); - return *gpus[0]; -} - -bool HPPInstance::is_enabled(const char *extension) const -{ - return std::find_if(enabled_extensions.begin(), - enabled_extensions.end(), - [extension](const char *enabled_extension) { return strcmp(extension, enabled_extension) == 0; }) != enabled_extensions.end(); -} - -void HPPInstance::query_gpus() -{ - // Querying valid physical devices on the machine - std::vector physical_devices = handle.enumeratePhysicalDevices(); - if (physical_devices.empty()) - { - throw std::runtime_error("Couldn't find a physical device that supports Vulkan."); - } - - // Create gpus wrapper objects from the vk::PhysicalDevice's - for (auto &physical_device : physical_devices) - { - gpus.push_back(std::make_unique(*this, physical_device)); - } -} - -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_instance.h b/framework/core/hpp_instance.h deleted file mode 100644 index c220d87f0f..0000000000 --- a/framework/core/hpp_instance.h +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "common/optional.h" -#include -#include -#include - -namespace vkb -{ -namespace core -{ -class HPPPhysicalDevice; -/** - * @brief Returns a list of Khronos/LunarG supported validation layers - * Attempting to enable them in order of preference, starting with later Vulkan SDK versions - * @param supported_instance_layers A list of validation layers to check against - */ -std::vector get_optimal_validation_layers(const std::vector &supported_instance_layers); - -/** - * @brief A wrapper class for vk::Instance - * - * This class is responsible for initializing the dispatcher, enumerating over all available extensions and validation layers - * enabling them if they exist, setting up debug messaging and querying all the physical devices existing on the machine. - */ -class HPPInstance -{ - public: - /** - * @brief Can be set from the GPU selection plugin to explicitly select a GPU instead - */ - static Optional selected_gpu_index; - - /** - * @brief Initializes the connection to Vulkan - * @param application_name The name of the application - * @param required_extensions The extensions requested to be enabled - * @param required_validation_layers The validation layers to be enabled - * @param required_layer_settings The layer settings to be enabled - * @param api_version The Vulkan API version that the instance will be using - * @throws runtime_error if the required extensions and validation layers are not found - */ - HPPInstance(const std::string &application_name, - const std::unordered_map &required_extensions = {}, - const std::vector &required_validation_layers = {}, - const std::vector &required_layer_settings = {}, - uint32_t api_version = VK_API_VERSION_1_0); - - /** - * @brief Queries the GPUs of a vk::Instance that is already created - * @param instance A valid vk::Instance - */ - HPPInstance(vk::Instance instance); - - HPPInstance(const HPPInstance &) = delete; - - HPPInstance(HPPInstance &&) = delete; - - ~HPPInstance(); - - HPPInstance &operator=(const HPPInstance &) = delete; - - HPPInstance &operator=(HPPInstance &&) = delete; - - const std::vector &get_extensions(); - - /** - * @brief Tries to find the first available discrete GPU - * @returns A valid physical device - */ - HPPPhysicalDevice &get_first_gpu(); - - vk::Instance get_handle() const; - - /** - * @brief Tries to find the first available discrete GPU that can render to the given surface - * @param surface to test against - * @param headless_surface Is surface created with VK_EXT_headless_surface - * @returns A valid physical device - - */ - HPPPhysicalDevice &get_suitable_gpu(vk::SurfaceKHR surface, bool headless_surface); - - /** - * @brief Checks if the given extension is enabled in the vk::Instance - * @param extension An extension to check - */ - bool is_enabled(const char *extension) const; - - private: - /** - * @brief Queries the instance for the physical devices on the machine - */ - void query_gpus(); - - private: - /** - * @brief The Vulkan instance - */ - vk::Instance handle; - - /** - * @brief The enabled extensions - */ - std::vector enabled_extensions; - -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) - /** - * @brief Debug utils messenger callback for VK_EXT_Debug_Utils - */ - vk::DebugUtilsMessengerEXT debug_utils_messenger; - - /** - * @brief The debug report callback - */ - vk::DebugReportCallbackEXT debug_report_callback; -#endif - - /** - * @brief The physical devices found on the machine - */ - std::vector> gpus; -}; -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_physical_device.cpp b/framework/core/hpp_physical_device.cpp deleted file mode 100644 index 14995263d9..0000000000 --- a/framework/core/hpp_physical_device.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -namespace vkb -{ -namespace core -{ -HPPPhysicalDevice::HPPPhysicalDevice(HPPInstance &instance, vk::PhysicalDevice physical_device) : - instance{instance}, - handle{physical_device} -{ - features = physical_device.getFeatures(); - properties = physical_device.getProperties(); - memory_properties = physical_device.getMemoryProperties(); - - LOGI("Found GPU: {}", properties.deviceName.data()); - - queue_family_properties = physical_device.getQueueFamilyProperties(); - - device_extensions = physical_device.enumerateDeviceExtensionProperties(); - - // Display supported extensions - if (device_extensions.size() > 0) - { - LOGD("HPPDevice supports the following extensions:"); - for (auto &extension : device_extensions) - { - LOGD(" \t{}", extension.extensionName.data()); - } - } -} - -DriverVersion HPPPhysicalDevice::get_driver_version() const -{ - DriverVersion version; - - vk::PhysicalDeviceProperties const &properties = get_properties(); - switch (properties.vendorID) - { - case 0x10DE: - // Nvidia - version.major = (properties.driverVersion >> 22) & 0x3ff; - version.minor = (properties.driverVersion >> 14) & 0x0ff; - version.patch = (properties.driverVersion >> 6) & 0x0ff; - // Ignoring optional tertiary info in lower 6 bits - break; - case 0x8086: - version.major = (properties.driverVersion >> 14) & 0x3ffff; - version.minor = properties.driverVersion & 0x3ffff; - break; - default: - version.major = VK_VERSION_MAJOR(properties.driverVersion); - version.minor = VK_VERSION_MINOR(properties.driverVersion); - version.patch = VK_VERSION_PATCH(properties.driverVersion); - break; - } - - return version; -} - -void *HPPPhysicalDevice::get_extension_feature_chain() const -{ - return last_requested_extension_feature; -} - -bool HPPPhysicalDevice::is_extension_supported(const std::string &requested_extension) const -{ - return std::find_if(device_extensions.begin(), - device_extensions.end(), - [requested_extension](auto &device_extension) { return std::strcmp(device_extension.extensionName, requested_extension.c_str()) == 0; }) != device_extensions.end(); -} - -const vk::PhysicalDeviceFeatures &HPPPhysicalDevice::get_features() const -{ - return features; -} - -vk::PhysicalDevice HPPPhysicalDevice::get_handle() const -{ - return handle; -} - -vkb::core::HPPInstance &HPPPhysicalDevice::get_instance() const -{ - return instance; -} - -const vk::PhysicalDeviceMemoryProperties &HPPPhysicalDevice::get_memory_properties() const -{ - return memory_properties; -} - -uint32_t HPPPhysicalDevice::get_memory_type(uint32_t bits, vk::MemoryPropertyFlags properties, vk::Bool32 *memory_type_found) const -{ - for (uint32_t i = 0; i < memory_properties.memoryTypeCount; i++) - { - if ((bits & 1) == 1) - { - if ((memory_properties.memoryTypes[i].propertyFlags & properties) == properties) - { - if (memory_type_found) - { - *memory_type_found = true; - } - return i; - } - } - bits >>= 1; - } - - if (memory_type_found) - { - *memory_type_found = false; - return ~0; - } - else - { - throw std::runtime_error("Could not find a matching memory type"); - } -} - -const vk::PhysicalDeviceProperties &HPPPhysicalDevice::get_properties() const -{ - return properties; -} - -const std::vector &HPPPhysicalDevice::get_queue_family_properties() const -{ - return queue_family_properties; -} - -const vk::PhysicalDeviceFeatures HPPPhysicalDevice::get_requested_features() const -{ - return requested_features; -} - -vk::PhysicalDeviceFeatures &HPPPhysicalDevice::get_mutable_requested_features() -{ - return requested_features; -} - -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_physical_device.h b/framework/core/hpp_physical_device.h deleted file mode 100644 index 2ee53ab946..0000000000 --- a/framework/core/hpp_physical_device.h +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include - -namespace vkb -{ -namespace core -{ -class HPPInstance; - -struct DriverVersion -{ - uint16_t major; - uint16_t minor; - uint16_t patch; -}; - -/** - * @brief A wrapper class for vk::PhysicalDevice - * - * This class is responsible for handling gpu features, properties, and queue families for the device creation. - */ -class HPPPhysicalDevice -{ - public: - HPPPhysicalDevice(HPPInstance &instance, vk::PhysicalDevice physical_device); - - HPPPhysicalDevice(const HPPPhysicalDevice &) = delete; - - HPPPhysicalDevice(HPPPhysicalDevice &&) = delete; - - HPPPhysicalDevice &operator=(const HPPPhysicalDevice &) = delete; - - HPPPhysicalDevice &operator=(HPPPhysicalDevice &&) = delete; - - /** - * @return The version of the driver - */ - DriverVersion get_driver_version() const; - - /** - * @brief Used at logical device creation to pass the extensions feature chain to vkCreateDevice - * @returns A void pointer to the start of the extension linked list - */ - void *get_extension_feature_chain() const; - - bool is_extension_supported(const std::string &requested_extension) const; - - const vk::PhysicalDeviceFeatures &get_features() const; - - vk::PhysicalDevice get_handle() const; - - vkb::core::HPPInstance &get_instance() const; - - const vk::PhysicalDeviceMemoryProperties &get_memory_properties() const; - - /** - * @brief Checks that a given memory type is supported by the GPU - * @param bits The memory requirement type bits - * @param properties The memory property to search for - * @param memory_type_found True if found, false if not found - * @returns The memory type index of the found memory type - */ - uint32_t get_memory_type(uint32_t bits, vk::MemoryPropertyFlags properties, vk::Bool32 *memory_type_found = nullptr) const; - - const vk::PhysicalDeviceProperties &get_properties() const; - - const std::vector &get_queue_family_properties() const; - - const vk::PhysicalDeviceFeatures get_requested_features() const; - - vk::PhysicalDeviceFeatures &get_mutable_requested_features(); - - /** - * @brief Get an extension features struct - * - * Gets the actual extension features struct with the supported flags set. - * The flags you're interested in can be set in a corresponding struct in the structure chain - * by calling PhysicalDevice::add_extension_features() - * @returns The extension feature struct - */ - template - HPPStructureType get_extension_features() - { - // We cannot request extension features if the physical device properties 2 instance extension isn't enabled - if (!instance.is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) - { - throw std::runtime_error("Couldn't request feature from device as " + std::string(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) + - " isn't enabled!"); - } - - // Get the extension feature - return handle.getFeatures2KHR().template get(); - } - - /** - * @brief Add an extension features struct to the structure chain used for device creation - * - * To have the features enabled, this function must be called before the logical device - * is created. To do this request sample specific features inside - * VulkanSample::request_gpu_features(vkb::HPPPhysicalDevice &gpu). - * - * If the feature extension requires you to ask for certain features to be enabled, you can - * modify the struct returned by this function, it will propagate the changes to the logical - * device. - * @returns A reference to the extension feature struct in the structure chain - */ - template - HPPStructureType &add_extension_features() - { - // We cannot request extension features if the physical device properties 2 instance extension isn't enabled - if (!instance.is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) - { - throw std::runtime_error("Couldn't request feature from device as " + std::string(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) + - " isn't enabled!"); - } - - // Add an (empty) extension features into the map of extension features - auto [it, added] = extension_features.insert({HPPStructureType::structureType, std::make_shared()}); - if (added) - { - // if it was actually added, also add it to the structure chain - if (last_requested_extension_feature) - { - static_cast(it->second.get())->pNext = last_requested_extension_feature; - } - last_requested_extension_feature = it->second.get(); - } - - return *static_cast(it->second.get()); - } - - /** - * @brief Request an optional features flag - * - * Calls get_extension_features to get the support of the requested flag. If it's supported, - * add_extension_features is called, otherwise a log message is generated. - * - * @returns true if the requested feature is supported, otherwise false - */ - template - vk::Bool32 request_optional_feature(vk::Bool32 Feature::*flag, std::string const &featureName, std::string const &flagName) - { - vk::Bool32 supported = get_extension_features().*flag; - if (supported) - { - add_extension_features().*flag = true; - } - else - { - LOGI("Requested optional feature <{}::{}> is not supported", featureName, flagName); - } - return supported; - } - - /** - * @brief Request a required features flag - * - * Calls get_extension_features to get the support of the requested flag. If it's supported, - * add_extension_features is called, otherwise a runtime_error is thrown. - */ - template - void request_required_feature(vk::Bool32 Feature::*flag, std::string const &featureName, std::string const &flagName) - { - if (get_extension_features().*flag) - { - add_extension_features().*flag = true; - } - else - { - throw std::runtime_error(std::string("Requested required feature <") + featureName + "::" + flagName + "> is not supported"); - } - } - - /** - * @brief Sets whether or not the first graphics queue should have higher priority than other queues. - * Very specific feature which is used by async compute samples. - * @param enable If true, present queue will have prio 1.0 and other queues have prio 0.5. - * Default state is false, where all queues have 0.5 priority. - */ - void set_high_priority_graphics_queue_enable(bool enable) - { - high_priority_graphics_queue = enable; - } - - /** - * @brief Returns high priority graphics queue state. - * @return High priority state. - */ - bool has_high_priority_graphics_queue() const - { - return high_priority_graphics_queue; - } - - private: - // Handle to the Vulkan instance - HPPInstance &instance; - - // Handle to the Vulkan physical device - vk::PhysicalDevice handle{nullptr}; - - // The features that this GPU supports - vk::PhysicalDeviceFeatures features; - - // The extensions that this GPU supports - std::vector device_extensions; - - // The GPU properties - vk::PhysicalDeviceProperties properties; - - // The GPU memory properties - vk::PhysicalDeviceMemoryProperties memory_properties; - - // The GPU queue family properties - std::vector queue_family_properties; - - // The features that will be requested to be enabled in the logical device - vk::PhysicalDeviceFeatures requested_features; - - // The extension feature pointer - void *last_requested_extension_feature{nullptr}; - - // Holds the extension feature structures, we use a map to retain an order of requested structures - std::map> extension_features; - - bool high_priority_graphics_queue{false}; -}; - -#define HPP_REQUEST_OPTIONAL_FEATURE(gpu, Feature, flag) gpu.request_optional_feature(&Feature::flag, #Feature, #flag) -#define HPP_REQUEST_REQUIRED_FEATURE(gpu, Feature, flag) gpu.request_required_feature(&Feature::flag, #Feature, #flag) - -} // namespace core -} // namespace vkb diff --git a/framework/core/hpp_pipeline.h b/framework/core/hpp_pipeline.h index 49c0f17d15..24bdf6b937 100644 --- a/framework/core/hpp_pipeline.h +++ b/framework/core/hpp_pipeline.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -45,9 +45,10 @@ class HPPPipeline : private vkb::Pipeline class HPPComputePipeline : private vkb::ComputePipeline { public: - HPPComputePipeline(vkb::core::HPPDevice &device, vk::PipelineCache pipeline_cache, vkb::rendering::HPPPipelineState &pipeline_state) : - vkb::ComputePipeline( - reinterpret_cast(device), static_cast(pipeline_cache), reinterpret_cast(pipeline_state)) + HPPComputePipeline(vkb::core::DeviceCpp &device, vk::PipelineCache pipeline_cache, vkb::rendering::HPPPipelineState &pipeline_state) : + vkb::ComputePipeline(reinterpret_cast(device), + static_cast(pipeline_cache), + reinterpret_cast(pipeline_state)) {} vk::Pipeline get_handle() const @@ -59,9 +60,10 @@ class HPPComputePipeline : private vkb::ComputePipeline class HPPGraphicsPipeline : private vkb::GraphicsPipeline { public: - HPPGraphicsPipeline(vkb::core::HPPDevice &device, vk::PipelineCache pipeline_cache, vkb::rendering::HPPPipelineState &pipeline_state) : - vkb::GraphicsPipeline( - reinterpret_cast(device), static_cast(pipeline_cache), reinterpret_cast(pipeline_state)) + HPPGraphicsPipeline(vkb::core::DeviceCpp &device, vk::PipelineCache pipeline_cache, vkb::rendering::HPPPipelineState &pipeline_state) : + vkb::GraphicsPipeline(reinterpret_cast(device), + static_cast(pipeline_cache), + reinterpret_cast(pipeline_state)) {} vk::Pipeline get_handle() const diff --git a/framework/core/hpp_pipeline_layout.cpp b/framework/core/hpp_pipeline_layout.cpp index 75e772ade9..61c08d0c93 100644 --- a/framework/core/hpp_pipeline_layout.cpp +++ b/framework/core/hpp_pipeline_layout.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,15 +16,15 @@ */ #include "hpp_pipeline_layout.h" +#include "core/device.h" -#include #include namespace vkb { namespace core { -HPPPipelineLayout::HPPPipelineLayout(vkb::core::HPPDevice &device, const std::vector &shader_modules) : +HPPPipelineLayout::HPPPipelineLayout(vkb::core::DeviceCpp &device, const std::vector &shader_modules) : device{device}, shader_modules{shader_modules} { @@ -99,7 +99,10 @@ HPPPipelineLayout::HPPPipelineLayout(vkb::core::HPPDevice &device, const std::ve push_constant_ranges.push_back({push_constant_resource.stages, push_constant_resource.offset, push_constant_resource.size}); } - vk::PipelineLayoutCreateInfo create_info({}, descriptor_set_layout_handles, push_constant_ranges); + vk::PipelineLayoutCreateInfo create_info{.setLayoutCount = static_cast(descriptor_set_layout_handles.size()), + .pSetLayouts = descriptor_set_layout_handles.data(), + .pushConstantRangeCount = static_cast(push_constant_ranges.size()), + .pPushConstantRanges = push_constant_ranges.data()}; // Create the Vulkan pipeline layout handle handle = device.get_handle().createPipelineLayout(create_info); @@ -127,9 +130,8 @@ HPPPipelineLayout::~HPPPipelineLayout() vkb::core::HPPDescriptorSetLayout const &HPPPipelineLayout::get_descriptor_set_layout(const uint32_t set_index) const { - auto it = std::find_if(descriptor_set_layouts.begin(), - descriptor_set_layouts.end(), - [&set_index](auto const *descriptor_set_layout) { return descriptor_set_layout->get_index() == set_index; }); + auto it = std::ranges::find_if(descriptor_set_layouts, + [&set_index](auto const *descriptor_set_layout) { return descriptor_set_layout->get_index() == set_index; }); if (it == descriptor_set_layouts.end()) { throw std::runtime_error("Couldn't find descriptor set layout at set index " + to_string(set_index)); diff --git a/framework/core/hpp_pipeline_layout.h b/framework/core/hpp_pipeline_layout.h index 5876b6f6fa..9e005fc135 100644 --- a/framework/core/hpp_pipeline_layout.h +++ b/framework/core/hpp_pipeline_layout.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -35,7 +35,7 @@ class HPPDescriptorSetLayout; class HPPPipelineLayout { public: - HPPPipelineLayout(vkb::core::HPPDevice &device, const std::vector &shader_modules); + HPPPipelineLayout(vkb::core::DeviceCpp &device, const std::vector &shader_modules); HPPPipelineLayout(const HPPPipelineLayout &) = delete; HPPPipelineLayout(HPPPipelineLayout &&other); ~HPPPipelineLayout(); @@ -53,7 +53,7 @@ class HPPPipelineLayout bool has_descriptor_set_layout(const uint32_t set_index) const; private: - vkb::core::HPPDevice &device; + vkb::core::DeviceCpp &device; vk::PipelineLayout handle; std::vector shader_modules; // The shader modules that this pipeline layout uses std::unordered_map shader_resources; // The shader resources that this pipeline layout uses, indexed by their name diff --git a/framework/core/hpp_queue.cpp b/framework/core/hpp_queue.cpp index 411d736ad2..e008caee40 100644 --- a/framework/core/hpp_queue.cpp +++ b/framework/core/hpp_queue.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -15,21 +15,16 @@ * limitations under the License. */ -#include - -#include -#include +#include "core/hpp_queue.h" +#include "core/command_buffer.h" +#include "core/device.h" namespace vkb { namespace core { -HPPQueue::HPPQueue(vkb::core::HPPDevice &device, uint32_t family_index, vk::QueueFamilyProperties properties, vk::Bool32 can_present, uint32_t index) : - device{device}, - family_index{family_index}, - index{index}, - can_present{can_present}, - properties{properties} +HPPQueue::HPPQueue(vkb::core::DeviceCpp &device, uint32_t family_index, vk::QueueFamilyProperties const &properties, vk::Bool32 can_present, uint32_t index) : + device{device}, family_index{family_index}, index{index}, can_present{can_present}, properties{properties} { handle = device.get_handle().getQueue(family_index, index); } @@ -43,7 +38,7 @@ HPPQueue::HPPQueue(HPPQueue &&other) : properties(std::exchange(other.properties, {})) {} -const HPPDevice &HPPQueue::get_device() const +const vkb::core::DeviceCpp &HPPQueue::get_device() const { return device; } @@ -73,10 +68,10 @@ vk::Bool32 HPPQueue::support_present() const return can_present; } -void HPPQueue::submit(const HPPCommandBuffer &command_buffer, vk::Fence fence) const +void HPPQueue::submit(const vkb::core::CommandBufferCpp &command_buffer, vk::Fence fence) const { vk::CommandBuffer commandBuffer = command_buffer.get_handle(); - vk::SubmitInfo submit_info({}, {}, commandBuffer); + vk::SubmitInfo submit_info{.commandBufferCount = 1, .pCommandBuffers = &commandBuffer}; handle.submit(submit_info, fence); } diff --git a/framework/core/hpp_queue.h b/framework/core/hpp_queue.h index 4240177fb2..1a29301c3e 100644 --- a/framework/core/hpp_queue.h +++ b/framework/core/hpp_queue.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,14 +17,20 @@ #pragma once +#include "common/vk_common.h" #include namespace vkb { namespace core { -class HPPCommandBuffer; -class HPPDevice; +template +class Device; +using DeviceCpp = Device; + +template +class CommandBuffer; +using CommandBufferCpp = CommandBuffer; /** * @brief A wrapper class for vk::Queue @@ -33,7 +39,7 @@ class HPPDevice; class HPPQueue { public: - HPPQueue(HPPDevice &device, uint32_t family_index, vk::QueueFamilyProperties properties, vk::Bool32 can_present, uint32_t index); + HPPQueue(vkb::core::DeviceCpp &device, uint32_t family_index, vk::QueueFamilyProperties const &properties, vk::Bool32 can_present, uint32_t index); HPPQueue(const HPPQueue &) = default; @@ -43,7 +49,7 @@ class HPPQueue HPPQueue &operator=(HPPQueue &&) = delete; - const HPPDevice &get_device() const; + const vkb::core::DeviceCpp &get_device() const; vk::Queue get_handle() const; @@ -55,12 +61,12 @@ class HPPQueue vk::Bool32 support_present() const; - void submit(const HPPCommandBuffer &command_buffer, vk::Fence fence) const; + void submit(const vkb::core::CommandBufferCpp &command_buffer, vk::Fence fence) const; vk::Result present(const vk::PresentInfoKHR &present_infos) const; private: - HPPDevice &device; + vkb::core::DeviceCpp &device; vk::Queue handle; diff --git a/framework/core/hpp_render_pass.h b/framework/core/hpp_render_pass.h index 848065d981..7b22faf0d7 100644 --- a/framework/core/hpp_render_pass.h +++ b/framework/core/hpp_render_pass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -57,11 +57,11 @@ class HPPRenderPass : private vkb::RenderPass using vkb::RenderPass::get_color_output_count; public: - HPPRenderPass(vkb::core::HPPDevice &device, + HPPRenderPass(vkb::core::DeviceCpp &device, const std::vector &attachments, const std::vector &load_store_infos, const std::vector &subpasses) : - vkb::RenderPass(reinterpret_cast(device), + vkb::RenderPass(reinterpret_cast(device), reinterpret_cast const &>(attachments), reinterpret_cast const &>(load_store_infos), reinterpret_cast const &>(subpasses)) @@ -72,9 +72,10 @@ class HPPRenderPass : private vkb::RenderPass return static_cast(vkb::RenderPass::get_handle()); } - const vk::Extent2D get_render_area_granularity() const + vk::Extent2D get_render_area_granularity() const { - return static_cast(vkb::RenderPass::get_render_area_granularity()); + VkExtent2D extent = vkb::RenderPass::get_render_area_granularity(); + return *reinterpret_cast(&extent); } }; } // namespace core diff --git a/framework/core/hpp_sampler.cpp b/framework/core/hpp_sampler.cpp index 4ecc9dc734..e8ef85d985 100644 --- a/framework/core/hpp_sampler.cpp +++ b/framework/core/hpp_sampler.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,14 +16,13 @@ */ #include "hpp_sampler.h" - -#include "hpp_device.h" +#include "core/device.h" namespace vkb { namespace core { -HPPSampler::HPPSampler(vkb::core::HPPDevice &device, const vk::SamplerCreateInfo &info) : +HPPSampler::HPPSampler(vkb::core::DeviceCpp &device, const vk::SamplerCreateInfo &info) : vkb::core::VulkanResourceCpp{device.get_handle().createSampler(info), &device} {} diff --git a/framework/core/hpp_sampler.h b/framework/core/hpp_sampler.h index f96be91cc2..08ef63c45a 100644 --- a/framework/core/hpp_sampler.h +++ b/framework/core/hpp_sampler.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -34,7 +34,7 @@ class HPPSampler : public vkb::core::VulkanResourceCpp * @param device The device to use * @param info Creation details */ - HPPSampler(vkb::core::HPPDevice &device, const vk::SamplerCreateInfo &info); + HPPSampler(vkb::core::DeviceCpp &device, const vk::SamplerCreateInfo &info); HPPSampler(const HPPSampler &) = delete; diff --git a/framework/core/hpp_shader_module.h b/framework/core/hpp_shader_module.h index 671d43fc76..2d2e11b23f 100644 --- a/framework/core/hpp_shader_module.h +++ b/framework/core/hpp_shader_module.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,7 +24,11 @@ namespace vkb { namespace core { -class HPPDevice; +template +class Device; +using DeviceCpp = Device; +using DeviceC = Device; + /** * @brief facade class around vkb::ShaderModule, providing a vulkan.hpp-based interface * @@ -94,12 +98,12 @@ class HPPShaderModule : private vkb::ShaderModule using vkb::ShaderModule::get_id; public: - HPPShaderModule(vkb::core::HPPDevice &device, + HPPShaderModule(vkb::core::DeviceCpp &device, vk::ShaderStageFlagBits stage, const vkb::core::HPPShaderSource &glsl_source, const std::string &entry_point, const vkb::core::HPPShaderVariant &shader_variant) : - vkb::ShaderModule(reinterpret_cast(device), + vkb::ShaderModule(reinterpret_cast(device), static_cast(stage), reinterpret_cast(glsl_source), entry_point, diff --git a/framework/core/hpp_swapchain.cpp b/framework/core/hpp_swapchain.cpp index 90cde6cf4f..5b77c55f28 100644 --- a/framework/core/hpp_swapchain.cpp +++ b/framework/core/hpp_swapchain.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,9 +16,8 @@ */ #include "core/hpp_swapchain.h" - -#include "core/hpp_device.h" -#include "core/util/logging.hpp" +#include "core/device.h" +#include "core/physical_device.h" namespace vkb { @@ -30,6 +29,11 @@ constexpr const T &clamp(const T &v, const T &lo, const T &hi) return (v < lo) ? lo : ((hi < v) ? hi : v); } +inline uint32_t choose_image_count(uint32_t request_image_count, uint32_t min_image_count, uint32_t max_image_count) +{ + return clamp(request_image_count, min_image_count, (max_image_count != 0) ? max_image_count : request_image_count); +} + vk::Extent2D choose_extent(vk::Extent2D request_extent, const vk::Extent2D &min_image_extent, const vk::Extent2D &max_image_extent, @@ -61,14 +65,13 @@ vk::PresentModeKHR choose_present_mode(vk::PresentModeKHR re const std::vector &present_mode_priority_list) { // Try to find the requested present mode in the available present modes - auto const present_mode_it = std::find(available_present_modes.begin(), available_present_modes.end(), request_present_mode); + auto const present_mode_it = std::ranges::find(available_present_modes, request_present_mode); if (present_mode_it == available_present_modes.end()) { // If the requested present mode isn't found, then try to find a mode from the priority list auto const chosen_present_mode_it = - std::find_if(present_mode_priority_list.begin(), - present_mode_priority_list.end(), - [&available_present_modes](vk::PresentModeKHR present_mode) { return std::find(available_present_modes.begin(), available_present_modes.end(), present_mode) != available_present_modes.end(); }); + std::ranges::find_if(present_mode_priority_list, + [&available_present_modes](vk::PresentModeKHR present_mode) { return std::ranges::find(available_present_modes, present_mode) != available_present_modes.end(); }); // If nothing found, always default to FIFO vk::PresentModeKHR const chosen_present_mode = (chosen_present_mode_it != present_mode_priority_list.end()) ? *chosen_present_mode_it : vk::PresentModeKHR::eFifo; @@ -88,15 +91,14 @@ vk::SurfaceFormatKHR choose_surface_format(const vk::SurfaceFormatKHR const std::vector &surface_format_priority_list) { // Try to find the requested surface format in the available surface formats - auto const surface_format_it = std::find(available_surface_formats.begin(), available_surface_formats.end(), requested_surface_format); + auto const surface_format_it = std::ranges::find(available_surface_formats, requested_surface_format); // If the requested surface format isn't found, then try to request a format from the priority list if (surface_format_it == available_surface_formats.end()) { auto const chosen_surface_format_it = - std::find_if(surface_format_priority_list.begin(), - surface_format_priority_list.end(), - [&available_surface_formats](vk::SurfaceFormatKHR surface_format) { return std::find(available_surface_formats.begin(), available_surface_formats.end(), surface_format) != available_surface_formats.end(); }); + std::ranges::find_if(surface_format_priority_list, + [&available_surface_formats](vk::SurfaceFormatKHR surface_format) { return std::ranges::find(available_surface_formats, surface_format) != available_surface_formats.end(); }); // If nothing found, default to the first available format vk::SurfaceFormatKHR const &chosen_surface_format = (chosen_surface_format_it != surface_format_priority_list.end()) ? *chosen_surface_format_it : available_surface_formats[0]; @@ -114,6 +116,11 @@ vk::SurfaceFormatKHR choose_surface_format(const vk::SurfaceFormatKHR } } +inline uint32_t choose_image_array_layers(uint32_t request_image_array_layers, uint32_t max_image_array_layers) +{ + return clamp(request_image_array_layers, 1u, max_image_array_layers); +} + vk::SurfaceTransformFlagBitsKHR choose_transform(vk::SurfaceTransformFlagBitsKHR request_transform, vk::SurfaceTransformFlagsKHR supported_transform, vk::SurfaceTransformFlagBitsKHR current_transform) @@ -184,9 +191,8 @@ std::set choose_image_usage(const std::set &imag namespace core { HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const vk::Extent2D &extent) : - HPPSwapchain{old_swapchain.device, + HPPSwapchain{old_swapchain, + old_swapchain.device, old_swapchain.surface, old_swapchain.properties.present_mode, old_swapchain.present_mode_priority_list, @@ -234,11 +241,13 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const vk::Extent2D &exte old_swapchain.properties.image_count, old_swapchain.properties.pre_transform, old_swapchain.image_usage_flags, - old_swapchain.get_handle()} + old_swapchain.requested_compression, + old_swapchain.requested_compression_fixed_rate} {} HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const uint32_t image_count) : - HPPSwapchain{old_swapchain.device, + HPPSwapchain{old_swapchain, + old_swapchain.device, old_swapchain.surface, old_swapchain.properties.present_mode, old_swapchain.present_mode_priority_list, @@ -247,11 +256,13 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const uint32_t image_cou image_count, old_swapchain.properties.pre_transform, old_swapchain.image_usage_flags, - old_swapchain.get_handle()} + old_swapchain.requested_compression, + old_swapchain.requested_compression_fixed_rate} {} HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const std::set &image_usage_flags) : - HPPSwapchain{old_swapchain.device, + HPPSwapchain{old_swapchain, + old_swapchain.device, old_swapchain.surface, old_swapchain.properties.present_mode, old_swapchain.present_mode_priority_list, @@ -260,11 +271,13 @@ HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, const std::set &present_mode_priority_list, + const std::vector &surface_format_priority_list, + const vk::Extent2D &extent, + const uint32_t image_count, + const vk::SurfaceTransformFlagBitsKHR transform, + const std::set &image_usage_flags, + const vk::ImageCompressionFlagsEXT requested_compression, + const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate) : + HPPSwapchain{*this, device, surface, present_mode, present_mode_priority_list, surface_format_priority_list, extent, image_count, transform, image_usage_flags} {} -HPPSwapchain::HPPSwapchain(HPPDevice &device, - vk::SurfaceKHR surface, - const vk::PresentModeKHR present_mode, - const std::vector &present_mode_priority_list, - const std::vector &surface_format_priority_list, - const vk::Extent2D &extent, - const uint32_t image_count, - const vk::SurfaceTransformFlagBitsKHR transform, - const std::set &image_usage_flags, - vk::SwapchainKHR old_swapchain) : +HPPSwapchain::HPPSwapchain(HPPSwapchain &old_swapchain, + vkb::core::DeviceCpp &device, + vk::SurfaceKHR surface, + const vk::PresentModeKHR present_mode, + std::vector const &present_mode_priority_list, + const std::vector &surface_format_priority_list, + const vk::Extent2D &extent, + const uint32_t image_count, + const vk::SurfaceTransformFlagBitsKHR transform, + const std::set &image_usage_flags, + const vk::ImageCompressionFlagsEXT requested_compression, + const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate) : device{device}, - surface{surface} + surface{surface}, + requested_compression{requested_compression}, + requested_compression_fixed_rate{requested_compression_fixed_rate} { this->present_mode_priority_list = present_mode_priority_list; this->surface_format_priority_list = surface_format_priority_list; @@ -309,13 +359,11 @@ HPPSwapchain::HPPSwapchain(HPPDevice &device, // Choose best properties based on surface capabilities vk::SurfaceCapabilitiesKHR const surface_capabilities = device.get_gpu().get_handle().getSurfaceCapabilitiesKHR(surface); - properties.old_swapchain = old_swapchain; - properties.image_count = clamp(image_count, - surface_capabilities.minImageCount, - surface_capabilities.maxImageCount ? surface_capabilities.maxImageCount : std::numeric_limits::max()); + properties.old_swapchain = old_swapchain.get_handle(); + properties.image_count = choose_image_count(image_count, surface_capabilities.minImageCount, surface_capabilities.maxImageCount); properties.extent = choose_extent(extent, surface_capabilities.minImageExtent, surface_capabilities.maxImageExtent, surface_capabilities.currentExtent); properties.surface_format = choose_surface_format(properties.surface_format, surface_formats, surface_format_priority_list); - properties.array_layers = 1; + properties.array_layers = choose_image_array_layers(1U, surface_capabilities.maxImageArrayLayers); vk::FormatProperties const format_properties = device.get_gpu().get_handle().getFormatProperties(properties.surface_format.format); this->image_usage_flags = choose_image_usage(image_usage_flags, surface_capabilities.supportedUsageFlags, format_properties.optimalTilingFeatures); @@ -325,25 +373,75 @@ HPPSwapchain::HPPSwapchain(HPPDevice &device, properties.composite_alpha = choose_composite_alpha(vk::CompositeAlphaFlagBitsKHR::eInherit, surface_capabilities.supportedCompositeAlpha); properties.present_mode = choose_present_mode(present_mode, present_modes, present_mode_priority_list); - vk::SwapchainCreateInfoKHR const create_info({}, - surface, - properties.image_count, - properties.surface_format.format, - properties.surface_format.colorSpace, - properties.extent, - properties.array_layers, - properties.image_usage, - {}, - {}, - properties.pre_transform, - properties.composite_alpha, - properties.present_mode, - {}, - properties.old_swapchain); + vk::SwapchainCreateInfoKHR create_info{.surface = surface, + .minImageCount = properties.image_count, + .imageFormat = properties.surface_format.format, + .imageColorSpace = properties.surface_format.colorSpace, + .imageExtent = properties.extent, + .imageArrayLayers = properties.array_layers, + .imageUsage = properties.image_usage, + .preTransform = properties.pre_transform, + .compositeAlpha = properties.composite_alpha, + .presentMode = properties.present_mode, + .oldSwapchain = properties.old_swapchain}; + + auto fixed_rate_flags = requested_compression_fixed_rate; + vk::ImageCompressionControlEXT compression_control; + compression_control.flags = requested_compression; + if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) + { + create_info.pNext = &compression_control; + + if (vk::ImageCompressionFlagBitsEXT::eFixedRateExplicit == requested_compression) + { + // Do not support compression for multi-planar formats + compression_control.compressionControlPlaneCount = 1; + compression_control.pFixedRateFlags = &fixed_rate_flags; + } + else if (vk::ImageCompressionFlagBitsEXT::eDisabled == requested_compression) + { + LOGW("(Swapchain) Disabling default (lossless) compression, which can negatively impact performance") + } + } + else + { + if (vk::ImageCompressionFlagBitsEXT::eDefault != requested_compression) + { + LOGW("(Swapchain) Compression cannot be controlled because VK_EXT_image_compression_control_swapchain is not enabled") + + this->requested_compression = vk::ImageCompressionFlagBitsEXT::eDefault; + this->requested_compression_fixed_rate = vk::ImageCompressionFixedRateFlagBitsEXT::eNone; + } + } handle = device.get_handle().createSwapchainKHR(create_info); images = device.get_handle().getSwapchainImagesKHR(handle); + + if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME) && + vk::ImageCompressionFlagBitsEXT::eFixedRateDefault == requested_compression) + { + // Check if fixed-rate compression was applied + const auto applied_compression_fixed_rate = vkb::common::query_applied_compression(device.get_handle(), images[0]).imageCompressionFixedRateFlags; + + if (applied_compression_fixed_rate != requested_compression_fixed_rate) + { + LOGW("(Swapchain) Requested fixed-rate compression ({}) was not applied, instead images use {}", + vk::to_string(requested_compression_fixed_rate), + vk::to_string(applied_compression_fixed_rate)); + + this->requested_compression_fixed_rate = applied_compression_fixed_rate; + + if (vk::ImageCompressionFixedRateFlagBitsEXT::eNone == applied_compression_fixed_rate) + { + this->requested_compression = vk::ImageCompressionFlagBitsEXT::eDefault; + } + } + else + { + LOGI("(Swapchain) Applied fixed-rate compression: {}", vk::to_string(applied_compression_fixed_rate)); + } + } } HPPSwapchain::~HPPSwapchain() @@ -370,7 +468,7 @@ bool HPPSwapchain::is_valid() const return !!handle; } -HPPDevice const &HPPSwapchain::get_device() const +vkb::core::DeviceCpp const &HPPSwapchain::get_device() const { return device; } diff --git a/framework/core/hpp_swapchain.h b/framework/core/hpp_swapchain.h index 60a9780e45..a5505bd206 100644 --- a/framework/core/hpp_swapchain.h +++ b/framework/core/hpp_swapchain.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,6 +17,7 @@ #pragma once +#include "common/vk_common.h" #include #include @@ -24,7 +25,9 @@ namespace vkb { namespace core { -class HPPDevice; +template +class Device; +using DeviceCpp = Device; struct HPPSwapchainProperties { @@ -66,20 +69,47 @@ class HPPSwapchain */ HPPSwapchain(HPPSwapchain &swapchain, const vk::Extent2D &extent, const vk::SurfaceTransformFlagBitsKHR transform); + /** + * @brief Constructor to create a swapchain by changing the compression settings + * only and preserving the configuration from the old swapchain. + */ + HPPSwapchain(HPPSwapchain &swapchain, + const vk::ImageCompressionFlagsEXT requested_compression, + const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate); + /** * @brief Constructor to create a swapchain. */ - HPPSwapchain(HPPDevice &device, - vk::SurfaceKHR surface, - const vk::PresentModeKHR present_mode, - const std::vector &present_mode_priority_list = {vk::PresentModeKHR::eFifo, vk::PresentModeKHR::eMailbox}, - const std::vector &surface_format_priority_list = {{vk::Format::eR8G8B8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}, - {vk::Format::eB8G8R8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}}, - const vk::Extent2D &extent = {}, - const uint32_t image_count = 3, - const vk::SurfaceTransformFlagBitsKHR transform = vk::SurfaceTransformFlagBitsKHR::eIdentity, - const std::set &image_usage_flags = {vk::ImageUsageFlagBits::eColorAttachment, vk::ImageUsageFlagBits::eTransferSrc}, - vk::SwapchainKHR old_swapchain = nullptr); + HPPSwapchain(vkb::core::DeviceCpp &device, + vk::SurfaceKHR surface, + const vk::PresentModeKHR present_mode, + const std::vector &present_mode_priority_list = {vk::PresentModeKHR::eFifo, vk::PresentModeKHR::eMailbox}, + const std::vector &surface_format_priority_list = {{vk::Format::eR8G8B8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}, + {vk::Format::eB8G8R8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}}, + const vk::Extent2D &extent = {}, + const uint32_t image_count = 3, + const vk::SurfaceTransformFlagBitsKHR transform = vk::SurfaceTransformFlagBitsKHR::eIdentity, + const std::set &image_usage_flags = {vk::ImageUsageFlagBits::eColorAttachment, vk::ImageUsageFlagBits::eTransferSrc}, + const vk::ImageCompressionFlagsEXT requested_compression = vk::ImageCompressionFlagBitsEXT::eDefault, + const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate = vk::ImageCompressionFixedRateFlagBitsEXT::eNone); + + /** + * @brief Constructor to create a swapchain from the old swapchain + * by configuring all parameters. + */ + HPPSwapchain(HPPSwapchain &old_swapchain, + vkb::core::DeviceCpp &device, + vk::SurfaceKHR surface, + const vk::PresentModeKHR present_mode, + const std::vector &present_mode_priority_list = {vk::PresentModeKHR::eFifo, vk::PresentModeKHR::eMailbox}, + const std::vector &surface_format_priority_list = {{vk::Format::eR8G8B8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}, + {vk::Format::eB8G8R8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}}, + const vk::Extent2D &extent = {}, + const uint32_t image_count = 3, + const vk::SurfaceTransformFlagBitsKHR transform = vk::SurfaceTransformFlagBitsKHR::eIdentity, + const std::set &image_usage_flags = {vk::ImageUsageFlagBits::eColorAttachment, vk::ImageUsageFlagBits::eTransferSrc}, + const vk::ImageCompressionFlagsEXT requested_compression = vk::ImageCompressionFlagBitsEXT::eDefault, + const vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate = vk::ImageCompressionFixedRateFlagBitsEXT::eNone); HPPSwapchain(const HPPSwapchain &) = delete; @@ -93,7 +123,7 @@ class HPPSwapchain bool is_valid() const; - HPPDevice const &get_device() const; + vkb::core::DeviceCpp const &get_device() const; vk::SwapchainKHR get_handle() const; @@ -114,7 +144,7 @@ class HPPSwapchain vk::PresentModeKHR get_present_mode() const; private: - HPPDevice &device; + vkb::core::DeviceCpp &device; vk::SurfaceKHR surface; @@ -131,6 +161,10 @@ class HPPSwapchain std::vector surface_format_priority_list; std::set image_usage_flags; + + vk::ImageCompressionFlagsEXT requested_compression{vk::ImageCompressionFlagBitsEXT::eDefault}; + + vk::ImageCompressionFixedRateFlagsEXT requested_compression_fixed_rate{vk::ImageCompressionFixedRateFlagBitsEXT::eNone}; }; } // namespace core } // namespace vkb diff --git a/framework/core/image.h b/framework/core/image.h index 8e6e086267..40f9df9336 100644 --- a/framework/core/image.h +++ b/framework/core/image.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -27,18 +27,19 @@ namespace vkb { -class Device; - namespace core { +template +class Device; +using DeviceC = Device; class Image; using ImagePtr = std::unique_ptr; -struct ImageBuilder : public vkb::BuilderBaseC +struct ImageBuilder : public vkb::allocated::BuilderBaseC { private: - using Parent = vkb::BuilderBaseC; + using Parent = vkb::allocated::BuilderBaseC; public: ImageBuilder(VkExtent3D const &extent) : @@ -116,15 +117,16 @@ struct ImageBuilder : public vkb::BuilderBaseC return *this; } - Image build(Device &device) const; - ImagePtr build_unique(Device &device) const; + Image build(Device &device) const; + ImagePtr build_unique(Device &device) const; }; class ImageView; -class Image : public allocated::Allocated + +class Image : public vkb::allocated::AllocatedC { public: - Image(vkb::Device &device, + Image(vkb::core::DeviceC &device, VkImage handle, const VkExtent3D &extent, VkFormat format, @@ -133,7 +135,7 @@ class Image : public allocated::Allocated // [[deprecated("Use the ImageBuilder ctor instead")]] Image( - vkb::Device &device, + vkb::core::DeviceC &device, const VkExtent3D &extent, VkFormat format, VkImageUsageFlags image_usage, @@ -146,7 +148,7 @@ class Image : public allocated::Allocated uint32_t num_queue_families = 0, const uint32_t *queue_families = nullptr); - Image(Device &device, ImageBuilder const &builder); + Image(vkb::core::DeviceC &device, ImageBuilder const &builder); Image(const Image &) = delete; diff --git a/framework/core/image_core.cpp b/framework/core/image_core.cpp index 53ad876180..bf008f9559 100644 --- a/framework/core/image_core.cpp +++ b/framework/core/image_core.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -68,17 +68,17 @@ inline VkImageType find_image_type(VkExtent3D extent) namespace core { -Image ImageBuilder::build(Device &device) const +Image ImageBuilder::build(vkb::core::DeviceC &device) const { return Image(device, *this); } -ImagePtr ImageBuilder::build_unique(Device &device) const +ImagePtr ImageBuilder::build_unique(vkb::core::DeviceC &device) const { return std::make_unique(device, *this); } -Image::Image(vkb::Device &device, +Image::Image(vkb::core::DeviceC &device, const VkExtent3D &extent, VkFormat format, VkImageUsageFlags image_usage, @@ -107,8 +107,8 @@ Image::Image(vkb::Device &device, { } -Image::Image(vkb::Device &device, ImageBuilder const &builder) : - Allocated{builder.get_allocation_create_info(), VK_NULL_HANDLE, &device}, create_info(builder.get_create_info()) +Image::Image(vkb::core::DeviceC &device, ImageBuilder const &builder) : + vkb::allocated::AllocatedC{builder.get_allocation_create_info(), VK_NULL_HANDLE, &device}, create_info(builder.get_create_info()) { set_handle(create_image(create_info)); subresource.arrayLayer = create_info.arrayLayers; @@ -119,8 +119,9 @@ Image::Image(vkb::Device &device, ImageBuilder const &builder) : } } -Image::Image(Device &device, VkImage handle, const VkExtent3D &extent, VkFormat format, VkImageUsageFlags image_usage, VkSampleCountFlagBits sample_count) : - Allocated{handle, &device} +Image::Image( + vkb::core::DeviceC &device, VkImage handle, const VkExtent3D &extent, VkFormat format, VkImageUsageFlags image_usage, VkSampleCountFlagBits sample_count) : + vkb::allocated::AllocatedC{handle, &device} { create_info.extent = extent; create_info.imageType = find_image_type(extent); @@ -131,11 +132,9 @@ Image::Image(Device &device, VkImage handle, const VkExtent3D &extent, VkFormat subresource.mipLevel = create_info.mipLevels = 1; } -Image::Image(Image &&other) noexcept : - Allocated{std::move(other)}, - create_info{std::exchange(other.create_info, {})}, - subresource{std::exchange(other.subresource, {})}, - views(std::exchange(other.views, {})) +Image::Image(Image &&other) noexcept + : + vkb::allocated::AllocatedC{std::move(other)}, create_info{std::exchange(other.create_info, {})}, subresource{std::exchange(other.subresource, {})}, views(std::exchange(other.views, {})) { // Update image views references to this image to avoid dangling pointers for (auto &view : views) diff --git a/framework/core/image_view.h b/framework/core/image_view.h index 5124e75fff..876faaaf84 100644 --- a/framework/core/image_view.h +++ b/framework/core/image_view.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -19,13 +19,14 @@ #include "common/helpers.h" #include "common/vk_common.h" -#include "core/image.h" #include "core/vulkan_resource.h" namespace vkb { namespace core { +class Image; + class ImageView : public vkb::core::VulkanResourceC { public: diff --git a/framework/core/instance.cpp b/framework/core/instance.cpp deleted file mode 100644 index 42e0886d0f..0000000000 --- a/framework/core/instance.cpp +++ /dev/null @@ -1,551 +0,0 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "physical_device.h" - -#include "instance.h" - -#include -#include - -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) -# define USE_VALIDATION_LAYERS -#endif - -#if defined(USE_VALIDATION_LAYERS) && (defined(VKB_VALIDATION_LAYERS_GPU_ASSISTED) || defined(VKB_VALIDATION_LAYERS_BEST_PRACTICES) || defined(VKB_VALIDATION_LAYERS_SYNCHRONIZATION)) -# define USE_VALIDATION_LAYER_FEATURES -#endif - -namespace vkb -{ -namespace -{ -#ifdef USE_VALIDATION_LAYERS - -VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_type, - const VkDebugUtilsMessengerCallbackDataEXT *callback_data, - void *user_data) -{ - // Log debug message - if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) - { - LOGW("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); - } - else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) - { - LOGE("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); - } - return VK_FALSE; -} - -static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT /*type*/, - uint64_t /*object*/, size_t /*location*/, int32_t /*message_code*/, - const char *layer_prefix, const char *message, void * /*user_data*/) -{ - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) - { - LOGE("{}: {}", layer_prefix, message); - } - else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) - { - LOGW("{}: {}", layer_prefix, message); - } - else if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) - { - LOGW("{}: {}", layer_prefix, message); - } - else - { - LOGI("{}: {}", layer_prefix, message); - } - return VK_FALSE; -} -#endif - -bool validate_layers(const std::vector &required, - const std::vector &available) -{ - for (auto layer : required) - { - bool found = false; - for (auto &available_layer : available) - { - if (strcmp(available_layer.layerName, layer) == 0) - { - found = true; - break; - } - } - - if (!found) - { - LOGE("Validation Layer {} not found", layer); - return false; - } - } - - return true; -} -} // namespace - -std::vector get_optimal_validation_layers(const std::vector &supported_instance_layers) -{ - std::vector> validation_layer_priority_list = - { - // The preferred validation layer is "VK_LAYER_KHRONOS_validation" - {"VK_LAYER_KHRONOS_validation"}, - - // Otherwise we fallback to using the LunarG meta layer - {"VK_LAYER_LUNARG_standard_validation"}, - - // Otherwise we attempt to enable the individual layers that compose the LunarG meta layer since it doesn't exist - { - "VK_LAYER_GOOGLE_threading", - "VK_LAYER_LUNARG_parameter_validation", - "VK_LAYER_LUNARG_object_tracker", - "VK_LAYER_LUNARG_core_validation", - "VK_LAYER_GOOGLE_unique_objects", - }, - - // Otherwise as a last resort we fallback to attempting to enable the LunarG core layer - {"VK_LAYER_LUNARG_core_validation"}}; - - for (auto &validation_layers : validation_layer_priority_list) - { - if (validate_layers(validation_layers, supported_instance_layers)) - { - return validation_layers; - } - - LOGW("Couldn't enable validation layers (see log for error) - falling back"); - } - - // Else return nothing - return {}; -} - -Optional Instance::selected_gpu_index; - -namespace -{ -bool enable_extension(const char *required_ext_name, - const std::vector &available_exts, - std::vector &enabled_extensions) -{ - for (auto &avail_ext_it : available_exts) - { - if (strcmp(avail_ext_it.extensionName, required_ext_name) == 0) - { - auto it = std::find_if(enabled_extensions.begin(), enabled_extensions.end(), - [required_ext_name](const char *enabled_ext_name) { - return strcmp(enabled_ext_name, required_ext_name) == 0; - }); - if (it != enabled_extensions.end()) - { - // Extension is already enabled - } - else - { - LOGI("Extension {} found, enabling it", required_ext_name); - enabled_extensions.emplace_back(required_ext_name); - } - return true; - } - } - - LOGI("Extension {} not found", required_ext_name); - return false; -} - -bool enable_all_extensions(const std::vector required_ext_names, - const std::vector &available_exts, - std::vector &enabled_extensions) -{ - using std::placeholders::_1; - - return std::all_of(required_ext_names.begin(), required_ext_names.end(), - std::bind(enable_extension, _1, available_exts, enabled_extensions)); -} - -} // namespace - -Instance::Instance(const std::string &application_name, - const std::unordered_map &required_extensions, - const std::vector &required_validation_layers, - const std::vector &required_layer_settings, - uint32_t api_version) -{ - uint32_t instance_extension_count; - VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, nullptr)); - - std::vector available_instance_extensions(instance_extension_count); - VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, available_instance_extensions.data())); - -#ifdef USE_VALIDATION_LAYERS - // Check if VK_EXT_debug_utils is supported, which supersedes VK_EXT_Debug_Report - const bool has_debug_utils = enable_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, - available_instance_extensions, enabled_extensions); - bool has_debug_report = false; - - if (!has_debug_utils) - { - has_debug_report = enable_extension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, - available_instance_extensions, enabled_extensions); - if (!has_debug_report) - { - LOGW("Neither of {} or {} are available; disabling debug reporting", - VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_EXTENSION_NAME); - } - } -#endif - -#if (defined(VKB_ENABLE_PORTABILITY)) - enable_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, available_instance_extensions, enabled_extensions); - bool portability_enumeration_available = enable_extension(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, available_instance_extensions, enabled_extensions); -#endif - -#ifdef USE_VALIDATION_LAYER_FEATURES - bool validation_features = false; - { - uint32_t layer_instance_extension_count; - VK_CHECK(vkEnumerateInstanceExtensionProperties("VK_LAYER_KHRONOS_validation", &layer_instance_extension_count, nullptr)); - - std::vector available_layer_instance_extensions(layer_instance_extension_count); - VK_CHECK(vkEnumerateInstanceExtensionProperties("VK_LAYER_KHRONOS_validation", &layer_instance_extension_count, available_layer_instance_extensions.data())); - - for (auto &available_extension : available_layer_instance_extensions) - { - if (strcmp(available_extension.extensionName, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME) == 0) - { - validation_features = true; - LOGI("{} is available, enabling it", VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME); - enabled_extensions.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME); - } - } - } -#endif - - // Specific surface extensions are obtained from Window::get_required_surface_extensions - // They are already added to required_extensions by VulkanSample::prepare - - // Even for a headless surface a swapchain is still required - enabled_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); - - // VK_KHR_get_physical_device_properties2 is a prerequisite of VK_KHR_performance_query - // which will be used for stats gathering where available. - enable_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, - available_instance_extensions, enabled_extensions); - - auto extension_error = false; - for (auto extension : required_extensions) - { - auto extension_name = extension.first; - auto extension_is_optional = extension.second; - if (!enable_extension(extension_name, available_instance_extensions, enabled_extensions)) - { - if (extension_is_optional) - { - LOGW("Optional instance extension {} not available, some features may be disabled", extension_name); - } - else - { - LOGE("Required instance extension {} not available, cannot run", extension_name); - extension_error = true; - } - extension_error = extension_error || !extension_is_optional; - } - } - - if (extension_error) - { - throw std::runtime_error("Required instance extensions are missing."); - } - - uint32_t instance_layer_count; - VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr)); - - std::vector supported_validation_layers(instance_layer_count); - VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_validation_layers.data())); - - std::vector requested_validation_layers(required_validation_layers); - -#ifdef USE_VALIDATION_LAYERS - // Determine the optimal validation layers to enable that are necessary for useful debugging - std::vector optimal_validation_layers = get_optimal_validation_layers(supported_validation_layers); - requested_validation_layers.insert(requested_validation_layers.end(), optimal_validation_layers.begin(), optimal_validation_layers.end()); -#endif - - if (validate_layers(requested_validation_layers, supported_validation_layers)) - { - LOGI("Enabled Validation Layers:") - for (const auto &layer : requested_validation_layers) - { - LOGI(" \t{}", layer); - } - } - else - { - throw std::runtime_error("Required validation layers are missing."); - } - - VkApplicationInfo app_info{VK_STRUCTURE_TYPE_APPLICATION_INFO}; - - app_info.pApplicationName = application_name.c_str(); - app_info.applicationVersion = 0; - app_info.pEngineName = "Vulkan Samples"; - app_info.engineVersion = 0; - app_info.apiVersion = api_version; - - VkInstanceCreateInfo instance_info = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; - - instance_info.pApplicationInfo = &app_info; - - instance_info.enabledExtensionCount = to_u32(enabled_extensions.size()); - instance_info.ppEnabledExtensionNames = enabled_extensions.data(); - - instance_info.enabledLayerCount = to_u32(requested_validation_layers.size()); - instance_info.ppEnabledLayerNames = requested_validation_layers.data(); - -#ifdef USE_VALIDATION_LAYERS - VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; - VkDebugReportCallbackCreateInfoEXT debug_report_create_info = {VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT}; - if (has_debug_utils) - { - debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; - debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; - debug_utils_create_info.pfnUserCallback = debug_utils_messenger_callback; - - instance_info.pNext = &debug_utils_create_info; - } - else if (has_debug_report) - { - debug_report_create_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; - debug_report_create_info.pfnCallback = debug_callback; - - instance_info.pNext = &debug_report_create_info; - } -#endif - -#if (defined(VKB_ENABLE_PORTABILITY)) - if (portability_enumeration_available) - { - instance_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; - } -#endif - - // Some of the specialized layers need to be enabled explicitly -#ifdef USE_VALIDATION_LAYER_FEATURES - VkValidationFeaturesEXT validation_features_info = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT}; - std::vector enable_features{}; - if (validation_features) - { -# if defined(VKB_VALIDATION_LAYERS_GPU_ASSISTED) - enable_features.push_back(VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT); - enable_features.push_back(VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT); -# endif -# if defined(VKB_VALIDATION_LAYERS_BEST_PRACTICES) - enable_features.push_back(VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT); -# endif -# if defined(VKB_VALIDATION_LAYERS_SYNCHRONIZATION) - enable_features.push_back(VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT); -# endif - validation_features_info.enabledValidationFeatureCount = static_cast(enable_features.size()); - validation_features_info.pEnabledValidationFeatures = enable_features.data(); - validation_features_info.pNext = instance_info.pNext; - instance_info.pNext = &validation_features_info; - } -#endif - - VkLayerSettingsCreateInfoEXT layerSettingsCreateInfo{VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT}; - - // If layer settings extension enabled by sample, then activate layer settings during instance creation - if (std::find(enabled_extensions.begin(), enabled_extensions.end(), VK_EXT_LAYER_SETTINGS_EXTENSION_NAME) != enabled_extensions.end()) - { - layerSettingsCreateInfo.settingCount = static_cast(required_layer_settings.size()); - layerSettingsCreateInfo.pSettings = required_layer_settings.data(); - layerSettingsCreateInfo.pNext = instance_info.pNext; - instance_info.pNext = &layerSettingsCreateInfo; - } - - // Create the Vulkan instance - VkResult result = vkCreateInstance(&instance_info, nullptr, &handle); - - if (result != VK_SUCCESS) - { - throw VulkanException(result, "Could not create Vulkan instance"); - } - - volkLoadInstance(handle); - -#ifdef USE_VALIDATION_LAYERS - if (has_debug_utils) - { - result = vkCreateDebugUtilsMessengerEXT(handle, &debug_utils_create_info, nullptr, &debug_utils_messenger); - if (result != VK_SUCCESS) - { - throw VulkanException(result, "Could not create debug utils messenger"); - } - } - else if (has_debug_report) - { - result = vkCreateDebugReportCallbackEXT(handle, &debug_report_create_info, nullptr, &debug_report_callback); - if (result != VK_SUCCESS) - { - throw VulkanException(result, "Could not create debug report callback"); - } - } -#endif - - query_gpus(); -} - -Instance::Instance(VkInstance instance, - const std::vector &externally_enabled_extensions) : - handle{instance} -{ - // Some parts of the framework will check for certain extensions to be enabled - // To make those work we need to copy over externally enabled extensions into this class - for (auto extension : externally_enabled_extensions) - { - enabled_extensions.push_back(extension); - } - - if (handle != VK_NULL_HANDLE) - { - query_gpus(); - } - else - { - throw std::runtime_error("Instance not valid"); - } -} - -Instance::~Instance() -{ -#ifdef USE_VALIDATION_LAYERS - if (debug_utils_messenger != VK_NULL_HANDLE) - { - vkDestroyDebugUtilsMessengerEXT(handle, debug_utils_messenger, nullptr); - } - if (debug_report_callback != VK_NULL_HANDLE) - { - vkDestroyDebugReportCallbackEXT(handle, debug_report_callback, nullptr); - } -#endif - - if (handle != VK_NULL_HANDLE) - { - vkDestroyInstance(handle, nullptr); - } -} - -void Instance::query_gpus() -{ - // Querying valid physical devices on the machine - uint32_t physical_device_count{0}; - VK_CHECK(vkEnumeratePhysicalDevices(handle, &physical_device_count, nullptr)); - - if (physical_device_count < 1) - { - throw std::runtime_error("Couldn't find a physical device that supports Vulkan."); - } - - std::vector physical_devices; - physical_devices.resize(physical_device_count); - VK_CHECK(vkEnumeratePhysicalDevices(handle, &physical_device_count, physical_devices.data())); - - // Create gpus wrapper objects from the VkPhysicalDevice's - for (auto &physical_device : physical_devices) - { - gpus.push_back(std::make_unique(*this, physical_device)); - } -} - -PhysicalDevice &Instance::get_first_gpu() -{ - assert(!gpus.empty() && "No physical devices were found on the system."); - - // Find a discrete GPU - for (auto &gpu : gpus) - { - if (gpu->get_properties().deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - { - return *gpu; - } - } - - // Otherwise just pick the first one - LOGW("Couldn't find a discrete physical device, picking default GPU"); - return *gpus[0]; -} - -PhysicalDevice &Instance::get_suitable_gpu(VkSurfaceKHR surface, bool headless_surface) -{ - assert(!gpus.empty() && "No physical devices were found on the system."); - - // A GPU can be explicitly selected via the command line (see plugins/gpu_selection.cpp), this overrides the below GPU selection algorithm - if (selected_gpu_index.has_value()) - { - LOGI("Explicitly selecting GPU {}", selected_gpu_index.value()); - if (selected_gpu_index.value() > gpus.size() - 1) - { - throw std::runtime_error("Selected GPU index is not within no. of available GPUs"); - } - return *gpus[selected_gpu_index.value()]; - } - if (headless_surface) - { - LOGW("Using headless surface with multiple GPUs. Considered explicitly selecting the target GPU.") - } - - // Find a discrete GPU - for (auto &gpu : gpus) - { - if (gpu->get_properties().deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - { - // See if it work with the surface - size_t queue_count = gpu->get_queue_family_properties().size(); - for (uint32_t queue_idx = 0; static_cast(queue_idx) < queue_count; queue_idx++) - { - if (gpu->is_present_supported(surface, queue_idx)) - { - return *gpu; - } - } - } - } - - // Otherwise just pick the first one - LOGW("Couldn't find a discrete physical device, picking default GPU"); - return *gpus[0]; -} - -bool Instance::is_enabled(const char *extension) const -{ - return std::find_if(enabled_extensions.begin(), enabled_extensions.end(), [extension](const char *enabled_extension) { return strcmp(extension, enabled_extension) == 0; }) != enabled_extensions.end(); -} - -VkInstance Instance::get_handle() const -{ - return handle; -} - -const std::vector &Instance::get_extensions() -{ - return enabled_extensions; -} -} // namespace vkb diff --git a/framework/core/instance.h b/framework/core/instance.h index d4a1c9f47b..4f4781f574 100644 --- a/framework/core/instance.h +++ b/framework/core/instance.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,71 +18,93 @@ #pragma once -#include "common/helpers.h" -#include "common/optional.h" #include "common/vk_common.h" +#include +#include + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) +# define USE_VALIDATION_LAYERS +#endif + +#if defined(USE_VALIDATION_LAYERS) && \ + (defined(VKB_VALIDATION_LAYERS_GPU_ASSISTED) || defined(VKB_VALIDATION_LAYERS_BEST_PRACTICES) || defined(VKB_VALIDATION_LAYERS_SYNCHRONIZATION)) +# define USE_VALIDATION_LAYER_FEATURES +#endif namespace vkb { +namespace core +{ +template class PhysicalDevice; -/** - * @brief Returns a list of Khronos/LunarG supported validation layers - * Attempting to enable them in order of preference, starting with later Vulkan SDK versions - * @param supported_instance_layers A list of validation layers to check against - */ -std::vector get_optimal_validation_layers(const std::vector &supported_instance_layers); +using PhysicalDeviceC = PhysicalDevice; +using PhysicalDeviceCpp = PhysicalDevice; /** - * @brief A wrapper class for VkInstance + * @brief A wrapper class for InstanceType * - * This class is responsible for initializing volk, enumerating over all available extensions and validation layers + * This class is responsible for initializing the dispatcher, enumerating over all available extensions and validation layers * enabling them if they exist, setting up debug messaging and querying all the physical devices existing on the machine. */ +template class Instance { + public: + using InstanceType = typename std::conditional::type; + using SurfaceType = typename std::conditional::type; + public: /** * @brief Can be set from the GPU selection plugin to explicitly select a GPU instead */ - static Optional selected_gpu_index; + inline static uint32_t selected_gpu_index = ~0; /** * @brief Initializes the connection to Vulkan * @param application_name The name of the application - * @param required_extensions The extensions requested to be enabled - * @param required_validation_layers The validation layers to be enabled - * @param required_layer_settings The layer settings to be enabled + * @param requested_extensions The extensions requested to be enabled + * @param requested_layers The validation layers to be enabled + * @param requested_layer_settings The layer settings to be enabled * @param api_version The Vulkan API version that the instance will be using * @throws runtime_error if the required extensions and validation layers are not found */ - Instance(const std::string &application_name, - const std::unordered_map &required_extensions = {}, - const std::vector &required_validation_layers = {}, - const std::vector &required_layer_settings = {}, - uint32_t api_version = VK_API_VERSION_1_0); + Instance(std::string const &application_name, + std::unordered_map const &requested_extensions = {}, + std::unordered_map const &requested_layers = {}, + const std::vector &requested_layer_settings = {}, + uint32_t api_version = VK_API_VERSION_1_1); + Instance(std::string const &application_name, + std::unordered_map const &requested_extensions, + std::unordered_map const &requested_layers, + std::vector const &requested_layer_settings, + uint32_t api_version = VK_API_VERSION_1_1); /** - * @brief Queries the GPUs of a VkInstance that is already created - * @param instance A valid VkInstance + * @brief Queries the GPUs of a InstanceType that is already created + * @param instance A valid InstanceType * @param externally_enabled_extensions List of extensions that have been enabled, used for following checks e.g. during device creation + * @param needsToInitializeDispatcher If the sample uses the C-bindings and some "non-standard" initialization, the dispatcher needs to be initialized */ - Instance(VkInstance instance, - const std::vector &externally_enabled_extensions = {}); - - Instance(const Instance &) = delete; + Instance(vk::Instance instance, const std::vector &externally_enabled_extensions = {}, bool needsToInitializeDispatcher = false); + Instance(VkInstance instance, const std::vector &externally_enabled_extensions = {}); - Instance(Instance &&) = delete; + Instance(Instance const &) = delete; + Instance(Instance &&) = delete; ~Instance(); - Instance &operator=(const Instance &) = delete; + Instance &operator=(Instance const &) = delete; + Instance &operator=(Instance &&) = delete; - Instance &operator=(Instance &&) = delete; + const std::vector &get_extensions(); /** - * @brief Queries the instance for the physical devices on the machine + * @brief Tries to find the first available discrete GPU + * @returns A valid physical device */ - void query_gpus(); + PhysicalDevice &get_first_gpu(); + + InstanceType get_handle() const; /** * @brief Tries to find the first available discrete GPU that can render to the given surface @@ -89,64 +112,657 @@ class Instance * @param headless_surface Is surface created with VK_EXT_headless_surface * @returns A valid physical device */ - PhysicalDevice &get_suitable_gpu(VkSurfaceKHR surface, bool headless_surface); + PhysicalDevice &get_suitable_gpu(SurfaceType surface, bool headless_surface); /** - * @brief Tries to find the first available discrete GPU - * @returns A valid physical device + * @brief Checks if the given extension is enabled in the InstanceType + * @param extension An extension to check */ - PhysicalDevice &get_first_gpu(); + bool is_enabled(char const *extension) const; + private: /** - * @brief Checks if the given extension is enabled in the VkInstance - * @param extension An extension to check + * @brief Queries the instance for the physical devices on the machine */ - bool is_enabled(const char *extension) const; + void query_gpus(); - VkInstance get_handle() const; + private: + std::vector enabled_extensions; // The enabled extensions + std::vector> gpus; // The physical devices found on the machine + vk::Instance handle; // The Vulkan instance - const std::vector &get_extensions(); +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + vk::DebugReportCallbackEXT debug_report_callback; // The debug report callback + vk::DebugUtilsMessengerEXT debug_utils_messenger; // Debug utils messenger callback for VK_EXT_Debug_Utils +#endif +}; - /** - * @brief Returns a const ref to the properties of all requested layers in this instance - * @returns The VkLayerProperties for all requested layers in this instance - */ - const std::vector &get_layer_properties(); +using InstanceC = Instance; +using InstanceCpp = Instance; +} // namespace core +} // namespace vkb - /** - * @brief Finds layer properties for the layer with the given name - * @param layerName The layer to search for - * @param properties A reference to a VkLayerProperties struct to populate - * @returns True if the layer was found and populated, false otherwise - */ - bool get_layer_properties(const char *layerName, VkLayerProperties &properties); +#include "core/physical_device.h" - private: - /** - * @brief The Vulkan instance - */ - VkInstance handle{VK_NULL_HANDLE}; +namespace vkb +{ +namespace core +{ +namespace +{ +#ifdef USE_VALIDATION_LAYERS +inline VKAPI_ATTR vk::Bool32 VKAPI_CALL debug_utils_messenger_callback(vk::DebugUtilsMessageSeverityFlagBitsEXT message_severity, + vk::DebugUtilsMessageTypeFlagsEXT message_type, + vk::DebugUtilsMessengerCallbackDataEXT const *callback_data, + void *user_data) +{ + // Log debug message + if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) + { + LOGW("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) + { + LOGE("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + return false; +} - /** - * @brief The enabled extensions - */ - std::vector enabled_extensions; +inline VKAPI_ATTR vk::Bool32 VKAPI_CALL debug_callback(vk::DebugReportFlagsEXT flags, + vk::DebugReportObjectTypeEXT /*type*/, + uint64_t /*object*/, + size_t /*location*/, + int32_t /*message_code*/, + char const *layer_prefix, + char const *message, + void * /*user_data*/) +{ + if (flags & vk::DebugReportFlagBitsEXT::eError) + { + LOGE("{}: {}", layer_prefix, message); + } + else if (flags & vk::DebugReportFlagBitsEXT::eWarning) + { + LOGW("{}: {}", layer_prefix, message); + } + else if (flags & vk::DebugReportFlagBitsEXT::ePerformanceWarning) + { + LOGW("{}: {}", layer_prefix, message); + } + else + { + LOGI("{}: {}", layer_prefix, message); + } + return false; +} +#endif -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) - /** - * @brief Debug utils messenger callback for VK_EXT_Debug_Utils - */ - VkDebugUtilsMessengerEXT debug_utils_messenger{VK_NULL_HANDLE}; +inline bool enable_extension(char const *requested_extension, + std::vector const &available_extensions, + std::vector &enabled_extensions) +{ + bool is_available = std::ranges::any_of(available_extensions, + [&requested_extension](auto const &available_extension) { return strcmp(requested_extension, available_extension.extensionName) == 0; }); + if (is_available) + { + bool is_already_enabled = std::ranges::any_of( + enabled_extensions, [&requested_extension](auto const &enabled_extension) { return strcmp(requested_extension, enabled_extension) == 0; }); + if (!is_already_enabled) + { + LOGI("Extension {} available, enabling it", requested_extension); + enabled_extensions.emplace_back(requested_extension); + } + } + else + { + LOGI("Extension {} not available", requested_extension); + } - /** - * @brief The debug report callback - */ - VkDebugReportCallbackEXT debug_report_callback{VK_NULL_HANDLE}; + return is_available; +} + +inline bool enable_layer(char const *requested_layer, std::vector const &available_layers, std::vector &enabled_layers) +{ + bool is_available = std::ranges::any_of( + available_layers, [&requested_layer](auto const &available_layer) { return strcmp(requested_layer, available_layer.layerName) == 0; }); + if (is_available) + { + bool is_already_enabled = + std::ranges::any_of(enabled_layers, [&requested_layer](auto const &enabled_layer) { return strcmp(requested_layer, enabled_layer) == 0; }); + if (!is_already_enabled) + { + LOGI("Layer {} available, enabling it", requested_layer); + enabled_layers.emplace_back(requested_layer); + } + } + else + { + LOGI("Layer {} not available", requested_layer); + } + + return is_available; +} + +inline bool enable_layer_setting(vk::LayerSettingEXT const &requested_layer_setting, + std::vector const &enabled_layers, + std::vector &enabled_layer_settings) +{ + // We are checking if the layer is available. + // Vulkan does not provide a reflection API for layer settings. Layer settings are described in each layer JSON manifest. + bool is_available = std::ranges::any_of( + enabled_layers, [&requested_layer_setting](auto const &available_layer) { return strcmp(available_layer, requested_layer_setting.pLayerName) == 0; }); +#if defined(PLATFORM__MACOS) + // On Apple platforms the MoltenVK layer is implicitly enabled and available, and cannot be explicitly added or checked via enabled_layers. + is_available = is_available || strcmp(requested_layer_setting.pLayerName, "MoltenVK") == 0; #endif - /** - * @brief The physical devices found on the machine - */ - std::vector> gpus; -}; // namespace Instance + if (!is_available) + { + LOGW("Layer: {} not found. Disabling layer setting: {}", requested_layer_setting.pLayerName, requested_layer_setting.pSettingName); + return false; + } + + bool is_already_enabled = std::ranges::any_of(enabled_layer_settings, + [&requested_layer_setting](VkLayerSettingEXT const &enabled_layer_setting) { + return (strcmp(requested_layer_setting.pLayerName, enabled_layer_setting.pLayerName) == 0) && + (strcmp(requested_layer_setting.pSettingName, enabled_layer_setting.pSettingName) == 0); + }); + + if (is_already_enabled) + { + LOGW("Ignoring duplicated layer setting {} in layer {}.", requested_layer_setting.pSettingName, requested_layer_setting.pLayerName); + return false; + } + + LOGI("Enabling layer setting {} in layer {}.", requested_layer_setting.pSettingName, requested_layer_setting.pLayerName); + enabled_layer_settings.push_back(requested_layer_setting); + return true; +} + +inline bool enable_layer_setting(VkLayerSettingEXT const &requested_layer_setting, + std::vector const &enabled_layers, + std::vector &enabled_layer_settings) +{ + return enable_layer_setting(reinterpret_cast(requested_layer_setting), enabled_layers, enabled_layer_settings); +} + +inline bool validate_layers(std::vector const &required, std::vector const &available) +{ + for (auto layer : required) + { + bool found = false; + for (auto &available_layer : available) + { + if (strcmp(available_layer.layerName, layer) == 0) + { + found = true; + break; + } + } + + if (!found) + { + LOGE("Validation Layer {} not found", layer); + return false; + } + } + + return true; +} +} // namespace + +template +inline Instance::Instance(std::string const &application_name, + std::unordered_map const &requested_extensions, + std::unordered_map const &requested_layers, + std::vector const &requested_layer_settings, + uint32_t api_version) +{ + std::vector available_instance_extensions = vk::enumerateInstanceExtensionProperties(); + +#ifdef USE_VALIDATION_LAYERS + // Check if VK_EXT_debug_utils is supported, which supersedes VK_EXT_Debug_Report + const bool has_debug_utils = enable_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, available_instance_extensions, enabled_extensions); + bool has_debug_report = false; + + if (!has_debug_utils) + { + has_debug_report = enable_extension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, available_instance_extensions, enabled_extensions); + if (!has_debug_report) + { + LOGW("Neither of {} or {} are available; disabling debug reporting", VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_EXTENSION_NAME); + } + } +#endif + +#if (defined(VKB_ENABLE_PORTABILITY)) + enable_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, available_instance_extensions, enabled_extensions); + bool portability_enumeration_available = enable_extension(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, available_instance_extensions, enabled_extensions); +#endif + +#ifdef USE_VALIDATION_LAYERS + const char *validation_layer_name = "VK_LAYER_KHRONOS_validation"; +# ifdef USE_VALIDATION_LAYER_FEATURES + bool validation_features = false; + { + std::vector available_layer_instance_extensions = vk::enumerateInstanceExtensionProperties(std::string(validation_layer_name)); + validation_features = enable_extension(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, available_layer_instance_extensions, enabled_extensions); + } +# endif // USE_VALIDATION_LAYER_FEATURES +#endif // USE_VALIDATION_LAYERS + + // Specific surface extensions are obtained from Window::get_required_surface_extensions + // They are already added to requested_extensions by VulkanSample::prepare + + // Even for a headless surface a swapchain is still required + enable_extension(VK_KHR_SURFACE_EXTENSION_NAME, available_instance_extensions, enabled_extensions); + + // VK_KHR_get_physical_device_properties2 is a prerequisite of VK_KHR_performance_query + // which will be used for stats gathering where available. + enable_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, available_instance_extensions, enabled_extensions); + + for (auto requested_extension : requested_extensions) + { + auto const &extension_name = requested_extension.first; + auto extension_is_optional = requested_extension.second; + if (!enable_extension(extension_name, available_instance_extensions, enabled_extensions)) + { + if (extension_is_optional) + { + LOGW("Optional instance extension {} not available, some features may be disabled", extension_name); + } + else + { + LOGE("Required instance extension {} not available, cannot run", extension_name); + throw std::runtime_error("Required instance extensions are missing."); + } + } + } + + std::vector supported_layers = vk::enumerateInstanceLayerProperties(); + + std::vector enabled_layers; + + auto layer_error = false; + for (auto const &requested_layer : requested_layers) + { + auto const &layer_name = requested_layer.first; + auto layer_is_optional = requested_layer.second; + if (!enable_layer(layer_name, supported_layers, enabled_layers)) + { + if (layer_is_optional) + { + LOGW("Optional layer {} not available, some features may be disabled", layer_name); + } + else + { + LOGE("Required layer {} not available, cannot run", layer_name); + throw std::runtime_error("Required layers are missing."); + } + } + } + +#ifdef USE_VALIDATION_LAYERS + // NOTE: It's important to have the validation layer as the last one here!!!! + // Otherwise, device creation fails !?! + enable_layer(validation_layer_name, supported_layers, enabled_layers); +#endif + + vk::ApplicationInfo app_info{.pApplicationName = application_name.c_str(), .pEngineName = "Vulkan Samples", .apiVersion = api_version}; + + vk::InstanceCreateInfo instance_info{.pApplicationInfo = &app_info, + .enabledLayerCount = static_cast(enabled_layers.size()), + .ppEnabledLayerNames = enabled_layers.data(), + .enabledExtensionCount = static_cast(enabled_extensions.size()), + .ppEnabledExtensionNames = enabled_extensions.data()}; + + std::vector enabled_layer_settings; + + for (auto const &layer_setting : requested_layer_settings) + { + enable_layer_setting(layer_setting, enabled_layers, enabled_layer_settings); + } + +#ifdef USE_VALIDATION_LAYERS + vk::DebugUtilsMessengerCreateInfoEXT debug_utils_create_info; + vk::DebugReportCallbackCreateInfoEXT debug_report_create_info; + if (has_debug_utils) + { + debug_utils_create_info = vk::DebugUtilsMessengerCreateInfoEXT{ + .messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, + .messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, + .pfnUserCallback = debug_utils_messenger_callback}; + + instance_info.pNext = &debug_utils_create_info; + } + else if (has_debug_report) + { + debug_report_create_info = {.flags = + vk::DebugReportFlagBitsEXT::eError | vk::DebugReportFlagBitsEXT::eWarning | vk::DebugReportFlagBitsEXT::ePerformanceWarning, + .pfnCallback = debug_callback}; + + instance_info.pNext = &debug_report_create_info; + } +#endif + +#if (defined(VKB_ENABLE_PORTABILITY)) + if (portability_enumeration_available) + { + instance_info.flags |= vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR; + } +#endif + + // Some of the specialized layers need to be enabled explicitly + // The validation layer does not need to be enabled in code and it can also be configured using the vulkan configurator. +#ifdef USE_VALIDATION_LAYER_FEATURES + +# if defined(VKB_VALIDATION_LAYERS_GPU_ASSISTED) + const vk::Bool32 setting_validate_gpuav = true; + if (validation_features) + { + enable_layer_setting(vk::LayerSettingEXT(validation_layer_name, "gpuav_enable", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_gpuav), enabled_layers, enabled_layer_settings); + } +# endif + +# if defined(VKB_VALIDATION_LAYERS_BEST_PRACTICES) + const vk::Bool32 setting_validate_best_practices = true; + const vk::Bool32 setting_validate_best_practices_arm = true; + const vk::Bool32 setting_validate_best_practices_amd = true; + const vk::Bool32 setting_validate_best_practices_img = true; + const vk::Bool32 setting_validate_best_practices_nvidia = true; + if (validation_features) + { + enable_layer_setting( + vk::LayerSettingEXT(validation_layer_name, "validate_best_practices", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_best_practices), + enabled_layers, + enabled_layer_settings); + enable_layer_setting( + vk::LayerSettingEXT(validation_layer_name, "validate_best_practices_arm", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_best_practices_arm), + enabled_layers, + enabled_layer_settings); + enable_layer_setting( + vk::LayerSettingEXT(validation_layer_name, "validate_best_practices_amd", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_best_practices_amd), + enabled_layers, + enabled_layer_settings); + enable_layer_setting( + vk::LayerSettingEXT(validation_layer_name, "validate_best_practices_img", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_best_practices_img), + enabled_layers, + enabled_layer_settings); + enable_layer_setting( + vk::LayerSettingEXT( + validation_layer_name, "validate_best_practices_nvidia", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_best_practices_nvidia), + enabled_layers, + enabled_layer_settings); + } +# endif + +# if defined(VKB_VALIDATION_LAYERS_SYNCHRONIZATION) + const vk::Bool32 setting_validate_sync = true; + const vk::Bool32 setting_validate_sync_heuristics = true; + if (validation_features) + { + enable_layer_setting(vk::LayerSettingEXT(validation_layer_name, "validate_sync", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_sync), + enabled_layers, + enabled_layer_settings); + enable_layer_setting( + vk::LayerSettingEXT( + validation_layer_name, "syncval_shader_accesses_heuristic", vk::LayerSettingTypeEXT::eBool32, 1, &setting_validate_sync_heuristics), + enabled_layers, + enabled_layer_settings); + } +# endif +#endif + + vk::LayerSettingsCreateInfoEXT layerSettingsCreateInfo; + + // If layer settings are defined, then activate the sample's required layer settings during instance creation + if (enabled_layer_settings.size() > 0) + { + layerSettingsCreateInfo.settingCount = static_cast(enabled_layer_settings.size()); + layerSettingsCreateInfo.pSettings = enabled_layer_settings.data(); + layerSettingsCreateInfo.pNext = instance_info.pNext; + instance_info.pNext = &layerSettingsCreateInfo; + } + + // Create the Vulkan instance + handle = vk::createInstance(instance_info); + + // initialize the Vulkan-Hpp default dispatcher on the instance + VULKAN_HPP_DEFAULT_DISPATCHER.init(handle); + + // Need to load volk for all the not-yet Vulkan-Hpp calls + volkLoadInstance(handle); + +#ifdef USE_VALIDATION_LAYERS + if (has_debug_utils) + { + debug_utils_messenger = handle.createDebugUtilsMessengerEXT(debug_utils_create_info); + } + else if (has_debug_report) + { + debug_report_callback = handle.createDebugReportCallbackEXT(debug_report_create_info); + } +#endif + + query_gpus(); +} + +template +inline Instance::Instance(std::string const &application_name, + std::unordered_map const &requested_extensions, + std::unordered_map const &requested_layers, + std::vector const &requested_layer_settings, + uint32_t api_version) : + Instance(application_name, + requested_extensions, + requested_layers, + reinterpret_cast const &>(requested_layer_settings), + api_version) +{} + +template +inline Instance::Instance(vk::Instance instance, const std::vector &externally_enabled_extensions, bool needsToInitializeDispatcher) : + handle{instance} +{ + if (needsToInitializeDispatcher) + { +#if defined(_HPP_VULKAN_LIBRARY) + static vk::detail::DynamicLoader dl(_HPP_VULKAN_LIBRARY); +#else + static vk::detail::DynamicLoader dl; +#endif + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); + VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); + VULKAN_HPP_DEFAULT_DISPATCHER.init(instance); + } + + // Some parts of the framework will check for certain extensions to be enabled + // To make those work we need to copy over externally enabled extensions into this class + for (auto extension : externally_enabled_extensions) + { + enabled_extensions.push_back(extension); + } + + if (handle) + { + query_gpus(); + } + else + { + throw std::runtime_error("Instance not valid"); + } +} + +template +inline Instance::Instance(VkInstance instance, const std::vector &externally_enabled_extensions) : + Instance(static_cast(instance), externally_enabled_extensions, true) +{} + +template +inline Instance::~Instance() +{ +#ifdef USE_VALIDATION_LAYERS + if (debug_utils_messenger) + { + handle.destroyDebugUtilsMessengerEXT(debug_utils_messenger); + } + if (debug_report_callback) + { + handle.destroyDebugReportCallbackEXT(debug_report_callback); + } +#endif + + if (handle) + { + handle.destroy(); + } +} + +#if defined(USE_VALIDATION_LAYERS) +# undef USE_VALIDATION_LAYERS +#endif + +#if defined(USE_VALIDATION_LAYER_FEATURES) +# undef USE_VALIDATION_LAYER_FEATURES +#endif + +template +inline PhysicalDevice &Instance::get_first_gpu() +{ + assert(!gpus.empty() && "No physical devices were found on the system."); + + // Find a discrete GPU + auto gpuIt = std::ranges::find_if(gpus, [](auto const &gpu) { return gpu->get_properties().deviceType == vk::PhysicalDeviceType::eDiscreteGpu; }); + if (gpuIt == gpus.end()) + { + LOGW("Couldn't find a discrete physical device, picking default GPU"); + gpuIt = gpus.begin(); + } + if constexpr (bindingType == BindingType::Cpp) + { + return **gpuIt; + } + else + { + return reinterpret_cast(**gpuIt); + } +} + +template +inline typename Instance::InstanceType Instance::get_handle() const +{ + if constexpr (bindingType == BindingType::Cpp) + { + return handle; + } + else + { + return static_cast(handle); + } + return handle; +} + +template +inline PhysicalDevice &Instance::get_suitable_gpu(SurfaceType surface, bool headless_surface) +{ + assert(!gpus.empty() && "No physical devices were found on the system."); + + // A GPU can be explicitly selected via the command line (see plugins/gpu_selection.cpp), this overrides the below GPU selection algorithm + auto gpuIt = gpus.begin(); + if (selected_gpu_index != ~0) + { + LOGI("Explicitly selecting GPU {}", selected_gpu_index); + if (selected_gpu_index > gpus.size() - 1) + { + throw std::runtime_error("Selected GPU index is not within no. of available GPUs"); + } + gpuIt = gpus.begin() + selected_gpu_index; + } + else + { + if (headless_surface) + { + LOGW("Using headless surface with multiple GPUs. Considered explicitly selecting the target GPU.") + } + + // Find a discrete GPU +#if 0 + gpuIt = std::ranges::find_if(gpus, + [&surface](auto const &gpu) { + return (gpu->get_properties().deviceType == vk::PhysicalDeviceType::eDiscreteGpu) && + std::ranges::any_of(std::views::iota(size_t(0), gpu->get_queue_family_properties().size()), + [&gpu, &surface](auto const &queue_idx) { + return gpu->get_handle().getSurfaceSupportKHR(static_cast(queue_idx), surface); + }); + }); +#else + gpuIt = std::ranges::find_if(gpus, + [&surface](auto const &gpu) { + auto gpu_supports_surface = [&gpu, &surface]() { + for (uint32_t queue_idx = 0; queue_idx < gpu->get_queue_family_properties().size(); ++queue_idx) + { + if (gpu->get_handle().getSurfaceSupportKHR(queue_idx, surface)) + { + return true; + } + } + return false; + }; + return (gpu->get_properties().deviceType == vk::PhysicalDeviceType::eDiscreteGpu) && gpu_supports_surface(); + }); +#endif + if (gpuIt == gpus.end()) + { + LOGW("Couldn't find a discrete physical device that supports the surface, picking default GPU"); + gpuIt = gpus.begin(); + } + } + + if constexpr (bindingType == BindingType::Cpp) + { + return **gpuIt; + } + else + { + return reinterpret_cast(**gpuIt); + } +} + +template +inline bool Instance::is_enabled(char const *extension) const +{ + return std::ranges::find_if(enabled_extensions, [extension](char const *enabled_extension) { return strcmp(extension, enabled_extension) == 0; }) != + enabled_extensions.end(); +} + +template +inline void Instance::query_gpus() +{ + // Querying valid physical devices on the machine + std::vector physical_devices = handle.enumeratePhysicalDevices(); + if (physical_devices.empty()) + { + throw std::runtime_error("Couldn't find a physical device that supports Vulkan."); + } + + // Create gpus wrapper objects from the vk::PhysicalDevice's + for (auto &physical_device : physical_devices) + { + if constexpr (bindingType == BindingType::Cpp) + { + gpus.push_back(std::make_unique(*this, physical_device)); + } + else + { + gpus.push_back(std::make_unique(*reinterpret_cast(this), physical_device)); + } + } +} + +template +inline std::vector const &Instance::get_extensions() +{ + return enabled_extensions; +} +} // namespace core } // namespace vkb diff --git a/framework/core/physical_device.cpp b/framework/core/physical_device.cpp deleted file mode 100644 index 8404e1bad0..0000000000 --- a/framework/core/physical_device.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "physical_device.h" - -namespace vkb -{ -PhysicalDevice::PhysicalDevice(Instance &instance, VkPhysicalDevice physical_device) : - instance{instance}, - handle{physical_device} -{ - vkGetPhysicalDeviceFeatures(physical_device, &features); - vkGetPhysicalDeviceProperties(physical_device, &properties); - vkGetPhysicalDeviceMemoryProperties(physical_device, &memory_properties); - - LOGI("Found GPU: {}", properties.deviceName); - - uint32_t queue_family_properties_count = 0; - vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_properties_count, nullptr); - queue_family_properties = std::vector(queue_family_properties_count); - vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_properties_count, queue_family_properties.data()); - - uint32_t device_extension_count; - VK_CHECK(vkEnumerateDeviceExtensionProperties(get_handle(), nullptr, &device_extension_count, nullptr)); - device_extensions = std::vector(device_extension_count); - VK_CHECK(vkEnumerateDeviceExtensionProperties(get_handle(), nullptr, &device_extension_count, device_extensions.data())); - - // Display supported extensions - if (device_extensions.size() > 0) - { - LOGD("Device supports the following extensions:"); - for (auto &extension : device_extensions) - { - LOGD(" \t{}", extension.extensionName); - } - } -} - -Instance &PhysicalDevice::get_instance() const -{ - return instance; -} - -VkBool32 PhysicalDevice::is_present_supported(VkSurfaceKHR surface, uint32_t queue_family_index) const -{ - VkBool32 present_supported{VK_FALSE}; - - if (surface != VK_NULL_HANDLE) - { - VK_CHECK(vkGetPhysicalDeviceSurfaceSupportKHR(handle, queue_family_index, surface, &present_supported)); - } - - return present_supported; -} - -bool PhysicalDevice::is_extension_supported(const std::string &requested_extension) const -{ - return std::find_if(device_extensions.begin(), device_extensions.end(), - [requested_extension](auto &device_extension) { - return std::strcmp(device_extension.extensionName, requested_extension.c_str()) == 0; - }) != device_extensions.end(); -} - -const VkFormatProperties PhysicalDevice::get_format_properties(VkFormat format) const -{ - VkFormatProperties format_properties; - - vkGetPhysicalDeviceFormatProperties(handle, format, &format_properties); - - return format_properties; -} - -VkPhysicalDevice PhysicalDevice::get_handle() const -{ - return handle; -} - -const VkPhysicalDeviceFeatures &PhysicalDevice::get_features() const -{ - return features; -} - -const VkPhysicalDeviceProperties &PhysicalDevice::get_properties() const -{ - return properties; -} - -const VkPhysicalDeviceMemoryProperties &PhysicalDevice::get_memory_properties() const -{ - return memory_properties; -} - -const std::vector &PhysicalDevice::get_queue_family_properties() const -{ - return queue_family_properties; -} - -uint32_t PhysicalDevice::get_queue_family_performance_query_passes( - const VkQueryPoolPerformanceCreateInfoKHR *perf_query_create_info) const -{ - uint32_t passes_needed; - vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(get_handle(), perf_query_create_info, - &passes_needed); - return passes_needed; -} - -void PhysicalDevice::enumerate_queue_family_performance_query_counters( - uint32_t queue_family_index, - uint32_t * count, - VkPerformanceCounterKHR * counters, - VkPerformanceCounterDescriptionKHR *descriptions) const -{ - VK_CHECK(vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( - get_handle(), queue_family_index, count, counters, descriptions)); -} - -const VkPhysicalDeviceFeatures PhysicalDevice::get_requested_features() const -{ - return requested_features; -} - -VkPhysicalDeviceFeatures &PhysicalDevice::get_mutable_requested_features() -{ - return requested_features; -} - -void *PhysicalDevice::get_extension_feature_chain() const -{ - return last_requested_extension_feature; -} - -} // namespace vkb diff --git a/framework/core/physical_device.h b/framework/core/physical_device.h index 32271abfc6..92d3584b99 100644 --- a/framework/core/physical_device.h +++ b/framework/core/physical_device.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,59 +19,77 @@ #pragma once #include "core/instance.h" +#include "vulkan_type_mapping.h" namespace vkb { -class Instance; +struct DriverVersion +{ + uint16_t major; + uint16_t minor; + uint16_t patch; +}; +namespace core +{ /** * @brief A wrapper class for VkPhysicalDevice * * This class is responsible for handling gpu features, properties, and queue families for the device creation. */ +template class PhysicalDevice { public: - PhysicalDevice(Instance &instance, VkPhysicalDevice physical_device); - - PhysicalDevice(const PhysicalDevice &) = delete; - - PhysicalDevice(PhysicalDevice &&) = delete; - - PhysicalDevice &operator=(const PhysicalDevice &) = delete; - - PhysicalDevice &operator=(PhysicalDevice &&) = delete; - - Instance &get_instance() const; - - VkBool32 is_present_supported(VkSurfaceKHR surface, uint32_t queue_family_index) const; - - bool is_extension_supported(const std::string &extension) const; - - const VkFormatProperties get_format_properties(VkFormat format) const; - - VkPhysicalDevice get_handle() const; + using Bool32Type = typename std::conditional::type; + using FormatPropertiesType = typename std::conditional::type; + using FormatType = typename std::conditional::type; + using MemoryPropertyFlagsType = typename std::conditional::type; + using PerformanceCounterDescriptionKHRType = + typename std::conditional::type; + using PerformanceCounterKHRType = + typename std::conditional::type; + using PhysicalDeviceFeaturesType = + typename std::conditional::type; + using PhysicalDeviceMemoryPropertiesType = + typename std::conditional::type; + using PhysicalDevicePropertiesType = + typename std::conditional::type; + using PhysicalDeviceType = typename std::conditional::type; + using QueueFamilyPropertiesType = + typename std::conditional::type; + using QueryPoolPerformanceCreateInfoKHRType = + typename std::conditional::type; + using StructureTypeType = typename std::conditional::type; + using SurfaceKHRType = typename std::conditional::type; - const VkPhysicalDeviceFeatures &get_features() const; - - const VkPhysicalDeviceProperties &get_properties() const; - - const VkPhysicalDeviceMemoryProperties &get_memory_properties() const; - - const std::vector &get_queue_family_properties() const; + public: + PhysicalDevice(vkb::core::Instance &instance, PhysicalDeviceType physical_device); - uint32_t get_queue_family_performance_query_passes( - const VkQueryPoolPerformanceCreateInfoKHR *perf_query_create_info) const; + PhysicalDevice(PhysicalDevice const &) = delete; + PhysicalDevice(PhysicalDevice &&) = delete; + PhysicalDevice &operator=(PhysicalDevice const &) = delete; + PhysicalDevice &operator=(PhysicalDevice &&) = delete; - void enumerate_queue_family_performance_query_counters( - uint32_t queue_family_index, - uint32_t *count, - VkPerformanceCounterKHR *counters, - VkPerformanceCounterDescriptionKHR *descriptions) const; + /** + * @brief Add an extension features struct to the structure chain used for device creation + * + * To have the features enabled, this function must be called before the logical device + * is created. To do this request sample specific features inside + * VulkanSample::request_gpu_features(vkb::core::PhysicalDevice &gpu). + * + * If the feature extension requires you to ask for certain features to be enabled, you can + * modify the struct returned by this function, it will propagate the changes to the logical + * device. + * @returns A reference to extension feature struct in the structure chain + */ + template + FeatureType &add_extension_features(); - const VkPhysicalDeviceFeatures get_requested_features() const; + std::pair, std::vector> + enumerate_queue_family_performance_query_counters(uint32_t queue_family_index) const; - VkPhysicalDeviceFeatures &get_mutable_requested_features(); + DriverVersion get_driver_version() const; /** * @brief Used at logical device creation to pass the extensions feature chain to vkCreateDevice @@ -84,65 +103,31 @@ class PhysicalDevice * Gets the actual extension features struct with the supported flags set. * The flags you're interested in can be set in a corresponding struct in the structure chain * by calling PhysicalDevice::add_extension_features() - * @param type The VkStructureType for the extension you are requesting * @returns The extension feature struct */ template - T get_extension_features(VkStructureType type) - { - // We cannot request extension features if the physical device properties 2 instance extension isn't enabled - if (!instance.is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) - { - throw std::runtime_error("Couldn't request feature from device as " + std::string(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) + - " isn't enabled!"); - } - - // Get the extension features - T features{type}; - VkPhysicalDeviceFeatures2KHR physical_device_features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR}; - physical_device_features.pNext = &features; - vkGetPhysicalDeviceFeatures2KHR(handle, &physical_device_features); - - return features; - } + T get_extension_features(); + + PhysicalDeviceFeaturesType const &get_features() const; + FormatPropertiesType get_format_properties(FormatType format) const; + PhysicalDeviceType get_handle() const; + vkb::core::Instance &get_instance() const; + PhysicalDeviceMemoryPropertiesType const &get_memory_properties() const; + uint32_t get_memory_type(uint32_t bits, MemoryPropertyFlagsType properties, Bool32Type *memory_type_found = nullptr) const; + PhysicalDeviceFeaturesType &get_mutable_requested_features(); + PhysicalDevicePropertiesType const &get_properties() const; + uint32_t get_queue_family_performance_query_passes(QueryPoolPerformanceCreateInfoKHRType const *perf_query_create_info) const; + std::vector const &get_queue_family_properties() const; + PhysicalDeviceFeaturesType const &get_requested_features() const; /** - * @brief Add an extension features struct to the structure chain used for device creation - * - * To have the features enabled, this function must be called before the logical device - * is created. To do this request sample specific features inside - * VulkanSample::request_gpu_features(vkb::PhysicalDevice &gpu). - * - * If the feature extension requires you to ask for certain features to be enabled, you can - * modify the struct returned by this function, it will propagate the changes to the logical - * device. - * @param type The VkStructureType for the extension you are requesting - * @returns A reference to extension feature struct in the structure chain + * @brief Returns high priority graphics queue state. + * @return High priority state. */ - template - T &add_extension_features(VkStructureType type) - { - // We cannot request extension features if the physical device properties 2 instance extension isn't enabled - if (!instance.is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) - { - throw std::runtime_error("Couldn't request feature from device as " + std::string(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) + - " isn't enabled!"); - } + bool has_high_priority_graphics_queue() const; - // Add an (empty) extension features into the map of extension features - auto [it, added] = extension_features.insert({type, std::make_shared(T{type})}); - if (added) - { - // if it was actually added, also add it to the structure chain - if (last_requested_extension_feature) - { - static_cast(it->second.get())->pNext = last_requested_extension_feature; - } - last_requested_extension_feature = it->second.get(); - } - - return *static_cast(it->second.get()); - } + bool is_extension_supported(const std::string &extension) const; + Bool32Type is_present_supported(SurfaceKHRType surface, uint32_t queue_family_index) const; /** * @brief Request an optional features flag @@ -153,19 +138,7 @@ class PhysicalDevice * @returns true if the requested feature is supported, otherwise false */ template - VkBool32 request_optional_feature(VkStructureType type, VkBool32 Feature::*flag, std::string const &featureName, std::string const &flagName) - { - VkBool32 supported = get_extension_features(type).*flag; - if (supported) - { - add_extension_features(type).*flag = true; - } - else - { - LOGI("Requested optional feature <{}::{}> is not supported", featureName, flagName); - } - return supported; - } + Bool32Type request_optional_feature(Bool32Type Feature::*flag, std::string const &featureName, std::string const &flagName); /** * @brief Request a required features flag @@ -174,17 +147,7 @@ class PhysicalDevice * add_extension_features is called, otherwise a runtime_error is thrown. */ template - void request_required_feature(VkStructureType type, VkBool32 Feature::*flag, std::string const &featureName, std::string const &flagName) - { - if (get_extension_features(type).*flag) - { - add_extension_features(type).*flag = true; - } - else - { - throw std::runtime_error(std::string("Requested required feature <") + featureName + "::" + flagName + "> is not supported"); - } - } + void request_required_feature(Bool32Type Feature::*flag, std::string const &featureName, std::string const &flagName); /** * @brief Sets whether or not the first graphics queue should have higher priority than other queues. @@ -192,55 +155,386 @@ class PhysicalDevice * @param enable If true, present queue will have prio 1.0 and other queues have prio 0.5. * Default state is false, where all queues have 0.5 priority. */ - void set_high_priority_graphics_queue_enable(bool enable) + void set_high_priority_graphics_queue_enable(bool enable); + + private: + template + FeatureType &add_extension_features_impl(); + template + FeatureType get_extension_features_impl(); + uint32_t get_memory_type_impl(uint32_t bits, vk::MemoryPropertyFlags properties, vk::Bool32 *memory_type_found = nullptr) const; + template + void request_required_feature_impl(vk::Bool32 FeatureType::*flag, std::string const &featureName, std::string const &flagName); + + private: + std::vector device_extensions; // The extensions that this GPU supports + std::map> + extension_features; // Holds the extension feature structures, we use a map to retain an order of requested structures + vk::PhysicalDeviceFeatures features; // The features that this GPU supports + vk::PhysicalDevice handle; // Handle to the Vulkan physical device + bool high_priority_graphics_queue = {}; + vkb::core::InstanceCpp &instance; // Handle to the Vulkan instance + void *last_requested_extension_feature = nullptr; // The extension feature pointer + vk::PhysicalDeviceMemoryProperties memory_properties; // The GPU memory properties + vk::PhysicalDeviceProperties properties; // The GPU properties + std::vector queue_family_properties; // The GPU queue family properties + vk::PhysicalDeviceFeatures requested_features; // The features that will be requested to be enabled in the logical device +}; + +using PhysicalDeviceC = PhysicalDevice; +using PhysicalDeviceCpp = PhysicalDevice; + +#define REQUEST_OPTIONAL_FEATURE(gpu, Feature, flag) gpu.request_optional_feature(&Feature::flag, #Feature, #flag) +#define REQUEST_REQUIRED_FEATURE(gpu, Feature, flag) gpu.request_required_feature(&Feature::flag, #Feature, #flag) + +template +inline PhysicalDevice::PhysicalDevice(vkb::core::Instance &instance, PhysicalDeviceType physical_device) : + instance{instance}, handle{physical_device} +{ + features = physical_device.getFeatures(); + properties = physical_device.getProperties(); + memory_properties = physical_device.getMemoryProperties(); + queue_family_properties = physical_device.getQueueFamilyProperties(); + device_extensions = physical_device.enumerateDeviceExtensionProperties(); + + LOGI("Found GPU: {}", properties.deviceName.data()); + + // Display supported extensions + if (device_extensions.size() > 0) { - high_priority_graphics_queue = enable; + LOGD("Device supports the following extensions:"); + for (auto &extension : device_extensions) + { + LOGD(" \t{}", extension.extensionName.data()); + } } +} - /** - * @brief Returns high priority graphics queue state. - * @return High priority state. - */ - bool has_high_priority_graphics_queue() const +template +template +inline FeatureType &PhysicalDevice::add_extension_features() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) { - return high_priority_graphics_queue; + return add_extension_features_impl(); } + else + { + return static_cast(add_extension_features_impl::Type>()); + } +} - private: - // Handle to the Vulkan instance - Instance &instance; +template +template +inline FeatureType &PhysicalDevice::add_extension_features_impl() +{ + // We cannot request extension features if the physical device properties 2 instance extension isn't enabled + if (!instance.is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) + { + throw std::runtime_error("Couldn't request feature from device as " + std::string(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) + + " isn't enabled!"); + } + + // Add an (empty) extension features into the map of extension features + auto [it, added] = extension_features.insert({FeatureType::structureType, std::make_shared()}); + if (added) + { + // if it was actually added, also add it to the structure chain + if (last_requested_extension_feature) + { + static_cast(it->second.get())->pNext = last_requested_extension_feature; + } + last_requested_extension_feature = it->second.get(); + } + + return *static_cast(it->second.get()); +} - // Handle to the Vulkan physical device - VkPhysicalDevice handle{VK_NULL_HANDLE}; +template +inline std::pair::PerformanceCounterKHRType>, + std::vector::PerformanceCounterDescriptionKHRType>> + PhysicalDevice::enumerate_queue_family_performance_query_counters(uint32_t queue_family_index) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return handle.enumerateQueueFamilyPerformanceQueryCountersKHR(queue_family_index); + } + else + { + auto [counters, descriptions] = handle.enumerateQueueFamilyPerformanceQueryCountersKHR(queue_family_index); + return {std::vector(counters.begin(), counters.end()), + std::vector(descriptions.begin(), descriptions.end())}; + } +} - // The features that this GPU supports - VkPhysicalDeviceFeatures features{}; +template +inline DriverVersion PhysicalDevice::get_driver_version() const +{ + DriverVersion version; - // The extensions that this GPU supports - std::vector device_extensions; + switch (properties.vendorID) + { + case 0x10DE: + // Nvidia + version.major = (properties.driverVersion >> 22) & 0x3ff; + version.minor = (properties.driverVersion >> 14) & 0x0ff; + version.patch = (properties.driverVersion >> 6) & 0x0ff; + // Ignoring optional tertiary info in lower 6 bits + break; + case 0x8086: + version.major = (properties.driverVersion >> 14) & 0x3ffff; + version.minor = properties.driverVersion & 0x3ffff; + break; + default: + version.major = VK_VERSION_MAJOR(properties.driverVersion); + version.minor = VK_VERSION_MINOR(properties.driverVersion); + version.patch = VK_VERSION_PATCH(properties.driverVersion); + break; + } - // The GPU properties - VkPhysicalDeviceProperties properties; + return version; +} - // The GPU memory properties - VkPhysicalDeviceMemoryProperties memory_properties; +template +inline void *PhysicalDevice::get_extension_feature_chain() const +{ + return last_requested_extension_feature; +} - // The GPU queue family properties - std::vector queue_family_properties; +template +template +inline FeatureType PhysicalDevice::get_extension_features() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return get_extension_features_impl(); + } + else + { + return static_cast(get_extension_features_impl::Type>()); + } +} - // The features that will be requested to be enabled in the logical device - VkPhysicalDeviceFeatures requested_features{}; +template +template +inline FeatureType PhysicalDevice::get_extension_features_impl() +{ + // We cannot request extension features if the physical device properties 2 instance extension isn't enabled + if (!instance.is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) + { + throw std::runtime_error("Couldn't request feature from device as " + std::string(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) + + " isn't enabled!"); + } - // The extension feature pointer - void *last_requested_extension_feature{nullptr}; + // Get the extension feature + return handle.getFeatures2KHR().template get(); +} - // Holds the extension feature structures, we use a map to retain an order of requested structures - std::map> extension_features; +template +inline typename PhysicalDevice::PhysicalDeviceFeaturesType const &PhysicalDevice::get_features() const +{ + return features; +} - bool high_priority_graphics_queue{}; -}; +template +inline typename PhysicalDevice::FormatPropertiesType PhysicalDevice::get_format_properties(FormatType format) const +{ + if constexpr (bindingType == BindingType::Cpp) + { + return handle.getFormatProperties(format); + } + else + { + return static_cast(handle.getFormatProperties(static_cast(format))); + } +} + +template +inline typename PhysicalDevice::PhysicalDeviceType PhysicalDevice::get_handle() const +{ + return handle; +} + +template +inline vkb::core::Instance &PhysicalDevice::get_instance() const +{ + if constexpr (bindingType == BindingType::Cpp) + { + return instance; + } + else + { + return reinterpret_cast(instance); + } +} + +template +inline typename PhysicalDevice::PhysicalDeviceMemoryPropertiesType const &PhysicalDevice::get_memory_properties() const +{ + return memory_properties; +} + +template +inline uint32_t PhysicalDevice::get_memory_type(uint32_t bits, MemoryPropertyFlagsType properties, Bool32Type *memory_type_found) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return get_memory_type_impl(bits, properties, memory_type_found); + } + else + { + return get_memory_type_impl(bits, static_cast(properties), reinterpret_cast(memory_type_found)); + } +} + +template +inline uint32_t PhysicalDevice::get_memory_type_impl(uint32_t bits, vk::MemoryPropertyFlags properties, vk::Bool32 *memory_type_found) const +{ + for (uint32_t i = 0; i < memory_properties.memoryTypeCount; i++) + { + if ((bits & 1) == 1) + { + if ((memory_properties.memoryTypes[i].propertyFlags & properties) == properties) + { + if (memory_type_found) + { + *memory_type_found = true; + } + return i; + } + } + bits >>= 1; + } -#define REQUEST_OPTIONAL_FEATURE(gpu, Feature, type, flag) gpu.request_optional_feature(type, &Feature::flag, #Feature, #flag) -#define REQUEST_REQUIRED_FEATURE(gpu, Feature, type, flag) gpu.request_required_feature(type, &Feature::flag, #Feature, #flag) + if (memory_type_found) + { + *memory_type_found = false; + return ~0; + } + else + { + throw std::runtime_error("Could not find a matching memory type"); + } +} + +template +inline typename PhysicalDevice::PhysicalDeviceFeaturesType &PhysicalDevice::get_mutable_requested_features() +{ + return requested_features; +} + +template +inline typename PhysicalDevice::PhysicalDevicePropertiesType const &PhysicalDevice::get_properties() const +{ + return properties; +} + +template +uint32_t + PhysicalDevice::get_queue_family_performance_query_passes(QueryPoolPerformanceCreateInfoKHRType const *perf_query_create_info) const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return handle.getQueueFamilyPerformanceQueryPassesKHR(perf_query_create_info); + } + else + { + return handle.getQueueFamilyPerformanceQueryPassesKHR(reinterpret_cast(*perf_query_create_info)); + } +} + +template +inline std::vector::QueueFamilyPropertiesType> const &PhysicalDevice::get_queue_family_properties() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return queue_family_properties; + } + else + { + return reinterpret_cast const &>(queue_family_properties); + } +} + +template +inline typename PhysicalDevice::PhysicalDeviceFeaturesType const &PhysicalDevice::get_requested_features() const +{ + return requested_features; +} + +template +inline bool PhysicalDevice::has_high_priority_graphics_queue() const +{ + return high_priority_graphics_queue; +} + +template +inline bool PhysicalDevice::is_extension_supported(const std::string &requested_extension) const +{ + return std::ranges::find_if(device_extensions, + [requested_extension](auto &device_extension) { return std::strcmp(device_extension.extensionName, requested_extension.c_str()) == 0; }) != device_extensions.end(); +} + +template +inline typename PhysicalDevice::Bool32Type PhysicalDevice::is_present_supported(SurfaceKHRType surface, + uint32_t queue_family_index) const +{ + return surface ? handle.getSurfaceSupportKHR(queue_family_index, surface) : false; +} + +template +template +inline typename PhysicalDevice::Bool32Type + PhysicalDevice::request_optional_feature(Bool32Type Feature::*flag, std::string const &featureName, std::string const &flagName) +{ + Bool32Type supported = get_extension_features().*flag; + if (supported) + { + add_extension_features().*flag = true; + } + else + { + LOGI("Requested optional feature <{}::{}> is not supported", featureName, flagName); + } + return supported; +} + +template +template +inline void + PhysicalDevice::request_required_feature(Bool32Type Feature::*flag, std::string const &featureName, std::string const &flagName) +{ + if constexpr (bindingType == BindingType::Cpp) + { + request_required_feature_impl(flag, featureName, flagName); + } + else + { + request_required_feature_impl::Type>( + reinterpret_cast::Type::*>(flag), featureName, flagName); + } +} + +template +template +inline void + PhysicalDevice::request_required_feature_impl(vk::Bool32 Feature::*flag, std::string const &featureName, std::string const &flagName) +{ + if (get_extension_features_impl().*flag) + { + add_extension_features_impl().*flag = true; + } + else + { + throw std::runtime_error(std::string("Requested required feature <") + featureName + "::" + flagName + "> is not supported"); + } +} + +template +inline void PhysicalDevice::set_high_priority_graphics_queue_enable(bool enable) +{ + high_priority_graphics_queue = enable; +} +} // namespace core } // namespace vkb diff --git a/framework/core/pipeline.cpp b/framework/core/pipeline.cpp index bbc3a74c9e..e5efb129b7 100644 --- a/framework/core/pipeline.cpp +++ b/framework/core/pipeline.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,13 +17,14 @@ #include "pipeline.h" +#include "debug.h" #include "device.h" #include "pipeline_layout.h" #include "shader_module.h" namespace vkb { -Pipeline::Pipeline(Device &device) : +Pipeline::Pipeline(vkb::core::DeviceC &device) : device{device} {} @@ -54,9 +55,9 @@ const PipelineState &Pipeline::get_state() const return state; } -ComputePipeline::ComputePipeline(Device & device, - VkPipelineCache pipeline_cache, - PipelineState & pipeline_state) : +ComputePipeline::ComputePipeline(vkb::core::DeviceC &device, + VkPipelineCache pipeline_cache, + PipelineState &pipeline_state) : Pipeline{device} { const ShaderModule *shader_module = pipeline_state.get_pipeline_layout().get_shader_modules().front(); @@ -122,9 +123,9 @@ ComputePipeline::ComputePipeline(Device & device, vkDestroyShaderModule(device.get_handle(), stage.module, nullptr); } -GraphicsPipeline::GraphicsPipeline(Device & device, - VkPipelineCache pipeline_cache, - PipelineState & pipeline_state) : +GraphicsPipeline::GraphicsPipeline(vkb::core::DeviceC &device, + VkPipelineCache pipeline_cache, + PipelineState &pipeline_state) : Pipeline{device} { std::vector shader_modules; diff --git a/framework/core/pipeline.h b/framework/core/pipeline.h index f5b8b4c994..89e3f19010 100644 --- a/framework/core/pipeline.h +++ b/framework/core/pipeline.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,12 +23,10 @@ namespace vkb { -class Device; - class Pipeline { public: - Pipeline(Device &device); + Pipeline(vkb::core::DeviceC &device); Pipeline(const Pipeline &) = delete; @@ -45,7 +43,7 @@ class Pipeline const PipelineState &get_state() const; protected: - Device &device; + vkb::core::DeviceC &device; VkPipeline handle = VK_NULL_HANDLE; @@ -59,9 +57,9 @@ class ComputePipeline : public Pipeline virtual ~ComputePipeline() = default; - ComputePipeline(Device & device, - VkPipelineCache pipeline_cache, - PipelineState & pipeline_state); + ComputePipeline(vkb::core::DeviceC &device, + VkPipelineCache pipeline_cache, + PipelineState &pipeline_state); }; class GraphicsPipeline : public Pipeline @@ -71,8 +69,8 @@ class GraphicsPipeline : public Pipeline virtual ~GraphicsPipeline() = default; - GraphicsPipeline(Device & device, - VkPipelineCache pipeline_cache, - PipelineState & pipeline_state); + GraphicsPipeline(vkb::core::DeviceC &device, + VkPipelineCache pipeline_cache, + PipelineState &pipeline_state); }; } // namespace vkb diff --git a/framework/core/pipeline_layout.cpp b/framework/core/pipeline_layout.cpp index 557b649160..7035f26ea3 100644 --- a/framework/core/pipeline_layout.cpp +++ b/framework/core/pipeline_layout.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -20,11 +20,12 @@ #include "descriptor_set_layout.h" #include "device.h" #include "pipeline.h" +#include "resource_cache.h" #include "shader_module.h" namespace vkb { -PipelineLayout::PipelineLayout(Device &device, const std::vector &shader_modules) : +PipelineLayout::PipelineLayout(vkb::core::DeviceC &device, const std::vector &shader_modules) : device{device}, shader_modules{shader_modules} { diff --git a/framework/core/pipeline_layout.h b/framework/core/pipeline_layout.h index f9f86dec9f..438e1a9599 100644 --- a/framework/core/pipeline_layout.h +++ b/framework/core/pipeline_layout.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,14 +24,13 @@ namespace vkb { -class Device; class ShaderModule; class DescriptorSetLayout; class PipelineLayout { public: - PipelineLayout(Device &device, const std::vector &shader_modules); + PipelineLayout(vkb::core::DeviceC &device, const std::vector &shader_modules); PipelineLayout(const PipelineLayout &) = delete; @@ -58,7 +57,7 @@ class PipelineLayout VkShaderStageFlags get_push_constant_range_stage(uint32_t size, uint32_t offset = 0) const; private: - Device &device; + vkb::core::DeviceC &device; VkPipelineLayout handle{VK_NULL_HANDLE}; diff --git a/framework/core/query_pool.cpp b/framework/core/query_pool.cpp index 4608a55aeb..151ca4cc86 100644 --- a/framework/core/query_pool.cpp +++ b/framework/core/query_pool.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Broadcom Inc. and Contributors +/* Copyright (c) 2020-2025, Broadcom Inc. and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,7 @@ namespace vkb { -QueryPool::QueryPool(Device &d, const VkQueryPoolCreateInfo &info) : +QueryPool::QueryPool(vkb::core::DeviceC &d, const VkQueryPoolCreateInfo &info) : device{d} { VK_CHECK(vkCreateQueryPool(device.get_handle(), &info, nullptr, &handle)); @@ -50,7 +50,7 @@ VkQueryPool QueryPool::get_handle() const void QueryPool::host_reset(uint32_t first_query, uint32_t query_count) { - assert(device.is_enabled("VK_EXT_host_query_reset") && + assert(device.is_extension_enabled("VK_EXT_host_query_reset") && "VK_EXT_host_query_reset needs to be enabled to call QueryPool::host_reset"); vkResetQueryPoolEXT(device.get_handle(), get_handle(), first_query, query_count); diff --git a/framework/core/query_pool.h b/framework/core/query_pool.h index 47768e27f4..a60b333c97 100644 --- a/framework/core/query_pool.h +++ b/framework/core/query_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Broadcom Inc. and Contributors +/* Copyright (c) 2020-2025, Broadcom Inc. and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,12 @@ namespace vkb { +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core /** * @brief Represents a Vulkan Query Pool @@ -35,7 +40,7 @@ class QueryPool * @param d The device to use * @param info Creation details */ - QueryPool(Device &d, const VkQueryPoolCreateInfo &info); + QueryPool(vkb::core::DeviceC &d, const VkQueryPoolCreateInfo &info); QueryPool(const QueryPool &) = delete; @@ -73,7 +78,7 @@ class QueryPool VkQueryResultFlags flags); private: - Device &device; + vkb::core::DeviceC &device; VkQueryPool handle{VK_NULL_HANDLE}; }; diff --git a/framework/core/queue.cpp b/framework/core/queue.cpp index f4435a9fad..453d8619f3 100644 --- a/framework/core/queue.cpp +++ b/framework/core/queue.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2022, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,12 +22,8 @@ namespace vkb { -Queue::Queue(Device &device, uint32_t family_index, VkQueueFamilyProperties properties, VkBool32 can_present, uint32_t index) : - device{device}, - family_index{family_index}, - index{index}, - can_present{can_present}, - properties{properties} +Queue::Queue(vkb::core::DeviceC &device, uint32_t family_index, VkQueueFamilyProperties properties, VkBool32 can_present, uint32_t index) : + device{device}, family_index{family_index}, index{index}, can_present{can_present}, properties{properties} { vkGetDeviceQueue(device.get_handle(), family_index, index, &handle); } @@ -47,7 +43,7 @@ Queue::Queue(Queue &&other) : other.index = 0; } -const Device &Queue::get_device() const +const vkb::core::DeviceC &Queue::get_device() const { return device; } @@ -82,7 +78,7 @@ VkResult Queue::submit(const std::vector &submit_infos, VkFence fe return vkQueueSubmit(handle, to_u32(submit_infos.size()), submit_infos.data(), fence); } -VkResult Queue::submit(const CommandBuffer &command_buffer, VkFence fence) const +VkResult Queue::submit(const vkb::core::CommandBufferC &command_buffer, VkFence fence) const { VkSubmitInfo submit_info{VK_STRUCTURE_TYPE_SUBMIT_INFO}; submit_info.commandBufferCount = 1; diff --git a/framework/core/queue.h b/framework/core/queue.h index f0b9ad53d3..e088c46eaf 100644 --- a/framework/core/queue.h +++ b/framework/core/queue.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2022, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,13 +23,18 @@ namespace vkb { -class Device; + +namespace core +{ +template class CommandBuffer; +using CommandBufferC = CommandBuffer; +} // namespace core class Queue { public: - Queue(Device &device, uint32_t family_index, VkQueueFamilyProperties properties, VkBool32 can_present, uint32_t index); + Queue(vkb::core::DeviceC &device, uint32_t family_index, VkQueueFamilyProperties properties, VkBool32 can_present, uint32_t index); Queue(const Queue &) = default; @@ -39,7 +44,7 @@ class Queue Queue &operator=(Queue &&) = delete; - const Device &get_device() const; + const vkb::core::DeviceC &get_device() const; VkQueue get_handle() const; @@ -53,14 +58,14 @@ class Queue VkResult submit(const std::vector &submit_infos, VkFence fence) const; - VkResult submit(const CommandBuffer &command_buffer, VkFence fence) const; + VkResult submit(const vkb::core::CommandBufferC &command_buffer, VkFence fence) const; VkResult present(const VkPresentInfoKHR &present_infos) const; VkResult wait_idle() const; private: - Device &device; + vkb::core::DeviceC &device; VkQueue handle{VK_NULL_HANDLE}; diff --git a/framework/core/render_pass.cpp b/framework/core/render_pass.cpp index f679bab2aa..6334b8d843 100644 --- a/framework/core/render_pass.cpp +++ b/framework/core/render_pass.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +18,7 @@ #include "render_pass.h" #include +#include #include "device.h" #include "rendering/render_target.h" @@ -244,23 +245,66 @@ void set_attachment_layouts(std::vector &subpass_descripti } } +/** + * @brief Assuming there is only one depth attachment + */ +template +bool is_depth_a_dependency(std::vector &subpass_descriptions, std::vector &attachment_descriptions) +{ + // More than 1 subpass uses depth + if (std::ranges::count_if(subpass_descriptions, + [](auto const &subpass) { + return subpass.pDepthStencilAttachment != nullptr; + }) > 1) + { + return true; + } + + // Otherwise check if any uses depth as an input + return std::ranges::any_of( + subpass_descriptions, + [&attachment_descriptions](auto const &subpass) { + return std::ranges::any_of( + std::span{subpass.pInputAttachments, subpass.inputAttachmentCount}, + [&attachment_descriptions](auto const &reference) { + return vkb::is_depth_format(attachment_descriptions[reference.attachment].format); + }); + }); + + return false; +} + template -std::vector get_subpass_dependencies(const size_t subpass_count) +std::vector get_subpass_dependencies(const size_t subpass_count, bool depth_stencil_dependency) { - std::vector dependencies(subpass_count - 1); + std::vector dependencies{}; if (subpass_count > 1) { - for (uint32_t i = 0; i < to_u32(dependencies.size()); ++i) + for (uint32_t subpass_id = 0; subpass_id < to_u32(subpass_count - 1); ++subpass_id) { - // Transition input attachments from color attachment to shader read - dependencies[i].srcSubpass = i; - dependencies[i].dstSubpass = i + 1; - dependencies[i].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependencies[i].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - dependencies[i].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - dependencies[i].dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; - dependencies[i].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + T color_dep{}; + color_dep.srcSubpass = subpass_id; + color_dep.dstSubpass = subpass_id + 1; + color_dep.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + color_dep.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + color_dep.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + color_dep.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + color_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + dependencies.push_back(color_dep); + + if (depth_stencil_dependency) + { + T depth_dep{}; + depth_dep.srcSubpass = subpass_id; + depth_dep.dstSubpass = subpass_id + 1; + depth_dep.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + depth_dep.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + depth_dep.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + depth_dep.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + depth_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + dependencies.push_back(depth_dep); + } } } @@ -282,6 +326,11 @@ T get_attachment_reference(const uint32_t attachment, const VkImageLayout layout template void RenderPass::create_renderpass(const std::vector &attachments, const std::vector &load_store_infos, const std::vector &subpasses) { + if (attachments.size() != load_store_infos.size()) + { + LOGW("Render Pass creation: size of attachment list and load/store info list does not match: {} vs {}", attachments.size(), load_store_infos.size()); + } + auto attachment_descriptions = get_attachment_descriptions(attachments, load_store_infos); // Store attachments for every subpass @@ -321,8 +370,7 @@ void RenderPass::create_renderpass(const std::vector &attachments, c // Fill input attachments references for (auto i_attachment : subpass.input_attachments) { - auto default_layout = vkb::is_depth_format(attachment_descriptions[i_attachment].format) ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - auto initial_layout = attachments[i_attachment].initial_layout == VK_IMAGE_LAYOUT_UNDEFINED ? default_layout : attachments[i_attachment].initial_layout; + auto initial_layout = vkb::is_depth_format(attachments[i_attachment].format) ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; input_attachments[i].push_back(get_attachment_reference(i_attachment, initial_layout)); } @@ -438,7 +486,7 @@ void RenderPass::create_renderpass(const std::vector &attachments, c color_output_count.push_back(to_u32(color_attachments[i].size())); } - const auto &subpass_dependencies = get_subpass_dependencies(subpass_count); + const auto &subpass_dependencies = get_subpass_dependencies(subpass_count, is_depth_a_dependency(subpass_descriptions, attachment_descriptions)); T_RenderPassCreateInfo create_info{}; set_structure_type(create_info); @@ -462,18 +510,22 @@ void RenderPass::create_renderpass(const std::vector &attachments, c } } -RenderPass::RenderPass(Device &device, const std::vector &attachments, const std::vector &load_store_infos, const std::vector &subpasses) : - VulkanResource{VK_NULL_HANDLE, &device}, - subpass_count{std::max(1, subpasses.size())}, // At least 1 subpass +RenderPass::RenderPass(vkb::core::DeviceC &device, + const std::vector &attachments, + const std::vector &load_store_infos, + const std::vector &subpasses) : + VulkanResource{VK_NULL_HANDLE, &device}, subpass_count{std::max(1, subpasses.size())}, // At least 1 subpass color_output_count{} { - if (device.is_enabled(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME)) + if (device.is_extension_enabled(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME)) { - create_renderpass(attachments, load_store_infos, subpasses); + create_renderpass( + attachments, load_store_infos, subpasses); } else { - create_renderpass(attachments, load_store_infos, subpasses); + create_renderpass( + attachments, load_store_infos, subpasses); } } @@ -497,7 +549,7 @@ const uint32_t RenderPass::get_color_output_count(uint32_t subpass_index) const return color_output_count[subpass_index]; } -const VkExtent2D RenderPass::get_render_area_granularity() const +VkExtent2D RenderPass::get_render_area_granularity() const { VkExtent2D render_area_granularity = {}; vkGetRenderAreaGranularity(get_device().get_handle(), get_handle(), &render_area_granularity); diff --git a/framework/core/render_pass.h b/framework/core/render_pass.h index 46442e9bf0..20b63e375e 100644 --- a/framework/core/render_pass.h +++ b/framework/core/render_pass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,14 +17,18 @@ #pragma once -#include "common/helpers.h" -#include "common/vk_common.h" #include "core/vulkan_resource.h" namespace vkb { -struct Attachment; +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core + +struct Attachment; struct SubpassInfo { @@ -46,7 +50,7 @@ struct SubpassInfo class RenderPass : public vkb::core::VulkanResourceC { public: - RenderPass(Device &device, + RenderPass(vkb::core::DeviceC &device, const std::vector &attachments, const std::vector &load_store_infos, const std::vector &subpasses); @@ -63,7 +67,7 @@ class RenderPass : public vkb::core::VulkanResourceC const uint32_t get_color_output_count(uint32_t subpass_index) const; - const VkExtent2D get_render_area_granularity() const; + VkExtent2D get_render_area_granularity() const; private: size_t subpass_count; diff --git a/framework/core/sampler.h b/framework/core/sampler.h index ff16e93b17..8718db2ee5 100644 --- a/framework/core/sampler.h +++ b/framework/core/sampler.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,10 +23,11 @@ namespace vkb { -class Device; - namespace core { +template +class Device; +using DeviceC = Device; /** * @brief Represents a Vulkan Sampler */ @@ -38,7 +39,7 @@ class Sampler : public VulkanResourceC * @param d The device to use * @param info Creation details */ - Sampler(vkb::Device &d, const VkSamplerCreateInfo &info); + Sampler(vkb::core::DeviceC &d, const VkSamplerCreateInfo &info); Sampler(const Sampler &) = delete; diff --git a/framework/core/sampler_core.cpp b/framework/core/sampler_core.cpp index 4d61d4c73a..21ff8bd450 100644 --- a/framework/core/sampler_core.cpp +++ b/framework/core/sampler_core.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,7 +23,7 @@ namespace vkb { namespace core { -Sampler::Sampler(vkb::Device &d, const VkSamplerCreateInfo &info) : +Sampler::Sampler(vkb::core::DeviceC &d, const VkSamplerCreateInfo &info) : VulkanResource{VK_NULL_HANDLE, &d} { VK_CHECK(vkCreateSampler(get_device().get_handle(), &info, nullptr, &get_handle())); diff --git a/framework/core/shader_module.cpp b/framework/core/shader_module.cpp index e6243a83ec..9dc4c38213 100644 --- a/framework/core/shader_module.cpp +++ b/framework/core/shader_module.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -20,100 +20,25 @@ #include "core/util/logging.hpp" #include "device.h" #include "filesystem/legacy.h" -#include "glsl_compiler.h" #include "spirv_reflection.h" namespace vkb { -/** - * @brief Pre-compiles project shader files to include header code - * @param source The shader file - * @returns A byte array of the final shader - */ -inline std::vector precompile_shader(const std::string &source) -{ - std::vector final_file; - - auto lines = split(source, '\n'); - - for (auto &line : lines) - { - if (line.find("#include \"") == 0) - { - // Include paths are relative to the base shader directory - std::string include_path = line.substr(10); - size_t last_quote = include_path.find("\""); - if (!include_path.empty() && last_quote != std::string::npos) - { - include_path = include_path.substr(0, last_quote); - } - - auto include_file = precompile_shader(fs::read_shader(include_path)); - for (auto &include_file_line : include_file) - { - final_file.push_back(include_file_line); - } - } - else - { - final_file.push_back(line); - } - } - - return final_file; -} - -inline std::vector convert_to_bytes(std::vector &lines) +ShaderModule::ShaderModule(vkb::core::DeviceC &device, + VkShaderStageFlagBits stage, + const ShaderSource &shader_source, + const std::string &entry_point, + const ShaderVariant &shader_variant) : + device{device}, stage{stage}, entry_point{entry_point} { - std::vector bytes; + debug_name = fmt::format("{} [variant {:X}] [entrypoint {}]", shader_source.get_filename(), shader_variant.get_id(), entry_point); - for (auto &line : lines) - { - line += "\n"; - std::vector line_bytes(line.begin(), line.end()); - bytes.insert(bytes.end(), line_bytes.begin(), line_bytes.end()); - } - - return bytes; -} - -ShaderModule::ShaderModule(Device &device, VkShaderStageFlagBits stage, const ShaderSource &glsl_source, const std::string &entry_point, const ShaderVariant &shader_variant) : - device{device}, - stage{stage}, - entry_point{entry_point} -{ - debug_name = fmt::format("{} [variant {:X}] [entrypoint {}]", - glsl_source.get_filename(), shader_variant.get_id(), entry_point); - - // Compiling from GLSL source requires the entry point - if (entry_point.empty()) - { - throw VulkanException{VK_ERROR_INITIALIZATION_FAILED}; - } + // Shaders in binary SPIR-V format can be loaded directly + spirv = vkb::fs::read_shader_binary_u32(shader_source.get_filename()); - auto &source = glsl_source.get_source(); - - // Check if application is passing in GLSL source code to compile to SPIR-V - if (source.empty()) - { - throw VulkanException{VK_ERROR_INITIALIZATION_FAILED}; - } - - // Precompile source into the final spirv bytecode - auto glsl_final_source = precompile_shader(source); - - // Compile the GLSL source - GLSLCompiler glsl_compiler; - - if (!glsl_compiler.compile_to_spirv(stage, convert_to_bytes(glsl_final_source), entry_point, shader_variant, spirv, info_log)) - { - LOGE("Shader compilation failed for shader \"{}\"", glsl_source.get_filename()); - LOGE("{}", info_log); - throw VulkanException{VK_ERROR_INITIALIZATION_FAILED}; - } + // Reflection is used to dynamically create descriptor bindings SPIRVReflection spirv_reflection; - // Reflect all shader resources if (!spirv_reflection.reflect_shader_resources(stage, spirv, resources, shader_variant)) { @@ -133,8 +58,7 @@ ShaderModule::ShaderModule(ShaderModule &&other) : entry_point{other.entry_point}, debug_name{other.debug_name}, spirv{other.spirv}, - resources{other.resources}, - info_log{other.info_log} + resources{other.resources} { other.stage = {}; } @@ -159,11 +83,6 @@ const std::vector &ShaderModule::get_resources() const return resources; } -const std::string &ShaderModule::get_info_log() const -{ - return info_log; -} - const std::vector &ShaderModule::get_binary() const { return spirv; @@ -171,7 +90,7 @@ const std::vector &ShaderModule::get_binary() const void ShaderModule::set_resource_mode(const std::string &resource_name, const ShaderResourceMode &resource_mode) { - auto it = std::find_if(resources.begin(), resources.end(), [&resource_name](const ShaderResource &resource) { return resource.name == resource_name; }); + auto it = std::ranges::find_if(resources, [&resource_name](const ShaderResource &resource) { return resource.name == resource_name; }); if (it != resources.end()) { @@ -197,53 +116,11 @@ void ShaderModule::set_resource_mode(const std::string &resource_name, const Sha } } -ShaderVariant::ShaderVariant(std::string &&preamble, std::vector &&processes) : - preamble{std::move(preamble)}, - processes{std::move(processes)} -{ - update_id(); -} - size_t ShaderVariant::get_id() const { return id; } -void ShaderVariant::add_definitions(const std::vector &definitions) -{ - for (auto &definition : definitions) - { - add_define(definition); - } -} - -void ShaderVariant::add_define(const std::string &def) -{ - processes.push_back("D" + def); - - std::string tmp_def = def; - - // The "=" needs to turn into a space - size_t pos_equal = tmp_def.find_first_of("="); - if (pos_equal != std::string::npos) - { - tmp_def[pos_equal] = ' '; - } - - preamble.append("#define " + tmp_def + "\n"); - - update_id(); -} - -void ShaderVariant::add_undefine(const std::string &undef) -{ - processes.push_back("U" + undef); - - preamble.append("#undef " + undef + "\n"); - - update_id(); -} - void ShaderVariant::add_runtime_array_size(const std::string &runtime_array_name, size_t size) { if (runtime_array_sizes.find(runtime_array_name) == runtime_array_sizes.end()) @@ -261,16 +138,6 @@ void ShaderVariant::set_runtime_array_sizes(const std::unordered_mapruntime_array_sizes = sizes; } -const std::string &ShaderVariant::get_preamble() const -{ - return preamble; -} - -const std::vector &ShaderVariant::get_processes() const -{ - return processes; -} - const std::unordered_map &ShaderVariant::get_runtime_array_sizes() const { return runtime_array_sizes; @@ -278,21 +145,13 @@ const std::unordered_map &ShaderVariant::get_runtime_array_ void ShaderVariant::clear() { - preamble.clear(); - processes.clear(); runtime_array_sizes.clear(); - update_id(); -} - -void ShaderVariant::update_id() -{ - std::hash hasher{}; - id = hasher(preamble); + id = 0; } ShaderSource::ShaderSource(const std::string &filename) : filename{filename}, - source{fs::read_shader(filename)} + source{fs::read_text_file(filename)} { std::hash hasher{}; id = hasher(std::string{this->source.cbegin(), this->source.cend()}); diff --git a/framework/core/shader_module.h b/framework/core/shader_module.h index 07af6e2b7b..ceb66c8b20 100644 --- a/framework/core/shader_module.h +++ b/framework/core/shader_module.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -26,7 +26,12 @@ namespace vkb { +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core /// Types of shader resources enum class ShaderResourceType @@ -108,28 +113,8 @@ class ShaderVariant public: ShaderVariant() = default; - ShaderVariant(std::string &&preamble, std::vector &&processes); - size_t get_id() const; - /** - * @brief Add definitions to shader variant - * @param definitions Vector of definitions to add to the variant - */ - void add_definitions(const std::vector &definitions); - - /** - * @brief Adds a define macro to the shader - * @param def String which should go to the right of a define directive - */ - void add_define(const std::string &def); - - /** - * @brief Adds an undef macro to the shader - * @param undef String which should go to the right of an undef directive - */ - void add_undefine(const std::string &undef); - /** * @brief Specifies the size of a named runtime array for automatic reflection. If already specified, overrides the size. * @param runtime_array_name String under which the runtime array is named in the shader @@ -140,10 +125,6 @@ class ShaderVariant void set_runtime_array_sizes(const std::unordered_map &sizes); - const std::string &get_preamble() const; - - const std::vector &get_processes() const; - const std::unordered_map &get_runtime_array_sizes() const; void clear(); @@ -151,13 +132,7 @@ class ShaderVariant private: size_t id; - std::string preamble; - - std::vector processes; - std::unordered_map runtime_array_sizes; - - void update_id(); }; class ShaderSource @@ -195,11 +170,11 @@ class ShaderSource class ShaderModule { public: - ShaderModule(Device & device, + ShaderModule(vkb::core::DeviceC &device, VkShaderStageFlagBits stage, - const ShaderSource & glsl_source, - const std::string & entry_point, - const ShaderVariant & shader_variant); + const ShaderSource &shader_source, + const std::string &entry_point, + const ShaderVariant &shader_variant); ShaderModule(const ShaderModule &) = delete; @@ -217,8 +192,6 @@ class ShaderModule const std::vector &get_resources() const; - const std::string &get_info_log() const; - const std::vector &get_binary() const; inline const std::string &get_debug_name() const @@ -239,7 +212,7 @@ class ShaderModule void set_resource_mode(const std::string &resource_name, const ShaderResourceMode &resource_mode); private: - Device &device; + vkb::core::DeviceC &device; /// Shader unique id size_t id; @@ -257,7 +230,5 @@ class ShaderModule std::vector spirv; std::vector resources; - - std::string info_log; }; } // namespace vkb diff --git a/framework/core/swapchain.cpp b/framework/core/swapchain.cpp index 44fc76a895..666672ad0e 100644 --- a/framework/core/swapchain.cpp +++ b/framework/core/swapchain.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -81,7 +81,7 @@ inline VkPresentModeKHR choose_present_mode( const std::vector &available_present_modes, const std::vector &present_mode_priority_list) { - auto present_mode_it = std::find(available_present_modes.begin(), available_present_modes.end(), request_present_mode); + auto present_mode_it = std::ranges::find(available_present_modes, request_present_mode); if (present_mode_it == available_present_modes.end()) { @@ -90,7 +90,7 @@ inline VkPresentModeKHR choose_present_mode( for (auto &present_mode : present_mode_priority_list) { - if (std::find(available_present_modes.begin(), available_present_modes.end(), present_mode) != available_present_modes.end()) + if (std::ranges::find(available_present_modes, present_mode) != available_present_modes.end()) { chosen_present_mode = present_mode; break; @@ -113,9 +113,8 @@ inline VkSurfaceFormatKHR choose_surface_format( const std::vector &surface_format_priority_list) { // Try to find the requested surface format in the supported surface formats - auto surface_format_it = std::find_if( - available_surface_formats.begin(), - available_surface_formats.end(), + auto surface_format_it = std::ranges::find_if( + available_surface_formats, [&requested_surface_format](const VkSurfaceFormatKHR &surface) { if (surface.format == requested_surface_format.format && surface.colorSpace == requested_surface_format.colorSpace) @@ -131,9 +130,8 @@ inline VkSurfaceFormatKHR choose_surface_format( { for (auto &surface_format : surface_format_priority_list) { - surface_format_it = std::find_if( - available_surface_formats.begin(), - available_surface_formats.end(), + surface_format_it = std::ranges::find_if( + available_surface_formats, [&surface_format](const VkSurfaceFormatKHR &surface) { if (surface.format == surface_format.format && surface.colorSpace == surface_format.colorSpace) @@ -352,7 +350,7 @@ Swapchain::Swapchain(Swapchain &old_swapchain, const VkImageCompressionFlagsEXT requested_compression_fixed_rate} {} -Swapchain::Swapchain(Device &device, +Swapchain::Swapchain(vkb::core::DeviceC &device, VkSurfaceKHR surface, const VkPresentModeKHR present_mode, std::vector const &present_mode_priority_list, @@ -368,7 +366,7 @@ Swapchain::Swapchain(Device &device, } Swapchain::Swapchain(Swapchain &old_swapchain, - Device &device, + vkb::core::DeviceC &device, VkSurfaceKHR surface, const VkPresentModeKHR present_mode, std::vector const &present_mode_priority_list, @@ -446,7 +444,7 @@ Swapchain::Swapchain(Swapchain &old_swapchain, auto fixed_rate_flags = requested_compression_fixed_rate; VkImageCompressionControlEXT compression_control{VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT}; compression_control.flags = requested_compression; - if (device.is_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) + if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) { create_info.pNext = &compression_control; @@ -486,7 +484,7 @@ Swapchain::Swapchain(Swapchain &old_swapchain, VK_CHECK(vkGetSwapchainImagesKHR(device.get_handle(), handle, &image_available, images.data())); - if (device.is_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME) && + if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME) && VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT == requested_compression) { // Check if fixed-rate compression was applied @@ -538,7 +536,7 @@ bool Swapchain::is_valid() const return handle != VK_NULL_HANDLE; } -Device &Swapchain::get_device() +vkb::core::DeviceC &Swapchain::get_device() { return device; } @@ -598,11 +596,11 @@ VkImageCompressionFlagsEXT Swapchain::get_applied_compression() const return vkb::query_applied_compression(device.get_handle(), get_images()[0]).imageCompressionFlags; } -std::vector Swapchain::query_supported_fixed_rate_compression(Device &device, const VkSurfaceKHR &surface) +std::vector Swapchain::query_supported_fixed_rate_compression(vkb::core::DeviceC &device, const VkSurfaceKHR &surface) { std::vector surface_format_compression_list; - if (device.is_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) + if (device.is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) { if (device.get_gpu().get_instance().is_enabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) { diff --git a/framework/core/swapchain.h b/framework/core/swapchain.h index 7525a2ff5d..eacb7590b6 100644 --- a/framework/core/swapchain.h +++ b/framework/core/swapchain.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,12 @@ namespace vkb { +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core enum ImageFormat { @@ -79,7 +84,7 @@ class Swapchain /** * @brief Constructor to create a swapchain. */ - Swapchain(Device &device, + Swapchain(vkb::core::DeviceC &device, VkSurfaceKHR surface, const VkPresentModeKHR present_mode, const std::vector &present_mode_priority_list = {VK_PRESENT_MODE_FIFO_KHR, @@ -98,7 +103,7 @@ class Swapchain * by configuring all parameters. */ Swapchain(Swapchain &old_swapchain, - Device &device, + vkb::core::DeviceC &device, VkSurfaceKHR surface, const VkPresentModeKHR present_mode, const std::vector &present_mode_priority_list = {VK_PRESENT_MODE_FIFO_KHR, VK_PRESENT_MODE_MAILBOX_KHR}, @@ -123,7 +128,7 @@ class Swapchain bool is_valid() const; - Device &get_device(); + vkb::core::DeviceC &get_device(); VkSwapchainKHR get_handle() const; @@ -157,10 +162,10 @@ class Swapchain VkImageCompressionPropertiesEXT compression_properties{VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT}; }; - static std::vector query_supported_fixed_rate_compression(Device &device, const VkSurfaceKHR &surface); + static std::vector query_supported_fixed_rate_compression(vkb::core::DeviceC &device, const VkSurfaceKHR &surface); private: - Device &device; + vkb::core::DeviceC &device; VkSurfaceKHR surface{VK_NULL_HANDLE}; diff --git a/framework/core/vulkan_resource.h b/framework/core/vulkan_resource.h index 8b894b4bbc..bae780ec53 100644 --- a/framework/core/vulkan_resource.h +++ b/framework/core/vulkan_resource.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors - * Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,6 +19,7 @@ #pragma once #include "common/vk_common.h" +#include "core/debug.h" #include "vulkan_type_mapping.h" #include @@ -26,24 +27,28 @@ namespace vkb { -class Device; - namespace core { -class HPPDevice; +template +class Device; +using DeviceC = Device; +using DeviceCpp = Device; -/// Inherit this for any Vulkan object with a handle of type `HPPHandle`. +/// Inherit this for any Vulkan object with a handle of type `Handle`. /// -/// This allows the derived class to store a Vulkan handle, and also a pointer to the parent vkb::core::Device. +/// This allows the derived class to store a Vulkan handle, and also a pointer to the parent vkb::Device. /// It also allows to set a debug name for any Vulkan object. template class VulkanResource { public: - using DeviceType = typename std::conditional::type; + // we always want to store a vk::Handle as a resource, so we have to figure out that type, depending on the BindingType! + using ResourceType = typename vkb::VulkanTypeMapping::Type; + + public: using ObjectType = typename std::conditional::type; - VulkanResource(Handle handle = nullptr, DeviceType *device_ = nullptr); + VulkanResource(Handle handle = nullptr, Device *device_ = nullptr); VulkanResource(const VulkanResource &) = delete; VulkanResource &operator=(const VulkanResource &) = delete; @@ -53,29 +58,32 @@ class VulkanResource virtual ~VulkanResource() = default; - const std::string &get_debug_name() const; - DeviceType &get_device(); - DeviceType const &get_device() const; - Handle &get_handle(); - const Handle &get_handle() const; - uint64_t get_handle_u64() const; - ObjectType get_object_type() const; - bool has_device() const; - bool has_handle() const; - void set_debug_name(const std::string &name); - void set_handle(Handle hdl); + const std::string &get_debug_name() const; + vkb::core::Device &get_device(); + vkb::core::Device const &get_device() const; + Handle &get_handle(); + const Handle &get_handle() const; + uint64_t get_handle_u64() const; + ObjectType get_object_type() const; + ResourceType const &get_resource() const; + bool has_device() const; + bool has_handle() const; + void set_debug_name(const std::string &name); + void set_handle(Handle hdl); private: - // we always want to store a vk::Handle as a resource, so we have to figure out that type, depending on the BindingType! - using ResourceType = typename vkb::VulkanTypeMapping::Type; - - std::string debug_name; - HPPDevice *device; - ResourceType handle; + std::string debug_name; + vkb::core::DeviceCpp *device; + ResourceType handle; }; +template +using VulkanResourceC = VulkanResource; +template +using VulkanResourceCpp = VulkanResource; + template -inline VulkanResource::VulkanResource(Handle handle_, DeviceType *device_) : +inline VulkanResource::VulkanResource(Handle handle_, Device *device_) : handle{handle_} { if constexpr (bindingType == vkb::BindingType::Cpp) @@ -84,7 +92,7 @@ inline VulkanResource::VulkanResource(Handle handle_, Devic } else { - device = reinterpret_cast(device_); + device = reinterpret_cast(device_); } } @@ -111,7 +119,7 @@ inline const std::string &VulkanResource::get_debug_name() } template -inline typename VulkanResource::DeviceType &VulkanResource::get_device() +inline Device &VulkanResource::get_device() { assert(device && "VKBDevice handle not set"); if constexpr (bindingType == vkb::BindingType::Cpp) @@ -120,12 +128,12 @@ inline typename VulkanResource::DeviceType &VulkanResource< } else { - return *reinterpret_cast(device); + return *reinterpret_cast(device); } } template -inline typename VulkanResource::DeviceType const &VulkanResource::get_device() const +inline Device const &VulkanResource::get_device() const { assert(device && "VKBDevice handle not set"); if constexpr (bindingType == vkb::BindingType::Cpp) @@ -134,7 +142,7 @@ inline typename VulkanResource::DeviceType const &VulkanRes } else { - return *reinterpret_cast(device); + return *reinterpret_cast(device); } } @@ -188,6 +196,12 @@ inline typename VulkanResource::ObjectType VulkanResource +inline typename VulkanResource::ResourceType const &VulkanResource::get_resource() const +{ + return handle; +} + template inline bool VulkanResource::has_device() const { @@ -217,9 +231,5 @@ inline void VulkanResource::set_handle(Handle hdl) handle = hdl; } -template -using VulkanResourceC = VulkanResource; -template -using VulkanResourceCpp = VulkanResource; } // namespace core } // namespace vkb diff --git a/framework/debug_info.h b/framework/debug_info.h index 93fc8d9683..d6ce26ef45 100644 --- a/framework/debug_info.h +++ b/framework/debug_info.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -191,7 +191,7 @@ class DebugInfo { if (field->label == label) { - if (dynamic_cast *>(field.get())) + if (dynamic_cast *>(field.get())) { field = std::make_unique>(label, args...); } diff --git a/framework/fence_pool.cpp b/framework/fence_pool.cpp index f2fecd2ec1..a8d6866582 100644 --- a/framework/fence_pool.cpp +++ b/framework/fence_pool.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,7 @@ namespace vkb { -FencePool::FencePool(Device &device) : +FencePool::FencePool(vkb::core::DeviceC &device) : device{device} { } @@ -66,7 +66,7 @@ VkFence FencePool::request_fence() return fences.back(); } -VkResult FencePool::wait(uint32_t timeout) const +VkResult FencePool::wait(uint64_t timeout) const { if (active_fence_count < 1 || fences.empty()) { diff --git a/framework/fence_pool.h b/framework/fence_pool.h index 934990e4c4..870ef555d0 100644 --- a/framework/fence_pool.h +++ b/framework/fence_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,12 +21,17 @@ namespace vkb { +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core class FencePool { public: - FencePool(Device &device); + FencePool(vkb::core::DeviceC &device); FencePool(const FencePool &) = delete; @@ -40,12 +45,12 @@ class FencePool VkFence request_fence(); - VkResult wait(uint32_t timeout = std::numeric_limits::max()) const; + VkResult wait(uint64_t timeout = std::numeric_limits::max()) const; VkResult reset(); private: - Device &device; + vkb::core::DeviceC &device; std::vector fences; diff --git a/framework/glsl_compiler.cpp b/framework/glsl_compiler.cpp deleted file mode 100644 index 8cedf77998..0000000000 --- a/framework/glsl_compiler.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "glsl_compiler.h" - -#include -#include -#include -#include -#include -#include - -namespace vkb -{ -namespace -{ -inline EShLanguage FindShaderLanguage(VkShaderStageFlagBits stage) -{ - switch (stage) - { - case VK_SHADER_STAGE_VERTEX_BIT: - return EShLangVertex; - - case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: - return EShLangTessControl; - - case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: - return EShLangTessEvaluation; - - case VK_SHADER_STAGE_GEOMETRY_BIT: - return EShLangGeometry; - - case VK_SHADER_STAGE_FRAGMENT_BIT: - return EShLangFragment; - - case VK_SHADER_STAGE_COMPUTE_BIT: - return EShLangCompute; - - case VK_SHADER_STAGE_RAYGEN_BIT_KHR: - return EShLangRayGen; - - case VK_SHADER_STAGE_ANY_HIT_BIT_KHR: - return EShLangAnyHit; - - case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR: - return EShLangClosestHit; - - case VK_SHADER_STAGE_MISS_BIT_KHR: - return EShLangMiss; - - case VK_SHADER_STAGE_INTERSECTION_BIT_KHR: - return EShLangIntersect; - - case VK_SHADER_STAGE_CALLABLE_BIT_KHR: - return EShLangCallable; - - case VK_SHADER_STAGE_MESH_BIT_EXT: - return EShLangMesh; - - case VK_SHADER_STAGE_TASK_BIT_EXT: - return EShLangTask; - - default: - return EShLangVertex; - } -} -} // namespace - -glslang::EShTargetLanguage GLSLCompiler::env_target_language = glslang::EShTargetLanguage::EShTargetNone; -glslang::EShTargetLanguageVersion GLSLCompiler::env_target_language_version = static_cast(0); - -void GLSLCompiler::set_target_environment(glslang::EShTargetLanguage target_language, glslang::EShTargetLanguageVersion target_language_version) -{ - GLSLCompiler::env_target_language = target_language; - GLSLCompiler::env_target_language_version = target_language_version; -} - -void GLSLCompiler::reset_target_environment() -{ - GLSLCompiler::env_target_language = glslang::EShTargetLanguage::EShTargetNone; - GLSLCompiler::env_target_language_version = static_cast(0); -} - -bool GLSLCompiler::compile_to_spirv(VkShaderStageFlagBits stage, - const std::vector &glsl_source, - const std::string &entry_point, - const ShaderVariant &shader_variant, - std::vector &spirv, - std::string &info_log) -{ - // Initialize glslang library. - glslang::InitializeProcess(); - - EShMessages messages = static_cast(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); - - EShLanguage language = FindShaderLanguage(stage); - std::string source = std::string(glsl_source.begin(), glsl_source.end()); - - const char *file_name_list[1] = {""}; - const char *shader_source = reinterpret_cast(source.data()); - - glslang::TShader shader(language); - shader.setStringsWithLengthsAndNames(&shader_source, nullptr, file_name_list, 1); - shader.setEntryPoint(entry_point.c_str()); - shader.setSourceEntryPoint(entry_point.c_str()); - shader.setPreamble(shader_variant.get_preamble().c_str()); - shader.addProcesses(shader_variant.get_processes()); - if (GLSLCompiler::env_target_language != glslang::EShTargetLanguage::EShTargetNone) - { - shader.setEnvTarget(GLSLCompiler::env_target_language, GLSLCompiler::env_target_language_version); - } - - DirStackFileIncluder includeDir; - includeDir.pushExternalLocalDirectory("shaders"); - - if (!shader.parse(GetDefaultResources(), 100, false, messages, includeDir)) - { - info_log = std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()); - return false; - } - - // Add shader to new program object. - glslang::TProgram program; - program.addShader(&shader); - - // Link program. - if (!program.link(messages)) - { - info_log = std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog()); - return false; - } - - // Save any info log that was generated. - if (shader.getInfoLog()) - { - info_log += std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()) + "\n"; - } - - if (program.getInfoLog()) - { - info_log += std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog()); - } - - glslang::TIntermediate *intermediate = program.getIntermediate(language); - - // Translate to SPIRV. - if (!intermediate) - { - info_log += "Failed to get shared intermediate code.\n"; - return false; - } - - spv::SpvBuildLogger logger; - - glslang::GlslangToSpv(*intermediate, spirv, &logger); - - info_log += logger.getAllMessages() + "\n"; - - // Shutdown glslang library. - glslang::FinalizeProcess(); - - return true; -} -} // namespace vkb diff --git a/framework/glsl_compiler.h b/framework/glsl_compiler.h deleted file mode 100644 index 91e4154a62..0000000000 --- a/framework/glsl_compiler.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include - -#include "common/error.h" - -#include - -#include "common/vk_common.h" -#include "core/shader_module.h" - -namespace vkb -{ -/// Helper class to generate SPIRV code from GLSL source -/// A very simple version of the glslValidator application -class GLSLCompiler -{ - private: - static glslang::EShTargetLanguage env_target_language; - static glslang::EShTargetLanguageVersion env_target_language_version; - - public: - /** - * @brief Set the glslang target environment to translate to when generating code - * @param target_language The language to translate to - * @param target_language_version The version of the language to translate to - */ - static void set_target_environment(glslang::EShTargetLanguage target_language, - glslang::EShTargetLanguageVersion target_language_version); - - /** - * @brief Reset the glslang target environment to the default values - */ - static void reset_target_environment(); - - /** - * @brief Compiles GLSL to SPIRV code - * @param stage The Vulkan shader stage flag - * @param glsl_source The GLSL source code to be compiled - * @param entry_point The entrypoint function name of the shader stage - * @param shader_variant The shader variant - * @param[out] spirv The generated SPIRV code - * @param[out] info_log Stores any log messages during the compilation process - */ - bool compile_to_spirv(VkShaderStageFlagBits stage, - const std::vector &glsl_source, - const std::string &entry_point, - const ShaderVariant &shader_variant, - std::vector &spirv, - std::string &info_log); -}; -} // namespace vkb diff --git a/framework/gltf_loader.cpp b/framework/gltf_loader.cpp index f9ae1b9400..b7fc3859ab 100644 --- a/framework/gltf_loader.cpp +++ b/framework/gltf_loader.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -19,6 +19,7 @@ #define TINYGLTF_IMPLEMENTATION #include "gltf_loader.h" +#include #include #include @@ -51,8 +52,6 @@ #include "scene_graph/scene.h" #include "scene_graph/scripts/animation.h" -#include - namespace vkb { namespace @@ -285,7 +284,7 @@ inline std::vector convert_underlying_data_stride(const std::vector GLTFLoader::supported_extensions = { {KHR_LIGHTS_PUNCTUAL_EXTENSION, false}}; -GLTFLoader::GLTFLoader(Device &device) : +GLTFLoader::GLTFLoader(vkb::core::DeviceC &device) : device{device} { } @@ -512,7 +511,7 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ if (it == supported_extensions.end()) { // If extension is required then we shouldn't allow the scene to be loaded - if (std::find(model.extensionsRequired.begin(), model.extensionsRequired.end(), used_extension) != model.extensionsRequired.end()) + if (std::ranges::find(model.extensionsRequired, used_extension) != model.extensionsRequired.end()) { throw std::runtime_error("Cannot load glTF file. Contains a required unsupported extension: " + used_extension); } @@ -536,7 +535,7 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ scene.set_components(std::move(light_components)); // Load samplers - std::vector> + std::vector> sampler_components(model.samplers.size()); for (size_t sampler_index = 0; sampler_index < model.samplers.size(); sampler_index++) @@ -551,25 +550,19 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ timer.start(); // Load images - auto thread_count = std::thread::hardware_concurrency(); - thread_count = thread_count == 0 ? 1 : thread_count; - ctpl::thread_pool thread_pool(thread_count); - auto image_count = to_u32(model.images.size()); std::vector>> image_component_futures; for (size_t image_index = 0; image_index < image_count; image_index++) { - auto fut = thread_pool.push( - [this, image_index](size_t) { + image_component_futures.push_back(std::async( + [this, image_index]() { auto image = parse_image(model.images[image_index]); LOGI("Loaded gltf image #{} ({})", image_index, model.images[image_index].uri.c_str()); return image; - }); - - image_component_futures.push_back(std::move(fut)); + })); } std::vector> image_components; @@ -582,9 +575,9 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ { std::vector transient_buffers; - auto &command_buffer = device.request_command_buffer(); + auto command_buffer = device.get_command_pool().request_command_buffer(); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, 0); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, 0); size_t batch_size = 0; @@ -600,18 +593,18 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ batch_size += image->get_data().size(); - upload_image_to_gpu(command_buffer, stage_buffer, *image); + upload_image_to_gpu(*command_buffer, stage_buffer, *image); transient_buffers.push_back(std::move(stage_buffer)); image_index++; } - command_buffer.end(); + command_buffer->end(); auto &queue = device.get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(command_buffer, device.request_fence()); + queue.submit(*command_buffer, device.get_fence_pool().request_fence()); device.get_fence_pool().wait(); device.get_fence_pool().reset(); @@ -626,11 +619,13 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ auto elapsed_time = timer.stop(); + auto thread_count = std::thread::hardware_concurrency(); + thread_count = thread_count == 0 ? 1 : thread_count; LOGI("Time spent loading images: {} seconds across {} threads.", vkb::to_string(elapsed_time), thread_count); // Load textures auto images = scene.get_components(); - auto samplers = scene.get_components(); + auto samplers = scene.get_components(); auto default_sampler_linear = create_default_sampler(TINYGLTF_TEXTURE_FILTER_LINEAR); auto default_sampler_nearest = create_default_sampler(TINYGLTF_TEXTURE_FILTER_NEAREST); bool used_nearest_sampler = false; @@ -849,7 +844,7 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ // Load nodes auto meshes = scene.get_components(); - std::vector> nodes; + std::vector> nodes; for (size_t node_index = 0; node_index < model.nodes.size(); ++node_index) { @@ -1021,7 +1016,7 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ scene.set_components(std::move(animations)); // Load scenes - std::queue> traverse_nodes; + std::queue> traverse_nodes; tinygltf::Scene *gltf_scene{nullptr}; @@ -1043,7 +1038,7 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ throw std::runtime_error("Couldn't determine which scene to load!"); } - auto root_node = std::make_unique(0, gltf_scene->name); + auto root_node = std::make_unique(0, gltf_scene->name); for (auto node_index : gltf_scene->nodes) { @@ -1080,7 +1075,7 @@ sg::Scene GLTFLoader::load_scene(int scene_index, VkBufferUsageFlags additional_ scene.set_nodes(std::move(nodes)); // Create node for the default camera - auto camera_node = std::make_unique(-1, "default_camera"); + auto camera_node = std::make_unique(-1, "default_camera"); auto default_camera = create_default_camera(); default_camera->set_node(*camera_node); @@ -1109,9 +1104,9 @@ std::unique_ptr GLTFLoader::load_model(uint32_t index, bool storage auto &queue = device.get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - auto &command_buffer = device.request_command_buffer(); + auto command_buffer = device.get_command_pool().request_command_buffer(); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); assert(index < model.meshes.size()); auto &gltf_mesh = model.meshes[index]; @@ -1195,7 +1190,7 @@ std::unique_ptr GLTFLoader::load_model(uint32_t index, bool storage VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY}; - command_buffer.copy_buffer(stage_buffer, buffer, aligned_vertex_data.size() * sizeof(AlignedVertex)); + command_buffer->copy_buffer(stage_buffer, buffer, aligned_vertex_data.size() * sizeof(AlignedVertex)); auto pair = std::make_pair("vertex_buffer", std::move(buffer)); submesh->vertex_buffers.insert(std::move(pair)); @@ -1238,7 +1233,7 @@ std::unique_ptr GLTFLoader::load_model(uint32_t index, bool storage VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY}; - command_buffer.copy_buffer(stage_buffer, buffer, vertex_data.size() * sizeof(Vertex)); + command_buffer->copy_buffer(stage_buffer, buffer, vertex_data.size() * sizeof(Vertex)); auto pair = std::make_pair("vertex_buffer", std::move(buffer)); submesh->vertex_buffers.insert(std::move(pair)); @@ -1295,7 +1290,7 @@ std::unique_ptr GLTFLoader::load_model(uint32_t index, bool storage VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY); - command_buffer.copy_buffer(stage_buffer, *submesh->index_buffer, meshlets.size() * sizeof(Meshlet)); + command_buffer->copy_buffer(stage_buffer, *submesh->index_buffer, meshlets.size() * sizeof(Meshlet)); transient_buffers.push_back(std::move(stage_buffer)); } @@ -1308,15 +1303,15 @@ std::unique_ptr GLTFLoader::load_model(uint32_t index, bool storage VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY); - command_buffer.copy_buffer(stage_buffer, *submesh->index_buffer, index_data.size()); + command_buffer->copy_buffer(stage_buffer, *submesh->index_buffer, index_data.size()); transient_buffers.push_back(std::move(stage_buffer)); } } - command_buffer.end(); + command_buffer->end(); - queue.submit(command_buffer, device.request_fence()); + queue.submit(*command_buffer, device.get_fence_pool().request_fence()); device.get_fence_pool().wait(); device.get_fence_pool().reset(); @@ -1325,9 +1320,9 @@ std::unique_ptr GLTFLoader::load_model(uint32_t index, bool storage return std::move(submesh); } -std::unique_ptr GLTFLoader::parse_node(const tinygltf::Node &gltf_node, size_t index) const +std::unique_ptr GLTFLoader::parse_node(const tinygltf::Node &gltf_node, size_t index) const { - auto node = std::make_unique(index, gltf_node.name); + auto node = std::make_unique(index, gltf_node.name); auto &transform = node->get_component(); @@ -1462,6 +1457,11 @@ std::unique_ptr GLTFLoader::parse_image(tinygltf::Image &gltf_image) { std::unique_ptr image{nullptr}; + if (gltf_image.name.empty()) + { + gltf_image.name = gltf_image.uri; + } + if (!gltf_image.image.empty()) { // Image embedded in gltf file @@ -1486,7 +1486,6 @@ std::unique_ptr GLTFLoader::parse_image(tinygltf::Image &gltf_image) { if (!device.is_image_format_supported(image->get_format())) { - LOGW("ASTC not supported: decoding {}", image->get_name()); image = std::make_unique(*image); image->generate_mipmaps(); } @@ -1497,7 +1496,7 @@ std::unique_ptr GLTFLoader::parse_image(tinygltf::Image &gltf_image) return image; } -std::unique_ptr GLTFLoader::parse_sampler(const tinygltf::Sampler &gltf_sampler) const +std::unique_ptr GLTFLoader::parse_sampler(const tinygltf::Sampler &gltf_sampler) const { auto name = gltf_sampler.name; @@ -1508,7 +1507,6 @@ std::unique_ptr GLTFLoader::parse_sampler(const tinygltf::Sampler & VkSamplerAddressMode address_mode_u = find_wrap_mode(gltf_sampler.wrapS); VkSamplerAddressMode address_mode_v = find_wrap_mode(gltf_sampler.wrapT); - VkSamplerAddressMode address_mode_w = find_wrap_mode(gltf_sampler.wrapR); VkSamplerCreateInfo sampler_info{VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; @@ -1517,14 +1515,13 @@ std::unique_ptr GLTFLoader::parse_sampler(const tinygltf::Sampler & sampler_info.mipmapMode = mipmap_mode; sampler_info.addressModeU = address_mode_u; sampler_info.addressModeV = address_mode_v; - sampler_info.addressModeW = address_mode_w; sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; sampler_info.maxLod = std::numeric_limits::max(); core::Sampler vk_sampler{device, sampler_info}; vk_sampler.set_debug_name(gltf_sampler.name); - return std::make_unique(name, std::move(vk_sampler)); + return std::make_unique(name, std::move(vk_sampler)); } std::unique_ptr GLTFLoader::parse_texture(const tinygltf::Texture &gltf_texture) const @@ -1538,7 +1535,7 @@ std::unique_ptr GLTFLoader::create_default_material() return parse_material(gltf_material); } -std::unique_ptr GLTFLoader::create_default_sampler(int filter) +std::unique_ptr GLTFLoader::create_default_sampler(int filter) { tinygltf::Sampler gltf_sampler; @@ -1547,7 +1544,6 @@ std::unique_ptr GLTFLoader::create_default_sampler(int filter) gltf_sampler.wrapS = TINYGLTF_TEXTURE_WRAP_REPEAT; gltf_sampler.wrapT = TINYGLTF_TEXTURE_WRAP_REPEAT; - gltf_sampler.wrapR = TINYGLTF_TEXTURE_WRAP_REPEAT; return parse_sampler(gltf_sampler); } diff --git a/framework/gltf_loader.h b/framework/gltf_loader.h index d6836b44b1..4176e96f5d 100644 --- a/framework/gltf_loader.h +++ b/framework/gltf_loader.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +18,7 @@ #pragma once +#include "common/vk_common.h" #include #include @@ -26,6 +27,8 @@ #define TINYGLTF_NO_EXTERNAL_IMAGE #include +#include "scene_graph/components/sampler.h" +#include "scene_graph/node.h" #include "timer.h" #include "vulkan/vulkan.h" @@ -34,7 +37,13 @@ namespace vkb { +namespace core +{ +template class Device; +using DeviceCpp = Device; +using DeviceC = Device; +} // namespace core namespace sg { @@ -71,7 +80,7 @@ struct TypeCast class GLTFLoader { public: - GLTFLoader(Device &device); + GLTFLoader(vkb::core::DeviceC &device); virtual ~GLTFLoader() = default; @@ -84,7 +93,7 @@ class GLTFLoader std::unique_ptr read_model_from_file(const std::string &file_name, uint32_t index, bool storage_buffer = false, VkBufferUsageFlags additional_buffer_usage_flags = 0); protected: - virtual std::unique_ptr parse_node(const tinygltf::Node &gltf_node, size_t index) const; + virtual std::unique_ptr parse_node(const tinygltf::Node &gltf_node, size_t index) const; virtual std::unique_ptr parse_camera(const tinygltf::Camera &gltf_camera) const; @@ -94,13 +103,13 @@ class GLTFLoader virtual std::unique_ptr parse_image(tinygltf::Image &gltf_image) const; - virtual std::unique_ptr parse_sampler(const tinygltf::Sampler &gltf_sampler) const; + virtual std::unique_ptr parse_sampler(const tinygltf::Sampler &gltf_sampler) const; virtual std::unique_ptr parse_texture(const tinygltf::Texture &gltf_texture) const; virtual std::unique_ptr create_default_material(); - virtual std::unique_ptr create_default_sampler(int filter); + virtual std::unique_ptr create_default_sampler(int filter); virtual std::unique_ptr create_default_camera(); @@ -124,7 +133,7 @@ class GLTFLoader */ tinygltf::Value *get_extension(tinygltf::ExtensionMap &tinygltf_extensions, const std::string &extension); - Device &device; + vkb::core::DeviceC &device; tinygltf::Model model; diff --git a/framework/gui.cpp b/framework/gui.cpp deleted file mode 100644 index 9314dcd478..0000000000 --- a/framework/gui.cpp +++ /dev/null @@ -1,1098 +0,0 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "gui.h" - -#include -#include - -#include "common/error.h" - -#include "common/glm_common.h" -#include - -#include "buffer_pool.h" -#include "common/utils.h" -#include "common/vk_common.h" -#include "common/vk_initializers.h" -#include "core/descriptor_set.h" -#include "core/descriptor_set_layout.h" -#include "core/pipeline.h" -#include "core/pipeline_layout.h" -#include "core/shader_module.h" -#include "core/util/logging.hpp" -#include "filesystem/legacy.h" -#include "imgui_internal.h" -#include "platform/window.h" -#include "rendering/render_context.h" -#include "timer.h" -#include "vulkan_sample.h" - -namespace vkb -{ -namespace -{ -void upload_draw_data(const ImDrawData *draw_data, uint8_t *vertex_data, uint8_t *index_data) -{ - ImDrawVert *vtx_dst = reinterpret_cast(vertex_data); - ImDrawIdx *idx_dst = reinterpret_cast(index_data); - - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList *cmd_list = draw_data->CmdLists[n]; - memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); - memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); - vtx_dst += cmd_list->VtxBuffer.Size; - idx_dst += cmd_list->IdxBuffer.Size; - } -} - -inline void reset_graph_max_value(StatGraphData &graph_data) -{ - // If it does not have a fixed max - if (!graph_data.has_fixed_max) - { - // Reset it - graph_data.max_value = 0.0f; - } -} -} // namespace - -bool Gui::visible = true; - -const double Gui::press_time_ms = 200.0f; - -const float Gui::overlay_alpha = 0.3f; - -const std::string Gui::default_font = "Roboto-Regular"; - -const ImGuiWindowFlags Gui::common_flags = ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoFocusOnAppearing; - -const ImGuiWindowFlags Gui::options_flags = Gui::common_flags; - -const ImGuiWindowFlags Gui::info_flags = Gui::common_flags | ImGuiWindowFlags_NoInputs; - -Gui::Gui(VulkanSampleC &sample_, const Window &window, const Stats *stats, const float font_size, bool explicit_update) : - sample{sample_}, - content_scale_factor{window.get_content_scale_factor()}, - dpi_factor{window.get_dpi_factor() * content_scale_factor}, - explicit_update{explicit_update}, - stats_view(stats) -{ - ImGui::CreateContext(); - - ImGuiStyle &style = ImGui::GetStyle(); - - // Color scheme - style.Colors[ImGuiCol_WindowBg] = ImVec4(0.005f, 0.005f, 0.005f, 0.94f); - style.Colors[ImGuiCol_TitleBg] = ImVec4(1.0f, 0.0f, 0.0f, 0.6f); - style.Colors[ImGuiCol_TitleBgActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); - style.Colors[ImGuiCol_MenuBarBg] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_Header] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_HeaderActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_HeaderHovered] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_FrameBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.8f); - style.Colors[ImGuiCol_CheckMark] = ImVec4(0.0f, 1.0f, 0.0f, 1.0f); - style.Colors[ImGuiCol_SliderGrab] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); - style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(1.0f, 1.0f, 1.0f, 0.1f); - style.Colors[ImGuiCol_FrameBgActive] = ImVec4(1.0f, 1.0f, 1.0f, 0.2f); - style.Colors[ImGuiCol_Button] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_ButtonHovered] = ImVec4(1.0f, 0.0f, 0.0f, 0.6f); - style.Colors[ImGuiCol_ButtonActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); - - // Borderless window - style.WindowBorderSize = 0.0f; - - // Global scale - style.ScaleAllSizes(dpi_factor); - - // Dimensions - ImGuiIO &io = ImGui::GetIO(); - auto extent = sample.get_render_context().get_surface_extent(); - io.DisplaySize.x = static_cast(extent.width); - io.DisplaySize.y = static_cast(extent.height); - io.FontGlobalScale = 1.0f; - io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); - - // Enable keyboard navigation - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; - io.KeyMap[ImGuiKey_Space] = static_cast(KeyCode::Space); - io.KeyMap[ImGuiKey_Enter] = static_cast(KeyCode::Enter); - io.KeyMap[ImGuiKey_LeftArrow] = static_cast(KeyCode::Left); - io.KeyMap[ImGuiKey_RightArrow] = static_cast(KeyCode::Right); - io.KeyMap[ImGuiKey_UpArrow] = static_cast(KeyCode::Up); - io.KeyMap[ImGuiKey_DownArrow] = static_cast(KeyCode::Down); - io.KeyMap[ImGuiKey_Tab] = static_cast(KeyCode::Tab); - io.KeyMap[ImGuiKey_Escape] = static_cast(KeyCode::Backspace); - - // Default font - fonts.emplace_back(default_font, font_size * dpi_factor); - - // Debug window font - fonts.emplace_back("RobotoMono-Regular", (font_size / 2) * dpi_factor); - - // Create font texture - unsigned char *font_data; - int tex_width, tex_height; - io.Fonts->GetTexDataAsRGBA32(&font_data, &tex_width, &tex_height); - size_t upload_size = tex_width * tex_height * 4 * sizeof(char); - - auto &device = sample.get_render_context().get_device(); - - // Create target image for copy - VkExtent3D font_extent{to_u32(tex_width), to_u32(tex_height), 1u}; - - font_image = std::make_unique(device, font_extent, VK_FORMAT_R8G8B8A8_UNORM, - VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, - VMA_MEMORY_USAGE_GPU_ONLY); - font_image->set_debug_name("GUI font image"); - - font_image_view = std::make_unique(*font_image, VK_IMAGE_VIEW_TYPE_2D); - font_image_view->set_debug_name("View on GUI font image"); - - // Upload font data into the vulkan image memory - { - vkb::core::BufferC stage_buffer = vkb::core::BufferC::create_staging_buffer(device, upload_size, font_data); - - auto &command_buffer = device.request_command_buffer(); - - FencePool fence_pool{device}; - - // Begin recording - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, 0); - - { - // Prepare for transfer - ImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - memory_barrier.src_access_mask = 0; - memory_barrier.dst_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_HOST_BIT; - memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; - - command_buffer.image_memory_barrier(*font_image_view, memory_barrier); - } - - // Copy - VkBufferImageCopy buffer_copy_region{}; - buffer_copy_region.imageSubresource.layerCount = font_image_view->get_subresource_range().layerCount; - buffer_copy_region.imageSubresource.aspectMask = font_image_view->get_subresource_range().aspectMask; - buffer_copy_region.imageExtent = font_image->get_extent(); - - command_buffer.copy_buffer_to_image(stage_buffer, *font_image, {buffer_copy_region}); - - { - // Prepare for fragmen shader - ImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.src_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; - memory_barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT; - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; - memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - - command_buffer.image_memory_barrier(*font_image_view, memory_barrier); - } - - // End recording - command_buffer.end(); - - auto &queue = device.get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - - queue.submit(command_buffer, device.request_fence()); - - // Wait for the command buffer to finish its work before destroying the staging buffer - device.get_fence_pool().wait(); - device.get_fence_pool().reset(); - device.get_command_pool().reset_pool(); - } - - // Calculate valid filter - VkFilter filter = VK_FILTER_LINEAR; - vkb::make_filters_valid(device.get_gpu().get_handle(), font_image->get_format(), &filter); - - // Create texture sampler - VkSamplerCreateInfo sampler_info{VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - sampler_info.maxAnisotropy = 1.0f; - sampler_info.magFilter = filter; - sampler_info.minFilter = filter; - sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; - sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; - - vkb::ShaderSource vert_shader("imgui.vert"); - vkb::ShaderSource frag_shader("imgui.frag"); - - std::vector shader_modules; - shader_modules.push_back(&device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, vert_shader, {})); - shader_modules.push_back(&device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, frag_shader, {})); - - pipeline_layout = &device.get_resource_cache().request_pipeline_layout(shader_modules); - - sampler = std::make_unique(device, sampler_info); - sampler->set_debug_name("GUI sampler"); - - if (explicit_update) - { - vertex_buffer = std::make_unique(sample.get_render_context().get_device(), 1, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_TO_CPU); - vertex_buffer->set_debug_name("GUI vertex buffer"); - - index_buffer = std::make_unique(sample.get_render_context().get_device(), 1, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_TO_CPU); - index_buffer->set_debug_name("GUI index buffer"); - } -} - -void Gui::prepare(const VkPipelineCache pipeline_cache, const VkRenderPass render_pass, const std::vector &shader_stages) -{ - // Descriptor pool - std::vector pool_sizes = { - vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1)}; - VkDescriptorPoolCreateInfo descriptorPoolInfo = vkb::initializers::descriptor_pool_create_info(pool_sizes, 2); - VK_CHECK(vkCreateDescriptorPool(sample.get_render_context().get_device().get_handle(), &descriptorPoolInfo, nullptr, &descriptor_pool)); - - // Descriptor set layout - std::vector layout_bindings = { - vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 0), - }; - VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = vkb::initializers::descriptor_set_layout_create_info(layout_bindings); - VK_CHECK(vkCreateDescriptorSetLayout(sample.get_render_context().get_device().get_handle(), &descriptor_set_layout_create_info, nullptr, &descriptor_set_layout)); - - // Descriptor set - VkDescriptorSetAllocateInfo descriptor_allocation = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &descriptor_set_layout, 1); - VK_CHECK(vkAllocateDescriptorSets(sample.get_render_context().get_device().get_handle(), &descriptor_allocation, &descriptor_set)); - VkDescriptorImageInfo font_descriptor = vkb::initializers::descriptor_image_info( - sampler->get_handle(), - font_image_view->get_handle(), - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - std::vector write_descriptor_sets = { - vkb::initializers::write_descriptor_set(descriptor_set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &font_descriptor)}; - vkUpdateDescriptorSets(sample.get_render_context().get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr); - - // Setup graphics pipeline for UI rendering - VkPipelineInputAssemblyStateCreateInfo input_assembly_state = - vkb::initializers::pipeline_input_assembly_state_create_info(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE); - - VkPipelineRasterizationStateCreateInfo rasterization_state = - vkb::initializers::pipeline_rasterization_state_create_info(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_COUNTER_CLOCKWISE); - - // Enable blending - VkPipelineColorBlendAttachmentState blend_attachment_state{}; - blend_attachment_state.blendEnable = VK_TRUE; - blend_attachment_state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - blend_attachment_state.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; - blend_attachment_state.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - blend_attachment_state.colorBlendOp = VK_BLEND_OP_ADD; - blend_attachment_state.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - blend_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; - blend_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD; - - VkPipelineColorBlendStateCreateInfo color_blend_state = - vkb::initializers::pipeline_color_blend_state_create_info(1, &blend_attachment_state); - - VkPipelineDepthStencilStateCreateInfo depth_stencil_state = - vkb::initializers::pipeline_depth_stencil_state_create_info(VK_FALSE, VK_FALSE, VK_COMPARE_OP_ALWAYS); - - VkPipelineViewportStateCreateInfo viewport_state = - vkb::initializers::pipeline_viewport_state_create_info(1, 1, 0); - - VkPipelineMultisampleStateCreateInfo multisample_state = - vkb::initializers::pipeline_multisample_state_create_info(VK_SAMPLE_COUNT_1_BIT); - - std::vector dynamic_state_enables = { - VK_DYNAMIC_STATE_VIEWPORT, - VK_DYNAMIC_STATE_SCISSOR}; - VkPipelineDynamicStateCreateInfo dynamic_state = - vkb::initializers::pipeline_dynamic_state_create_info(dynamic_state_enables); - - VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(pipeline_layout->get_handle(), render_pass); - - pipeline_create_info.pInputAssemblyState = &input_assembly_state; - pipeline_create_info.pRasterizationState = &rasterization_state; - pipeline_create_info.pColorBlendState = &color_blend_state; - pipeline_create_info.pMultisampleState = &multisample_state; - pipeline_create_info.pViewportState = &viewport_state; - pipeline_create_info.pDepthStencilState = &depth_stencil_state; - pipeline_create_info.pDynamicState = &dynamic_state; - pipeline_create_info.stageCount = static_cast(shader_stages.size()); - pipeline_create_info.pStages = shader_stages.data(); - pipeline_create_info.subpass = subpass; - - // Vertex bindings an attributes based on ImGui vertex definition - std::vector vertex_input_bindings = { - vkb::initializers::vertex_input_binding_description(0, sizeof(ImDrawVert), VK_VERTEX_INPUT_RATE_VERTEX), - }; - std::vector vertex_input_attributes = { - vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32_SFLOAT, offsetof(ImDrawVert, pos)), // Location 0: Position - vkb::initializers::vertex_input_attribute_description(0, 1, VK_FORMAT_R32G32_SFLOAT, offsetof(ImDrawVert, uv)), // Location 1: UV - vkb::initializers::vertex_input_attribute_description(0, 2, VK_FORMAT_R8G8B8A8_UNORM, offsetof(ImDrawVert, col)), // Location 0: Color - }; - VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info = vkb::initializers::pipeline_vertex_input_state_create_info(); - vertex_input_state_create_info.vertexBindingDescriptionCount = static_cast(vertex_input_bindings.size()); - vertex_input_state_create_info.pVertexBindingDescriptions = vertex_input_bindings.data(); - vertex_input_state_create_info.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); - vertex_input_state_create_info.pVertexAttributeDescriptions = vertex_input_attributes.data(); - - pipeline_create_info.pVertexInputState = &vertex_input_state_create_info; - - VK_CHECK(vkCreateGraphicsPipelines(sample.get_render_context().get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline)); -} // namespace vkb - -void Gui::update(const float delta_time) -{ - if (visible != prev_visible) - { - drawer.set_dirty(true); - prev_visible = visible; - } - - if (!visible) - { - ImGui::EndFrame(); - return; - } - - // Update imGui - ImGuiIO &io = ImGui::GetIO(); - auto extent = sample.get_render_context().get_surface_extent(); - resize(extent.width, extent.height); - io.DeltaTime = delta_time; - - // Render to generate draw buffers - ImGui::Render(); -} - -bool Gui::update_buffers() -{ - ImDrawData *draw_data = ImGui::GetDrawData(); - bool updated = false; - - if (!draw_data) - { - return false; - } - - size_t vertex_buffer_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); - size_t index_buffer_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); - - if ((vertex_buffer_size == 0) || (index_buffer_size == 0)) - { - return false; - } - - if ((vertex_buffer->get_handle() == VK_NULL_HANDLE) || (vertex_buffer_size != last_vertex_buffer_size)) - { - last_vertex_buffer_size = vertex_buffer_size; - updated = true; - - vertex_buffer.reset(); - vertex_buffer = std::make_unique(sample.get_render_context().get_device(), vertex_buffer_size, - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VMA_MEMORY_USAGE_GPU_TO_CPU); - vertex_buffer->set_debug_name("GUI vertex buffer"); - } - - if ((index_buffer->get_handle() == VK_NULL_HANDLE) || (index_buffer_size != last_index_buffer_size)) - { - last_index_buffer_size = index_buffer_size; - updated = true; - - index_buffer.reset(); - index_buffer = std::make_unique(sample.get_render_context().get_device(), index_buffer_size, - VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VMA_MEMORY_USAGE_GPU_TO_CPU); - index_buffer->set_debug_name("GUI index buffer"); - } - - // Upload data - upload_draw_data(draw_data, vertex_buffer->map(), index_buffer->map()); - - vertex_buffer->flush(); - index_buffer->flush(); - - vertex_buffer->unmap(); - index_buffer->unmap(); - - return updated; -} - -void Gui::update_buffers(CommandBuffer &command_buffer, RenderFrame &render_frame) -{ - ImDrawData *draw_data = ImGui::GetDrawData(); - - if (!draw_data) - { - return; - } - - size_t vertex_buffer_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); - size_t index_buffer_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); - - if ((vertex_buffer_size == 0) || (index_buffer_size == 0)) - { - return; - } - - std::vector vertex_data(vertex_buffer_size); - std::vector index_data(index_buffer_size); - - upload_draw_data(draw_data, vertex_data.data(), index_data.data()); - - auto vertex_allocation = sample.get_render_context().get_active_frame().allocate_buffer(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, vertex_buffer_size); - - vertex_allocation.update(vertex_data); - - std::vector> buffers; - buffers.emplace_back(std::ref(vertex_allocation.get_buffer())); - - std::vector offsets{vertex_allocation.get_offset()}; - - command_buffer.bind_vertex_buffers(0, buffers, offsets); - - auto index_allocation = sample.get_render_context().get_active_frame().allocate_buffer(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, index_buffer_size); - - index_allocation.update(index_data); - - command_buffer.bind_index_buffer(index_allocation.get_buffer(), index_allocation.get_offset(), VK_INDEX_TYPE_UINT16); -} - -void Gui::resize(const uint32_t width, const uint32_t height) const -{ - auto &io = ImGui::GetIO(); - io.DisplaySize.x = static_cast(width); - io.DisplaySize.y = static_cast(height); -} - -void Gui::draw(CommandBuffer &command_buffer) -{ - if (!visible) - { - return; - } - - ScopedDebugLabel debug_label{command_buffer, "GUI"}; - - // Vertex input state - VkVertexInputBindingDescription vertex_input_binding{}; - vertex_input_binding.stride = to_u32(sizeof(ImDrawVert)); - - // Location 0: Position - VkVertexInputAttributeDescription pos_attr{}; - pos_attr.format = VK_FORMAT_R32G32_SFLOAT; - pos_attr.offset = to_u32(offsetof(ImDrawVert, pos)); - - // Location 1: UV - VkVertexInputAttributeDescription uv_attr{}; - uv_attr.location = 1; - uv_attr.format = VK_FORMAT_R32G32_SFLOAT; - uv_attr.offset = to_u32(offsetof(ImDrawVert, uv)); - - // Location 2: Color - VkVertexInputAttributeDescription col_attr{}; - col_attr.location = 2; - col_attr.format = VK_FORMAT_R8G8B8A8_UNORM; - col_attr.offset = to_u32(offsetof(ImDrawVert, col)); - - VertexInputState vertex_input_state{}; - vertex_input_state.bindings = {vertex_input_binding}; - vertex_input_state.attributes = {pos_attr, uv_attr, col_attr}; - - command_buffer.set_vertex_input_state(vertex_input_state); - - // Blend state - vkb::ColorBlendAttachmentState color_attachment{}; - color_attachment.blend_enable = VK_TRUE; - color_attachment.color_write_mask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT; - color_attachment.src_color_blend_factor = VK_BLEND_FACTOR_SRC_ALPHA; - color_attachment.dst_color_blend_factor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - color_attachment.src_alpha_blend_factor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - - vkb::ColorBlendState blend_state{}; - blend_state.attachments = {color_attachment}; - - command_buffer.set_color_blend_state(blend_state); - - vkb::RasterizationState rasterization_state{}; - rasterization_state.cull_mode = VK_CULL_MODE_NONE; - command_buffer.set_rasterization_state(rasterization_state); - - vkb::DepthStencilState depth_state{}; - depth_state.depth_test_enable = VK_FALSE; - depth_state.depth_write_enable = VK_FALSE; - command_buffer.set_depth_stencil_state(depth_state); - - // Bind pipeline layout - command_buffer.bind_pipeline_layout(*pipeline_layout); - - command_buffer.bind_image(*font_image_view, *sampler, 0, 0, 0); - - // Pre-rotation - auto &io = ImGui::GetIO(); - auto push_transform = glm::mat4(1.0f); - - if (sample.get_render_context().has_swapchain()) - { - auto transform = sample.get_render_context().get_swapchain().get_transform(); - - glm::vec3 rotation_axis = glm::vec3(0.0f, 0.0f, 1.0f); - if (transform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) - { - push_transform = glm::rotate(push_transform, glm::radians(90.0f), rotation_axis); - } - else if (transform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) - { - push_transform = glm::rotate(push_transform, glm::radians(270.0f), rotation_axis); - } - else if (transform & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR) - { - push_transform = glm::rotate(push_transform, glm::radians(180.0f), rotation_axis); - } - } - - // GUI coordinate space to screen space - push_transform = glm::translate(push_transform, glm::vec3(-1.0f, -1.0f, 0.0f)); - push_transform = glm::scale(push_transform, glm::vec3(2.0f / io.DisplaySize.x, 2.0f / io.DisplaySize.y, 0.0f)); - - // Push constants - command_buffer.push_constants(push_transform); - - // If a render context is used, then use the frames buffer pools to allocate GUI vertex/index data from - if (!explicit_update) - { - update_buffers(command_buffer, sample.get_render_context().get_active_frame()); - } - else - { - std::vector> buffers; - buffers.push_back(*vertex_buffer); - command_buffer.bind_vertex_buffers(0, buffers, {0}); - - command_buffer.bind_index_buffer(*index_buffer, 0, VK_INDEX_TYPE_UINT16); - } - - // Render commands - ImDrawData *draw_data = ImGui::GetDrawData(); - int32_t vertex_offset = 0; - uint32_t index_offset = 0; - - if (!draw_data || draw_data->CmdListsCount == 0) - { - return; - } - - for (int32_t i = 0; i < draw_data->CmdListsCount; i++) - { - const ImDrawList *cmd_list = draw_data->CmdLists[i]; - for (int32_t j = 0; j < cmd_list->CmdBuffer.Size; j++) - { - const ImDrawCmd *cmd = &cmd_list->CmdBuffer[j]; - VkRect2D scissor_rect; - scissor_rect.offset.x = std::max(static_cast(cmd->ClipRect.x), 0); - scissor_rect.offset.y = std::max(static_cast(cmd->ClipRect.y), 0); - scissor_rect.extent.width = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - scissor_rect.extent.height = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - - // Adjust for pre-rotation if necessary - if (sample.get_render_context().has_swapchain()) - { - auto transform = sample.get_render_context().get_swapchain().get_transform(); - if (transform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) - { - scissor_rect.offset.x = static_cast(io.DisplaySize.y - cmd->ClipRect.w); - scissor_rect.offset.y = static_cast(cmd->ClipRect.x); - scissor_rect.extent.width = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - scissor_rect.extent.height = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - } - else if (transform & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR) - { - scissor_rect.offset.x = static_cast(io.DisplaySize.x - cmd->ClipRect.z); - scissor_rect.offset.y = static_cast(io.DisplaySize.y - cmd->ClipRect.w); - scissor_rect.extent.width = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - scissor_rect.extent.height = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - } - else if (transform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) - { - scissor_rect.offset.x = static_cast(cmd->ClipRect.y); - scissor_rect.offset.y = static_cast(io.DisplaySize.x - cmd->ClipRect.z); - scissor_rect.extent.width = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - scissor_rect.extent.height = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - } - } - - command_buffer.set_scissor(0, {scissor_rect}); - command_buffer.draw_indexed(cmd->ElemCount, 1, index_offset, vertex_offset, 0); - index_offset += cmd->ElemCount; - } - vertex_offset += cmd_list->VtxBuffer.Size; - } -} - -void Gui::draw(VkCommandBuffer command_buffer) -{ - if (!visible) - { - return; - } - - auto &io = ImGui::GetIO(); - ImDrawData *draw_data = ImGui::GetDrawData(); - int32_t vertex_offset = 0; - int32_t index_offset = 0; - - if ((!draw_data) || (draw_data->CmdListsCount == 0)) - { - return; - } - - vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); - vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout->get_handle(), 0, 1, &descriptor_set, 0, NULL); - - // Push constants - auto push_transform = glm::mat4(1.0f); - push_transform = glm::translate(push_transform, glm::vec3(-1.0f, -1.0f, 0.0f)); - push_transform = glm::scale(push_transform, glm::vec3(2.0f / io.DisplaySize.x, 2.0f / io.DisplaySize.y, 0.0f)); - vkCmdPushConstants(command_buffer, pipeline_layout->get_handle(), VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &push_transform); - - VkDeviceSize offsets[1] = {0}; - - VkBuffer vertex_buffer_handle = vertex_buffer->get_handle(); - vkCmdBindVertexBuffers(command_buffer, 0, 1, &vertex_buffer_handle, offsets); - - VkBuffer index_buffer_handle = index_buffer->get_handle(); - vkCmdBindIndexBuffer(command_buffer, index_buffer_handle, 0, VK_INDEX_TYPE_UINT16); - - for (int32_t i = 0; i < draw_data->CmdListsCount; i++) - { - const ImDrawList *cmd_list = draw_data->CmdLists[i]; - for (int32_t j = 0; j < cmd_list->CmdBuffer.Size; j++) - { - const ImDrawCmd *cmd = &cmd_list->CmdBuffer[j]; - VkRect2D scissor_rect; - scissor_rect.offset.x = std::max(static_cast(cmd->ClipRect.x), 0); - scissor_rect.offset.y = std::max(static_cast(cmd->ClipRect.y), 0); - scissor_rect.extent.width = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - scissor_rect.extent.height = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - - vkCmdSetScissor(command_buffer, 0, 1, &scissor_rect); - vkCmdDrawIndexed(command_buffer, cmd->ElemCount, 1, index_offset, vertex_offset, 0); - index_offset += cmd->ElemCount; - } - vertex_offset += cmd_list->VtxBuffer.Size; - } -} - -Gui::~Gui() -{ - vkDestroyDescriptorPool(sample.get_render_context().get_device().get_handle(), descriptor_pool, nullptr); - vkDestroyDescriptorSetLayout(sample.get_render_context().get_device().get_handle(), descriptor_set_layout, nullptr); - vkDestroyPipeline(sample.get_render_context().get_device().get_handle(), pipeline, nullptr); - - ImGui::DestroyContext(); -} - -void Gui::show_demo_window() -{ - ImGui::ShowDemoWindow(); -} - -Gui::StatsView &Gui::get_stats_view() -{ - return stats_view; -} - -Drawer &Gui::get_drawer() -{ - return drawer; -} - -Font &Gui::get_font(const std::string &font_name) -{ - assert(!fonts.empty() && "No fonts exist"); - - auto it = std::find_if(fonts.begin(), fonts.end(), [&font_name](Font &font) { return font.name == font_name; }); - - if (it != fonts.end()) - { - return *it; - } - else - { - LOGW("Couldn't find font with name {}", font_name); - return *fonts.begin(); - } -} - -bool Gui::is_debug_view_active() const -{ - return debug_view.active; -} - -void Gui::set_subpass(const uint32_t subpass) -{ - this->subpass = subpass; -} - -Gui::StatsView::StatsView(const Stats *stats) -{ - if (stats == nullptr) - { - return; - } - - // Request graph data information for each stat and record it in graph_map - const std::set &indices = stats->get_requested_stats(); - - for (StatIndex i : indices) - { - graph_map[i] = stats->get_graph_data(i); - } -} - -void Gui::StatsView::reset_max_value(const StatIndex index) -{ - auto pr = graph_map.find(index); - if (pr != graph_map.end()) - { - reset_graph_max_value(pr->second); - } -} - -void Gui::StatsView::reset_max_values() -{ - // For every entry in the map - std::for_each(graph_map.begin(), - graph_map.end(), - [](auto &pr) { reset_graph_max_value(pr.second); }); -} - -void Gui::show_top_window(const std::string &app_name, const Stats *stats, DebugInfo *debug_info) -{ - // Transparent background - ImGui::SetNextWindowBgAlpha(overlay_alpha); - ImVec2 size{ImGui::GetIO().DisplaySize.x, 0.0f}; - ImGui::SetNextWindowSize(size, ImGuiCond_Always); - - // Top left - ImVec2 pos{0.0f, 0.0f}; - ImGui::SetNextWindowPos(pos, ImGuiCond_Always); - - bool is_open = true; - ImGui::Begin("Top", &is_open, common_flags); - - show_app_info(app_name); - - if (stats) - { - show_stats(*stats); - - // Reset max values if user taps on this window - if (ImGui::IsWindowHovered() && ImGui::IsMouseClicked(0 /* left */)) - { - stats_view.reset_max_values(); - } - } - - if (debug_info) - { - if (debug_view.active) - { - show_debug_window(*debug_info, ImVec2{0, ImGui::GetWindowSize().y}); - } - } - - ImGui::End(); -} - -void Gui::show_app_info(const std::string &app_name) -{ - // Sample name - ImGui::Text("%s", app_name.c_str()); - - // GPU name - auto &device = sample.get_render_context().get_device(); - auto device_name_label = "GPU: " + std::string(device.get_gpu().get_properties().deviceName); - ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize(device_name_label.c_str()).x); - ImGui::Text("%s", device_name_label.c_str()); -} - -void Gui::show_debug_window(DebugInfo &debug_info, const ImVec2 &position) -{ - auto &io = ImGui::GetIO(); - auto &style = ImGui::GetStyle(); - auto &font = get_font("RobotoMono-Regular"); - - // Calculate only once - if (debug_view.label_column_width == 0) - { - debug_view.label_column_width = style.ItemInnerSpacing.x + debug_info.get_longest_label() * font.size / debug_view.scale; - } - - ImGui::SetNextWindowBgAlpha(overlay_alpha); - ImGui::SetNextWindowPos(position, ImGuiCond_FirstUseEver); - ImGui::SetNextWindowContentSize(ImVec2{io.DisplaySize.x, 0.0f}); - - bool is_open = true; - const ImGuiWindowFlags flags = ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoNav; - - ImGui::Begin("Debug Window", &is_open, flags); - ImGui::PushFont(font.handle); - - auto field_count = debug_info.get_fields().size() > debug_view.max_fields ? debug_view.max_fields : debug_info.get_fields().size(); - - ImGui::BeginChild("Table", ImVec2(0, field_count * (font.size + style.ItemSpacing.y)), false); - ImGui::Columns(2); - ImGui::SetColumnWidth(0, debug_view.label_column_width); - ImGui::SetColumnWidth(1, io.DisplaySize.x - debug_view.label_column_width); - for (auto &field : debug_info.get_fields()) - { - const std::string &label = field->label; - const std::string &value = field->to_string(); - ImGui::Text("%s", label.c_str()); - ImGui::NextColumn(); - ImGui::Text(" %s", value.c_str()); - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::EndChild(); - - ImGui::PopFont(); - ImGui::End(); -} - -void Gui::show_stats(const Stats &stats) -{ - for (const auto &stat_index : stats.get_requested_stats()) - { - // Find the graph data of this stat index - auto pr = stats_view.graph_map.find(stat_index); - - assert(pr != stats_view.graph_map.end() && "StatIndex not implemented in gui graph_map"); - - // Draw graph - auto &graph_data = pr->second; - const auto &graph_elements = stats.get_data(stat_index); - float graph_min = 0.0f; - float &graph_max = graph_data.max_value; - - if (!graph_data.has_fixed_max) - { - auto new_max = *std::max_element(graph_elements.begin(), graph_elements.end()) * stats_view.top_padding; - if (new_max > graph_max) - { - graph_max = new_max; - } - } - - const ImVec2 graph_size = ImVec2{ - ImGui::GetIO().DisplaySize.x, - stats_view.graph_height /* dpi */ * dpi_factor}; - - std::stringstream graph_label; - float avg = std::accumulate(graph_elements.begin(), graph_elements.end(), 0.0f) / graph_elements.size(); - - // Check if the stat is available in the current platform - if (stats.is_available(stat_index)) - { - graph_label << fmt::format(graph_data.name + ": " + graph_data.format, avg * graph_data.scale_factor); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PlotLines("", &graph_elements[0], static_cast(graph_elements.size()), 0, graph_label.str().c_str(), graph_min, graph_max, graph_size); - ImGui::PopItemFlag(); - } - else - { - graph_label << graph_data.name << ": not available"; - ImGui::Text("%s", graph_label.str().c_str()); - } - } -} - -void Gui::show_options_window(std::function body, const uint32_t lines) -{ - // Add padding around the text so that the options are not - // too close to the edges and are easier to interact with. - // Also add double vertical padding to avoid rounded corners. - const float window_padding = ImGui::CalcTextSize("T").x; - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{window_padding, window_padding * 2.0f}); - auto window_height = lines * ImGui::GetTextLineHeightWithSpacing() + ImGui::GetStyle().WindowPadding.y * 2.0f; - auto window_width = ImGui::GetIO().DisplaySize.x; - ImGui::SetNextWindowBgAlpha(overlay_alpha); - const ImVec2 size = ImVec2(window_width, 0); - ImGui::SetNextWindowSize(size, ImGuiCond_Always); - const ImVec2 pos = ImVec2(0.0f, ImGui::GetIO().DisplaySize.y - window_height); - ImGui::SetNextWindowPos(pos, ImGuiCond_Always); - const ImGuiWindowFlags flags = (ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_AlwaysUseWindowPadding | - ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoFocusOnAppearing); - bool is_open = true; - ImGui::Begin("Options", &is_open, flags); - body(); - ImGui::End(); - ImGui::PopStyleVar(); -} - -void Gui::show_simple_window(const std::string &name, uint32_t last_fps, std::function body) -{ - ImGuiIO &io = ImGui::GetIO(); - - ImGui::NewFrame(); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - ImGui::SetNextWindowPos(ImVec2(10, 10)); - ImGui::SetNextWindowSize(ImVec2(0, 0), ImGuiCond_FirstUseEver); - ImGui::Begin("Vulkan Example", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); - ImGui::TextUnformatted(name.c_str()); - ImGui::TextUnformatted(std::string(sample.get_render_context().get_device().get_gpu().get_properties().deviceName).c_str()); - ImGui::Text("%.2f ms/frame (%.1d fps)", (1000.0f / last_fps), last_fps); - ImGui::PushItemWidth(110.0f * dpi_factor); - - body(); - - ImGui::PopItemWidth(); - ImGui::End(); - ImGui::PopStyleVar(); -} - -bool Gui::input_event(const InputEvent &input_event) -{ - auto &io = ImGui::GetIO(); - auto capture_move_event = false; - - if (input_event.get_source() == EventSource::Keyboard) - { - const auto &key_event = static_cast(input_event); - - if (key_event.get_action() == KeyAction::Down) - { - io.KeysDown[static_cast(key_event.get_code())] = true; - } - else if (key_event.get_action() == KeyAction::Up) - { - io.KeysDown[static_cast(key_event.get_code())] = false; - } - } - else if (input_event.get_source() == EventSource::Mouse) - { - const auto &mouse_button = static_cast(input_event); - - io.MousePos = ImVec2{mouse_button.get_pos_x() * content_scale_factor, - mouse_button.get_pos_y() * content_scale_factor}; - - auto button_id = static_cast(mouse_button.get_button()); - - if (mouse_button.get_action() == MouseAction::Down) - { - io.MouseDown[button_id] = true; - } - else if (mouse_button.get_action() == MouseAction::Up) - { - io.MouseDown[button_id] = false; - } - else if (mouse_button.get_action() == MouseAction::Move) - { - capture_move_event = io.WantCaptureMouse; - } - } - else if (input_event.get_source() == EventSource::Touchscreen) - { - const auto &touch_event = static_cast(input_event); - - io.MousePos = ImVec2{touch_event.get_pos_x(), touch_event.get_pos_y()}; - - if (touch_event.get_action() == TouchAction::Down) - { - io.MouseDown[touch_event.get_pointer_id()] = true; - } - else if (touch_event.get_action() == TouchAction::Up) - { - io.MouseDown[touch_event.get_pointer_id()] = false; - } - else if (touch_event.get_action() == TouchAction::Move) - { - capture_move_event = io.WantCaptureMouse; - } - } - - // Toggle debug UI view when tap or clicking outside the GUI windows - if (!io.WantCaptureMouse) - { - bool press_down = (input_event.get_source() == EventSource::Mouse && static_cast(input_event).get_action() == MouseAction::Down) || (input_event.get_source() == EventSource::Touchscreen && static_cast(input_event).get_action() == TouchAction::Down); - bool press_up = (input_event.get_source() == EventSource::Mouse && static_cast(input_event).get_action() == MouseAction::Up) || (input_event.get_source() == EventSource::Touchscreen && static_cast(input_event).get_action() == TouchAction::Up); - - if (press_down) - { - timer.start(); - if (input_event.get_source() == EventSource::Touchscreen) - { - const auto &touch_event = static_cast(input_event); - if (touch_event.get_touch_points() == 2) - { - two_finger_tap = true; - } - } - } - if (press_up) - { - auto press_delta = timer.stop(); - if (press_delta < press_time_ms) - { - if (input_event.get_source() == EventSource::Mouse) - { - const auto &mouse_button = static_cast(input_event); - if (mouse_button.get_button() == MouseButton::Right) - { - debug_view.active = !debug_view.active; - } - } - else if (input_event.get_source() == EventSource::Touchscreen) - { - const auto &touch_event = static_cast(input_event); - if (two_finger_tap && touch_event.get_touch_points() == 2) - { - debug_view.active = !debug_view.active; - } - else - { - two_finger_tap = false; - } - } - } - } - } - - return capture_move_event; -} - -} // namespace vkb diff --git a/framework/gui.h b/framework/gui.h index 2b1daaa7f9..7ea95faaec 100644 --- a/framework/gui.h +++ b/framework/gui.h @@ -1,5 +1,6 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,27 +19,42 @@ #pragma once -#include -#include -#include -#include -#include -#include - -#include "core/buffer.h" +#include "common/vk_common.h" #include "core/command_buffer.h" -#include "core/sampler.h" +#include "core/hpp_debug.h" +#include "core/hpp_sampler.h" #include "debug_info.h" #include "drawer.h" #include "filesystem/legacy.h" #include "platform/input_events.h" -#include "rendering/render_context.h" +#include "platform/window.h" +#include "rendering/hpp_pipeline_state.h" +#include "stats/hpp_stats.h" #include "stats/stats.h" -#include "vulkan_sample.h" +#include +#include +#include +#include + +#if defined(PLATFORM__MACOS) +# include +#endif namespace vkb { -class Window; + +namespace +{ +inline void reset_graph_max_value(StatGraphData &graph_data) +{ + // If it does not have a fixed max + if (!graph_data.has_fixed_max) + { + // Reset it + graph_data.max_value = 0.0f; + } +} +} // namespace /** * @brief Helper structure for fonts loaded from TTF @@ -47,13 +63,11 @@ struct Font { /** * @brief Constructor - * @param name The name of the font file that exists within 'assets/fonts' (without extension) - * @param size The font size, scaled by DPI + * @param name_ The name of the font file that exists within 'assets/fonts' (without extension) + * @param size_ The font size, scaled by DPI */ - Font(const std::string &name, float size) : - name{name}, - data{vkb::fs::read_asset("fonts/" + name + ".ttf")}, - size{size} + Font(const std::string &name_, float size_) : + name{name_}, data{vkb::fs::read_asset("fonts/" + name + ".ttf")}, size{size_} { // Keep ownership of the font data to avoid a double delete ImFontConfig font_config{}; @@ -68,21 +82,42 @@ struct Font handle = io.Fonts->AddFontFromMemoryTTF(data.data(), static_cast(data.size()), size, &font_config); } - ImFont *handle{nullptr}; - - std::string name; - + ImFont *handle = nullptr; + std::string name; std::vector data; - - float size{}; + float size = {}; }; /** * @brief Vulkan helper class for Dear ImGui */ +template class Gui { public: + static inline bool visible = true; // Used to show/hide the GUI + + using CommandBufferType = typename std::conditional::type; + using DescriptorSetType = typename std::conditional::type; + using PipelineType = typename std::conditional::type; + using PipelineCacheType = typename std::conditional::type; + using PipelineLayoutType = typename std::conditional::type; + using PipelineShaderStageCreateInfoType = typename std::conditional::type; + using RenderPassType = typename std::conditional::type; + using StatsType = typename std::conditional::type; + + public: + /** + * @brief Helper struct for rendering debug statistics in the GUI + */ + struct DebugView + { + bool active = false; + float scale = 1.7f; + uint32_t max_fields = 8; + float label_column_width = 0; + }; + /** * @brief Helper class for drawing statistics */ @@ -93,102 +128,114 @@ class Gui * @brief Constructs a StatsView * @param stats Const pointer to the Stats data object; may be null */ - StatsView(const Stats *stats); + StatsView(const StatsType *stats); - /** - * @brief Resets the max values for the stats - * which do not have a fixed max - */ - void reset_max_values(); + float get_graph_height() const; + + StatGraphData const &get_stat_graph_data(StatIndex const &index) const; + + float get_top_padding() const; /** * @brief Resets the max value for a specific stat */ void reset_max_value(const StatIndex index); - std::map graph_map; - - float graph_height{50.0f}; - - float top_padding{1.1f}; - }; - - /** - * @brief Helper class for rendering debug statistics in the GUI - */ - class DebugView - { - public: - bool active{false}; - - float scale{1.7f}; - - uint32_t max_fields{8}; + /** + * @brief Resets the max values for the stats which do not have a fixed max + */ + void reset_max_values(); - float label_column_width{0}; + private: + std::map graph_map; + float graph_height = 50.0f; + float top_padding = 1.1f; }; - // The name of the default font file to use - static const std::string default_font; - - struct PushConstBlock - { - glm::vec2 scale; - glm::vec2 translate; - } push_const_block; - - /// Used to show/hide the GUI - static bool visible; - + public: /** * @brief Initializes the Gui - * @param sample A vulkan render context + * @param render_context A vulkan render context * @param window A Window object from which to draw DPI and content scaling information * @param stats A statistics object (null if no statistics are used) * @param font_size The font size * @param explicit_update If true, update buffers every frame */ - Gui(VulkanSampleC &sample, const Window &window, const Stats *stats = nullptr, const float font_size = 21.0f, bool explicit_update = false); + Gui(vkb::rendering::RenderContext &render_context, + Window const &window, + StatsType const *stats = nullptr, + float font_size = 21.0f, + bool explicit_update = false); /** * @brief Destroys the Gui */ ~Gui(); - void prepare(const VkPipelineCache pipeline_cache, const VkRenderPass render_pass, const std::vector &shader_stages); + public: + /** + * @brief Draws the Gui + * @param command_buffer Command buffer to register draw-commands + */ + void draw(CommandBufferType command_buffer); /** - * @brief Handles resizing of the window - * @param width New width of the window - * @param height New height of the window + * @brief Draws the Gui using an external pipeline + * @param command_buffer Command buffer to register draw-commands + * @param pipeline Pipeline to bind to perform draw-commands + * @param pipeline_layout PipelineLayout for given pieline + * @param descriptor_set DescriptorSet to bind to perform draw-commands */ - void resize(const uint32_t width, const uint32_t height) const; + void draw(CommandBufferType command_buffer, PipelineType pipeline, PipelineLayoutType pipeline_layout, DescriptorSetType descriptor_set); /** - * @brief Starts a new ImGui frame - * to be called before drawing any window + * @brief Draws the Gui + * @param command_buffer Command buffer to register draw-commands */ - inline void new_frame(); + void draw(vkb::core::CommandBuffer &command_buffer); + + Drawer &get_drawer(); + + vk::ImageView get_font_image_view() const; + + vk::Sampler get_sampler() const; /** - * @brief Updates the Gui - * @param delta_time Time passed since last update + * @return The stats view */ - void update(const float delta_time); + StatsView &get_stats_view(); - bool update_buffers(); + bool input_event(const InputEvent &input_event); + + bool is_debug_view_active() const; /** - * @brief Draws the Gui - * @param command_buffer Command buffer to register draw-commands + * @brief Starts a new ImGui frame + * to be called before drawing any window */ - void draw(CommandBuffer &command_buffer); + void new_frame(); + + void prepare(PipelineCacheType pipeline_cache, RenderPassType render_pass, std::vector const &shader_stages); /** - * @brief Draws the Gui - * @param command_buffer Command buffer to register draw-commands + * @brief Handles resizing of the window + * @param width New width of the window + * @param height New height of the window */ - void draw(VkCommandBuffer command_buffer); + void resize(const uint32_t width, const uint32_t height) const; + + void set_subpass(const uint32_t subpass); + + /** + * @brief Shows an options windows, to be filled by the sample, + * which will be positioned at the top + * @param body ImGui commands defining the body of the window + * @param lines The number of lines of text to draw in the window + * These will help the gui to calculate the height of the window + */ + void show_options_window(std::function body, const uint32_t lines = 3); + + void show_simple_window(const std::string &name, uint32_t last_fps, std::function body); /** * @brief Shows an overlay top window with app info and maybe stats @@ -196,12 +243,37 @@ class Gui * @param stats Statistics to show (can be null) * @param debug_info Debug info to show (can be null) */ - void show_top_window(const std::string &app_name, const Stats *stats = nullptr, DebugInfo *debug_info = nullptr); + void show_top_window(const std::string &app_name, const StatsType *stats = nullptr, DebugInfo *debug_info = nullptr); /** - * @brief Shows the ImGui Demo window + * @brief Updates the Gui + * @param delta_time Time passed since last update */ - void show_demo_window(); + void update(const float delta_time); + + bool update_buffers(); + + /** + * @brief Shows a child with statistics + * @param stats Statistics to show + */ + void show_stats(const StatsType &stats); + + private: + static constexpr char const *default_font = "Roboto-Regular"; // The name of the default font file to use + static constexpr char const *default_window_font = "RobotoMono-Regular"; // The name of the default window font file to use + static constexpr ImGuiWindowFlags common_flags = ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoFocusOnAppearing; + static constexpr float overlay_alpha = 0.3f; + static constexpr double press_time_ms = 200.0; + + private: + void draw_impl(vk::CommandBuffer command_buffer, vk::Pipeline pipeline, vk::PipelineLayout pipeline_layout, vk::DescriptorSet descriptor_set); + void draw_impl(vkb::core::CommandBufferCpp &command_buffer); + void prepare_impl(vk::PipelineCache pipeline_cache, vk::RenderPass render_pass, std::vector const &shader_stages); + + Font &get_font(const std::string &font_name = Gui::default_font); /** * @brief Shows an child with app info @@ -217,115 +289,1151 @@ class Gui void show_debug_window(DebugInfo &debug_info, const ImVec2 &position); /** - * @brief Shows a child with statistics - * @param stats Statistics to show + * @brief Updates Vulkan buffers + * @param command_buffer Command buffer to draw into + * @return Vertex buffer allocation */ - void show_stats(const Stats &stats); + BufferAllocationCpp update_buffers(vkb::core::CommandBufferCpp &command_buffer); - /** - * @brief Shows an options windows, to be filled by the sample, - * which will be positioned at the top - * @param body ImGui commands defining the body of the window - * @param lines The number of lines of text to draw in the window - * These will help the gui to calculate the height of the window - */ - void show_options_window(std::function body, const uint32_t lines = 3); + void upload_draw_data(const ImDrawData *draw_data, uint8_t *vertex_data, uint8_t *index_data); - void show_simple_window(const std::string &name, uint32_t last_fps, std::function body); + private: + float content_scale_factor = 1.0f; // Scale factor to apply due to a difference between the window and GL pixel sizes + DebugView debug_view; + vk::DescriptorPool descriptor_pool; + vk::DescriptorSet descriptor_set; + vk::DescriptorSetLayout descriptor_set_layout; + float dpi_factor = 1.0f; // Scale factor to apply to the size of gui elements (expressed in dp) + Drawer drawer; + bool explicit_update = false; + std::vector fonts; + std::unique_ptr font_image; + std::unique_ptr font_image_view; + std::unique_ptr index_buffer; + vk::Pipeline pipeline; + vkb::core::HPPPipelineLayout *pipeline_layout = nullptr; + bool prev_visible = true; + vkb::rendering::RenderContextCpp &render_context; + std::unique_ptr sampler; + StatsView stats_view; + uint32_t subpass = 0; + Timer timer; // Used to measure duration of input events + bool two_finger_tap = false; // Whether or not the GUI has detected a multi touch gesture + std::unique_ptr vertex_buffer; +}; - bool input_event(const InputEvent &input_event); +using GuiC = Gui; +using GuiCpp = Gui; + +template +inline Gui::Gui( + vkb::rendering::RenderContext &render_context_, Window const &window, StatsType const *stats, float font_size, bool explicit_update) : + render_context{render_context_}, + content_scale_factor{window.get_content_scale_factor()}, + dpi_factor{window.get_dpi_factor() * content_scale_factor}, + explicit_update{explicit_update}, + stats_view(stats) +{ + ImGui::CreateContext(); + + ImGuiStyle &style = ImGui::GetStyle(); + + // Color scheme + style.Colors[ImGuiCol_WindowBg] = ImVec4(0.005f, 0.005f, 0.005f, 0.94f); + style.Colors[ImGuiCol_TitleBg] = ImVec4(1.0f, 0.0f, 0.0f, 0.6f); + style.Colors[ImGuiCol_TitleBgActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); + style.Colors[ImGuiCol_MenuBarBg] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); + style.Colors[ImGuiCol_Header] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); + style.Colors[ImGuiCol_HeaderActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); + style.Colors[ImGuiCol_HeaderHovered] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); + style.Colors[ImGuiCol_FrameBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.8f); + style.Colors[ImGuiCol_CheckMark] = ImVec4(0.0f, 1.0f, 0.0f, 1.0f); + style.Colors[ImGuiCol_SliderGrab] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); + style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); + style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(1.0f, 1.0f, 1.0f, 0.1f); + style.Colors[ImGuiCol_FrameBgActive] = ImVec4(1.0f, 1.0f, 1.0f, 0.2f); + style.Colors[ImGuiCol_Button] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); + style.Colors[ImGuiCol_ButtonHovered] = ImVec4(1.0f, 0.0f, 0.0f, 0.6f); + style.Colors[ImGuiCol_ButtonActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); + + // Borderless window + style.WindowBorderSize = 0.0f; + + // Global scale + style.ScaleAllSizes(dpi_factor); + + // Dimensions + ImGuiIO &io = ImGui::GetIO(); + auto extent = render_context.get_surface_extent(); + io.DisplaySize.x = static_cast(extent.width); + io.DisplaySize.y = static_cast(extent.height); + io.FontGlobalScale = 1.0f; + io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); + + // Enable keyboard navigation + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; + io.KeyMap[ImGuiKey_Space] = static_cast(KeyCode::Space); + io.KeyMap[ImGuiKey_Enter] = static_cast(KeyCode::Enter); + io.KeyMap[ImGuiKey_LeftArrow] = static_cast(KeyCode::Left); + io.KeyMap[ImGuiKey_RightArrow] = static_cast(KeyCode::Right); + io.KeyMap[ImGuiKey_UpArrow] = static_cast(KeyCode::Up); + io.KeyMap[ImGuiKey_DownArrow] = static_cast(KeyCode::Down); + io.KeyMap[ImGuiKey_Tab] = static_cast(KeyCode::Tab); + io.KeyMap[ImGuiKey_Escape] = static_cast(KeyCode::Backspace); + + // Default font + fonts.emplace_back(default_font, font_size * dpi_factor); + + // Debug window font + fonts.emplace_back(default_window_font, (font_size / 2) * dpi_factor); + + // Create font texture + unsigned char *font_data; + int tex_width, tex_height; + io.Fonts->GetTexDataAsRGBA32(&font_data, &tex_width, &tex_height); + size_t upload_size = tex_width * tex_height * 4 * sizeof(char); + + auto &device = render_context.get_device(); + + // Create target image for copy + vk::Extent3D font_extent{to_u32(tex_width), to_u32(tex_height), 1u}; + + font_image = std::make_unique(device, font_extent, vk::Format::eR8G8B8A8Unorm, + vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst, + VMA_MEMORY_USAGE_GPU_ONLY); + font_image->set_debug_name("GUI font image"); + + font_image_view = std::make_unique(*font_image, vk::ImageViewType::e2D); + font_image_view->set_debug_name("View on GUI font image"); + + // Upload font data into the vulkan image memory + { + vkb::core::BufferCpp stage_buffer = vkb::core::BufferCpp::create_staging_buffer(device, upload_size, font_data); - /** - * @return The stats view - */ - StatsView &get_stats_view(); + auto command_buffer = device.get_command_pool().request_command_buffer(); - Drawer &get_drawer(); + vkb::HPPFencePool fence_pool{device}; - Font &get_font(const std::string &font_name = Gui::default_font); + // Begin recording + command_buffer->begin(vk::CommandBufferUsageFlagBits::eOneTimeSubmit, 0); - bool is_debug_view_active() const; + { + // Prepare for transfer + vkb::common::HPPImageMemoryBarrier memory_barrier = {.src_stage_mask = vk::PipelineStageFlagBits::eHost, + .dst_stage_mask = vk::PipelineStageFlagBits::eTransfer, + .dst_access_mask = vk::AccessFlagBits::eTransferWrite, + .old_layout = vk::ImageLayout::eUndefined, + .new_layout = vk::ImageLayout::eTransferDstOptimal}; + + command_buffer->image_memory_barrier(*font_image_view, memory_barrier); + } - void set_subpass(const uint32_t subpass); + // Copy + vk::BufferImageCopy buffer_copy_region = {.imageSubresource = {.aspectMask = font_image_view->get_subresource_range().aspectMask, + .layerCount = font_image_view->get_subresource_range().layerCount}, + .imageExtent = font_image->get_extent()}; - private: - /** - * @brief Block size of a buffer pool in kilobytes - */ - static constexpr uint32_t BUFFER_POOL_BLOCK_SIZE = 256; + command_buffer->copy_buffer_to_image(stage_buffer, *font_image, {buffer_copy_region}); - /** - * @brief Updates Vulkan buffers - * @param frame Frame to render into - */ - void update_buffers(CommandBuffer &command_buffer, RenderFrame &render_frame); + { + // Prepare for fragment shader + vkb::common::HPPImageMemoryBarrier memory_barrier = {.src_stage_mask = vk::PipelineStageFlagBits::eTransfer, + .dst_stage_mask = vk::PipelineStageFlagBits::eFragmentShader, + .src_access_mask = vk::AccessFlagBits::eTransferWrite, + .dst_access_mask = vk::AccessFlagBits::eShaderRead, + .old_layout = vk::ImageLayout::eTransferDstOptimal, + .new_layout = vk::ImageLayout::eShaderReadOnlyOptimal}; + + command_buffer->image_memory_barrier(*font_image_view, memory_barrier); + } + + // End recording + command_buffer->end(); + + auto &queue = device.get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0); + + queue.submit(*command_buffer, device.get_fence_pool().request_fence()); + + // Wait for the command buffer to finish its work before destroying the staging buffer + device.get_fence_pool().wait(); + device.get_fence_pool().reset(); + device.get_command_pool().reset_pool(); + } + + // Calculate valid filter + vk::Filter filter = vk::Filter::eLinear; + vkb::common::make_filters_valid(device.get_gpu().get_handle(), font_image->get_format(), &filter); + + // Load shaders + vkb::core::HPPShaderSource vert_shader("imgui.vert.spv"); + vkb::core::HPPShaderSource frag_shader("imgui.frag.spv"); + + std::vector shader_modules; + shader_modules.push_back(&device.get_resource_cache().request_shader_module(vk::ShaderStageFlagBits::eVertex, vert_shader, {})); + shader_modules.push_back(&device.get_resource_cache().request_shader_module(vk::ShaderStageFlagBits::eFragment, frag_shader, {})); + + pipeline_layout = &device.get_resource_cache().request_pipeline_layout(shader_modules); + + // Create texture sampler + vk::SamplerCreateInfo sampler_info = {.magFilter = filter, + .minFilter = filter, + .mipmapMode = vk::SamplerMipmapMode::eNearest, + .addressModeU = vk::SamplerAddressMode::eClampToEdge, + .addressModeV = vk::SamplerAddressMode::eClampToEdge, + .addressModeW = vk::SamplerAddressMode::eClampToEdge, + .borderColor = vk::BorderColor::eFloatOpaqueWhite}; + + sampler = std::make_unique(device, sampler_info); + sampler->set_debug_name("GUI sampler"); + + if (explicit_update) + { + vertex_buffer = + std::make_unique(render_context.get_device(), 1, vk::BufferUsageFlagBits::eVertexBuffer, VMA_MEMORY_USAGE_GPU_TO_CPU); + vertex_buffer->set_debug_name("GUI vertex buffer"); + + index_buffer = std::make_unique(render_context.get_device(), 1, vk::BufferUsageFlagBits::eIndexBuffer, VMA_MEMORY_USAGE_GPU_TO_CPU); + index_buffer->set_debug_name("GUI index buffer"); + } +} + +template +inline Gui::~Gui() +{ + vk::Device device = render_context.get_device().get_handle(); + device.destroyDescriptorPool(descriptor_pool); + device.destroyDescriptorSetLayout(descriptor_set_layout); + device.destroyPipeline(pipeline); + + ImGui::DestroyContext(); +} + +template +inline void Gui::draw(CommandBufferType command_buffer) +{ + draw(command_buffer, pipeline, pipeline_layout->get_handle(), descriptor_set); +} + +template +inline void + Gui::draw(CommandBufferType command_buffer, PipelineType pipeline, PipelineLayoutType pipeline_layout, DescriptorSetType descriptor_set) +{ + if constexpr (bindingType == BindingType::Cpp) + { + draw_impl(command_buffer, pipeline, pipeline_layout, descriptor_set); + } + else + { + draw_impl(static_cast(command_buffer), + static_cast(pipeline), + static_cast(pipeline_layout), + static_cast(descriptor_set)); + } +} + +template +inline void + Gui::draw_impl(vk::CommandBuffer command_buffer, vk::Pipeline pipeline, vk::PipelineLayout pipeline_layout, vk::DescriptorSet descriptor_set) +{ + if (!visible) + { + return; + } + + ImDrawData *draw_data = ImGui::GetDrawData(); + if ((!draw_data) || (draw_data->CmdListsCount == 0)) + { + return; + } - static const double press_time_ms; + command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); + command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline_layout, 0, descriptor_set, {}); - static const float overlay_alpha; + // Push constants + auto &io = ImGui::GetIO(); + auto push_transform = glm::mat4(1.0f); + push_transform = glm::translate(push_transform, glm::vec3(-1.0f, -1.0f, 0.0f)); + push_transform = glm::scale(push_transform, glm::vec3(2.0f / io.DisplaySize.x, 2.0f / io.DisplaySize.y, 0.0f)); + command_buffer.pushConstants(pipeline_layout, vk::ShaderStageFlagBits::eVertex, 0, sizeof(glm::mat4), &push_transform); - static const ImGuiWindowFlags common_flags; + vk::DeviceSize vertex_offsets[1] = {0}; + vk::Buffer vertex_buffer_handle = vertex_buffer->get_handle(); + command_buffer.bindVertexBuffers(0, vertex_buffer_handle, vertex_offsets); - static const ImGuiWindowFlags options_flags; + command_buffer.bindIndexBuffer(index_buffer->get_handle(), 0, vk::IndexType::eUint16); + + int32_t vertex_offset = 0; + int32_t index_offset = 0; + for (auto const *cmd_list : draw_data->CmdLists) + { + for (auto const &cmd : cmd_list->CmdBuffer) + { + vk::Rect2D scissor_rect; + scissor_rect.offset.x = std::max(static_cast(cmd.ClipRect.x), 0); + scissor_rect.offset.y = std::max(static_cast(cmd.ClipRect.y), 0); + scissor_rect.extent.width = static_cast(cmd.ClipRect.z - cmd.ClipRect.x); + scissor_rect.extent.height = static_cast(cmd.ClipRect.w - cmd.ClipRect.y); + + command_buffer.setScissor(0, scissor_rect); + command_buffer.drawIndexed(cmd.ElemCount, 1, index_offset, vertex_offset, 0); + index_offset += cmd.ElemCount; + } +#if defined(PLATFORM__MACOS) && TARGET_OS_IOS && TARGET_OS_SIMULATOR + // iOS Simulator does not support vkCmdDrawIndexed() with vertex_offset > 0, so rebind vertex buffer instead + vertex_offsets[0] += cmd_list->VtxBuffer.Size * sizeof(ImDrawVert); + command_buffer.bindVertexBuffers(0, vertex_buffer_handle, vertex_offsets); +#else + vertex_offset += cmd_list->VtxBuffer.Size; +#endif + } +} - static const ImGuiWindowFlags info_flags; +template +inline void Gui::draw(vkb::core::CommandBuffer &command_buffer) +{ + if constexpr (bindingType == BindingType::Cpp) + { + draw_impl(command_buffer); + } + else + { + draw_impl(reinterpret_cast(command_buffer)); + } +} - VulkanSampleC &sample; +template +inline void Gui::draw_impl(vkb::core::CommandBufferCpp &command_buffer) +{ + if (!visible) + { + return; + } - std::unique_ptr vertex_buffer; + // Render commands + ImDrawData *draw_data = ImGui::GetDrawData(); + if (!draw_data || draw_data->CmdListsCount == 0) + { + return; + } - std::unique_ptr index_buffer; + vkb::core::HPPScopedDebugLabel debug_label{command_buffer, "GUI"}; - size_t last_vertex_buffer_size; + // Vertex input state + vk::VertexInputBindingDescription vertex_input_binding = {.stride = sizeof(ImDrawVert)}; - size_t last_index_buffer_size; + // Location 0: Position + vk::VertexInputAttributeDescription pos_attr = {.location = 0, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(ImDrawVert, pos)}; - /// Scale factor to apply due to a difference between the window and GL pixel sizes - float content_scale_factor{1.0f}; + // Location 1: UV + vk::VertexInputAttributeDescription uv_attr = {.location = 1, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(ImDrawVert, uv)}; - /// Scale factor to apply to the size of gui elements (expressed in dp) - float dpi_factor{1.0f}; + // Location 2: Color + vk::VertexInputAttributeDescription col_attr = {.location = 2, .format = vk::Format::eR8G8B8A8Unorm, .offset = offsetof(ImDrawVert, col)}; - bool explicit_update{false}; + vkb::rendering::HPPVertexInputState vertex_input_state = {.bindings = {vertex_input_binding}, .attributes = {pos_attr, uv_attr, col_attr}}; - Drawer drawer; + command_buffer.set_vertex_input_state(vertex_input_state); - std::vector fonts; + // Blend state + vkb::rendering::HPPColorBlendAttachmentState color_attachment = {.blend_enable = true, + .src_color_blend_factor = vk::BlendFactor::eSrcAlpha, + .dst_color_blend_factor = vk::BlendFactor::eOneMinusSrcAlpha, + .src_alpha_blend_factor = vk::BlendFactor::eOneMinusSrcAlpha, + .color_write_mask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB}; - std::unique_ptr font_image; - std::unique_ptr font_image_view; + vkb::rendering::HPPColorBlendState blend_state{.attachments = {color_attachment}}; - std::unique_ptr sampler{nullptr}; + command_buffer.set_color_blend_state(blend_state); - PipelineLayout *pipeline_layout{nullptr}; + vkb::rendering::HPPRasterizationState rasterization_state = {.cull_mode = vk::CullModeFlagBits::eNone}; + command_buffer.set_rasterization_state(rasterization_state); - StatsView stats_view; + vkb::rendering::HPPDepthStencilState depth_state = {.depth_test_enable = false, .depth_write_enable = false}; + command_buffer.set_depth_stencil_state(depth_state); - DebugView debug_view; + // Bind pipeline layout + command_buffer.bind_pipeline_layout(*pipeline_layout); - VkDescriptorPool descriptor_pool{VK_NULL_HANDLE}; + command_buffer.bind_image(*font_image_view, *sampler, 0, 0, 0); - VkDescriptorSetLayout descriptor_set_layout{VK_NULL_HANDLE}; + // Pre-rotation + auto push_transform = glm::mat4(1.0f); - VkDescriptorSet descriptor_set{VK_NULL_HANDLE}; + if (render_context.has_swapchain()) + { + auto transform = render_context.get_swapchain().get_transform(); - VkPipeline pipeline{VK_NULL_HANDLE}; + glm::vec3 rotation_axis = glm::vec3(0.0f, 0.0f, 1.0f); + if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate90) + { + push_transform = glm::rotate(push_transform, glm::radians(90.0f), rotation_axis); + } + else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate270) + { + push_transform = glm::rotate(push_transform, glm::radians(270.0f), rotation_axis); + } + else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate180) + { + push_transform = glm::rotate(push_transform, glm::radians(180.0f), rotation_axis); + } + } - /// Used to measure duration of input events - Timer timer; + // GUI coordinate space to screen space + auto &io = ImGui::GetIO(); + push_transform = glm::translate(push_transform, glm::vec3(-1.0f, -1.0f, 0.0f)); + push_transform = glm::scale(push_transform, glm::vec3(2.0f / io.DisplaySize.x, 2.0f / io.DisplaySize.y, 0.0f)); - bool prev_visible{true}; + // Push constants + command_buffer.push_constants(push_transform); - /// Whether or not the GUI has detected a multi touch gesture - bool two_finger_tap = false; + std::vector> vertex_buffers; + std::vector vertex_offsets; - bool show_graph_file_output = false; + // If a render context is used, then use the frames buffer pools to allocate GUI vertex/index data from + if (!explicit_update) + { + // Save vertex buffer allocation in case we need to rebind with vertex_offset, e.g. for iOS Simulator + auto vertex_allocation = update_buffers(command_buffer); + if (!vertex_allocation.empty()) + { + vertex_buffers.push_back(vertex_allocation.get_buffer()); + vertex_offsets.push_back(vertex_allocation.get_offset()); + } + } + else + { + vertex_buffers.push_back(*vertex_buffer); + vertex_offsets.push_back(0); + command_buffer.bind_vertex_buffers(0, vertex_buffers, vertex_offsets); + command_buffer.bind_index_buffer(*index_buffer, 0, vk::IndexType::eUint16); + } - uint32_t subpass = 0; -}; + int32_t vertex_offset = 0; + uint32_t index_offset = 0; + for (auto const *cmd_list : draw_data->CmdLists) + { + for (auto const &cmd : cmd_list->CmdBuffer) + { + vk::Rect2D scissor_rect; + scissor_rect.offset.x = std::max(static_cast(cmd.ClipRect.x), 0); + scissor_rect.offset.y = std::max(static_cast(cmd.ClipRect.y), 0); + scissor_rect.extent.width = static_cast(cmd.ClipRect.z - cmd.ClipRect.x); + scissor_rect.extent.height = static_cast(cmd.ClipRect.w - cmd.ClipRect.y); + + // Adjust for pre-rotation if necessary + if (render_context.has_swapchain()) + { + auto transform = render_context.get_swapchain().get_transform(); + if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate90) + { + scissor_rect.offset.x = static_cast(io.DisplaySize.y - cmd.ClipRect.w); + scissor_rect.offset.y = static_cast(cmd.ClipRect.x); + scissor_rect.extent.width = static_cast(cmd.ClipRect.w - cmd.ClipRect.y); + scissor_rect.extent.height = static_cast(cmd.ClipRect.z - cmd.ClipRect.x); + } + else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate180) + { + scissor_rect.offset.x = static_cast(io.DisplaySize.x - cmd.ClipRect.z); + scissor_rect.offset.y = static_cast(io.DisplaySize.y - cmd.ClipRect.w); + scissor_rect.extent.width = static_cast(cmd.ClipRect.z - cmd.ClipRect.x); + scissor_rect.extent.height = static_cast(cmd.ClipRect.w - cmd.ClipRect.y); + } + else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate270) + { + scissor_rect.offset.x = static_cast(cmd.ClipRect.y); + scissor_rect.offset.y = static_cast(io.DisplaySize.x - cmd.ClipRect.z); + scissor_rect.extent.width = static_cast(cmd.ClipRect.w - cmd.ClipRect.y); + scissor_rect.extent.height = static_cast(cmd.ClipRect.z - cmd.ClipRect.x); + } + } + + command_buffer.set_scissor(0, {scissor_rect}); + command_buffer.draw_indexed(cmd.ElemCount, 1, index_offset, vertex_offset, 0); + index_offset += cmd.ElemCount; + } +#if defined(PLATFORM__MACOS) && TARGET_OS_IOS && TARGET_OS_SIMULATOR + // iOS Simulator does not support vkCmdDrawIndexed() with vertex_offset > 0, so rebind vertex buffer instead + if (!vertex_offsets.empty()) + { + vertex_offsets.back() += cmd_list->VtxBuffer.Size * sizeof(ImDrawVert); + command_buffer.bind_vertex_buffers(0, vertex_buffers, vertex_offsets); + } +#else + vertex_offset += cmd_list->VtxBuffer.Size; +#endif + } +} + +template +inline Drawer &Gui::get_drawer() +{ + return drawer; +} -void Gui::new_frame() +template +inline Font &Gui::get_font(const std::string &font_name) { + assert(!fonts.empty() && "No fonts exist"); + + auto it = std::ranges::find_if(fonts, [&font_name](Font &font) { return font.name == font_name; }); + + if (it != fonts.end()) + { + return *it; + } + else + { + LOGW("Couldn't find font with name {}", font_name); + return *fonts.begin(); + } +} + +template +inline vk::ImageView Gui::get_font_image_view() const +{ + return font_image_view->get_handle(); +} + +template +inline vk::Sampler Gui::get_sampler() const +{ + return sampler->get_handle(); +} + +template +inline typename Gui::StatsView &Gui::get_stats_view() +{ + return stats_view; +} + +template +inline bool Gui::input_event(const InputEvent &input_event) +{ + auto &io = ImGui::GetIO(); + auto capture_move_event = false; + + if (input_event.get_source() == EventSource::Keyboard) + { + const auto &key_event = static_cast(input_event); + + if (key_event.get_action() == KeyAction::Down) + { + io.KeysDown[static_cast(key_event.get_code())] = true; + } + else if (key_event.get_action() == KeyAction::Up) + { + io.KeysDown[static_cast(key_event.get_code())] = false; + } + } + else if (input_event.get_source() == EventSource::Mouse) + { + const auto &mouse_button = static_cast(input_event); + + io.MousePos = ImVec2{mouse_button.get_pos_x() * content_scale_factor, + mouse_button.get_pos_y() * content_scale_factor}; + + auto button_id = static_cast(mouse_button.get_button()); + + if (mouse_button.get_action() == MouseAction::Down) + { + io.MouseDown[button_id] = true; + } + else if (mouse_button.get_action() == MouseAction::Up) + { + io.MouseDown[button_id] = false; + } + else if (mouse_button.get_action() == MouseAction::Move) + { + capture_move_event = io.WantCaptureMouse; + } + } + else if (input_event.get_source() == EventSource::Touchscreen) + { + const auto &touch_event = static_cast(input_event); + + io.MousePos = ImVec2{touch_event.get_pos_x(), touch_event.get_pos_y()}; + + if (touch_event.get_action() == TouchAction::Down) + { + io.MouseDown[touch_event.get_pointer_id()] = true; + } + else if (touch_event.get_action() == TouchAction::Up) + { + io.MouseDown[touch_event.get_pointer_id()] = false; + } + else if (touch_event.get_action() == TouchAction::Move) + { + capture_move_event = io.WantCaptureMouse; + } + } + + // Toggle debug UI view when tap or clicking outside the GUI windows + if (!io.WantCaptureMouse) + { + bool press_down = + (input_event.get_source() == EventSource::Mouse && static_cast(input_event).get_action() == MouseAction::Down) || + (input_event.get_source() == EventSource::Touchscreen && static_cast(input_event).get_action() == TouchAction::Down); + bool press_up = + (input_event.get_source() == EventSource::Mouse && static_cast(input_event).get_action() == MouseAction::Up) || + (input_event.get_source() == EventSource::Touchscreen && static_cast(input_event).get_action() == TouchAction::Up); + assert(!(press_down && press_up)); // can't be both, up and down at the same time + + if (press_down) + { + timer.start(); + if (input_event.get_source() == EventSource::Touchscreen) + { + const auto &touch_event = static_cast(input_event); + if (touch_event.get_touch_points() == 2) + { + two_finger_tap = true; + } + } + } + else if (press_up) + { + auto press_delta = timer.stop(); + if (press_delta < press_time_ms) + { + if (input_event.get_source() == EventSource::Mouse) + { + const auto &mouse_button = static_cast(input_event); + if (mouse_button.get_button() == MouseButton::Right) + { + debug_view.active = !debug_view.active; + } + } + else if (input_event.get_source() == EventSource::Touchscreen) + { + const auto &touch_event = static_cast(input_event); + if (two_finger_tap && touch_event.get_touch_points() == 2) + { + debug_view.active = !debug_view.active; + } + else + { + two_finger_tap = false; + } + } + } + } + } + + return capture_move_event; +} + +template +inline bool Gui::is_debug_view_active() const +{ + return debug_view.active; +} + +template +inline void Gui::new_frame() +{ + ImGui::NewFrame(); +} + +template +inline void Gui::prepare(PipelineCacheType pipeline_cache, + RenderPassType render_pass, + std::vector const &shader_stages) +{ + if constexpr (bindingType == BindingType::Cpp) + { + prepare_impl(pipeline_cache, render_pass, shader_stages); + } + else + { + prepare_impl(static_cast(pipeline_cache), + static_cast(render_pass), + reinterpret_cast const &>(shader_stages)); + } +} + +template +inline void Gui::prepare_impl(vk::PipelineCache pipeline_cache, + vk::RenderPass render_pass, + std::vector const &shader_stages) +{ + vk::Device const &device = render_context.get_device().get_handle(); + + // Descriptor pool + vk::DescriptorPoolSize pool_size = {.type = vk::DescriptorType::eCombinedImageSampler, .descriptorCount = 1}; + vk::DescriptorPoolCreateInfo descriptorPoolInfo = {.maxSets = 2, .poolSizeCount = 1, .pPoolSizes = &pool_size}; + descriptor_pool = device.createDescriptorPool(descriptorPoolInfo); + + // Descriptor set layout + vk::DescriptorSetLayoutBinding layout_binding = { + .binding = 0, .descriptorType = vk::DescriptorType::eCombinedImageSampler, .descriptorCount = 1, .stageFlags = vk::ShaderStageFlagBits::eFragment}; + vk::DescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = {.bindingCount = 1, .pBindings = &layout_binding}; + descriptor_set_layout = device.createDescriptorSetLayout(descriptor_set_layout_create_info); + + // Descriptor set + vk::DescriptorSetAllocateInfo descriptor_allocation = {.descriptorPool = descriptor_pool, .descriptorSetCount = 1, .pSetLayouts = &descriptor_set_layout}; + descriptor_set = device.allocateDescriptorSets(descriptor_allocation).front(); + + // Update descriptor set with font image + vk::DescriptorImageInfo font_descriptor = {.sampler = sampler->get_handle(), + .imageView = font_image_view->get_handle(), + .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal}; + vk::WriteDescriptorSet write_descriptor_set = { + .dstSet = descriptor_set, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eCombinedImageSampler, .pImageInfo = &font_descriptor}; + device.updateDescriptorSets(write_descriptor_set, nullptr); + + // Setup graphics pipeline for UI rendering + vk::PipelineInputAssemblyStateCreateInfo input_assembly_state = {.topology = vk::PrimitiveTopology::eTriangleList}; + + vk::PipelineRasterizationStateCreateInfo rasterization_state = { + .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eNone, .frontFace = vk::FrontFace::eCounterClockwise, .lineWidth = 1.0f}; + + // Enable blending + vk::PipelineColorBlendAttachmentState blend_attachment_state = {.blendEnable = true, + .srcColorBlendFactor = vk::BlendFactor::eSrcAlpha, + .dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha, + .colorBlendOp = vk::BlendOp::eAdd, + .srcAlphaBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha, + .dstAlphaBlendFactor = vk::BlendFactor::eZero, + .alphaBlendOp = vk::BlendOp::eAdd, + .colorWriteMask = vk::FlagTraits::allFlags}; + vk::PipelineColorBlendStateCreateInfo color_blend_state = {.attachmentCount = 1, .pAttachments = &blend_attachment_state}; + + vk::PipelineDepthStencilStateCreateInfo depth_stencil_state = {.depthTestEnable = false, + .depthWriteEnable = false, + .depthCompareOp = vk::CompareOp::eAlways, + .back = {.compareOp = vk::CompareOp::eAlways}}; + + vk::PipelineViewportStateCreateInfo viewport_state = {.viewportCount = 1, .scissorCount = 1}; + + vk::PipelineMultisampleStateCreateInfo multisample_state = {.rasterizationSamples = vk::SampleCountFlagBits::e1}; + + std::array dynamic_state_enables = {vk::DynamicState::eViewport, vk::DynamicState::eScissor}; + vk::PipelineDynamicStateCreateInfo dynamic_state = {.dynamicStateCount = static_cast(dynamic_state_enables.size()), + .pDynamicStates = dynamic_state_enables.data()}; + + // Vertex bindings an attributes based on ImGui vertex definition + vk::VertexInputBindingDescription vertex_input_binding = {.binding = 0, .stride = sizeof(ImDrawVert), .inputRate = vk::VertexInputRate::eVertex}; + std::array vertex_input_attributes = { + {{.location = 0, .binding = 0, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(ImDrawVert, pos)}, + {.location = 1, .binding = 0, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(ImDrawVert, uv)}, + {.location = 2, .binding = 0, .format = vk::Format::eR8G8B8A8Unorm, .offset = offsetof(ImDrawVert, col)}}}; + vk::PipelineVertexInputStateCreateInfo vertex_input_state_create_info = {.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = + static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; + + vk::GraphicsPipelineCreateInfo pipeline_create_info = {.stageCount = static_cast(shader_stages.size()), + .pStages = shader_stages.data(), + .pVertexInputState = &vertex_input_state_create_info, + .pInputAssemblyState = &input_assembly_state, + .pViewportState = &viewport_state, + .pRasterizationState = &rasterization_state, + .pMultisampleState = &multisample_state, + .pDepthStencilState = &depth_stencil_state, + .pColorBlendState = &color_blend_state, + .pDynamicState = &dynamic_state, + .layout = pipeline_layout->get_handle(), + .renderPass = render_pass, + .subpass = subpass, + .basePipelineIndex = -1}; + + vk::Result result; + std::tie(result, pipeline) = device.createGraphicsPipeline(pipeline_cache, pipeline_create_info); + assert(result == vk::Result::eSuccess); +} + +template +inline void Gui::resize(const uint32_t width, const uint32_t height) const +{ + auto &io = ImGui::GetIO(); + io.DisplaySize.x = static_cast(width); + io.DisplaySize.y = static_cast(height); +} + +template +inline void Gui::set_subpass(const uint32_t subpass) +{ + this->subpass = subpass; +} + +template +inline void Gui::show_app_info(const std::string &app_name) +{ + // Sample name + ImGui::Text("%s", app_name.c_str()); + + // GPU name + auto &device = render_context.get_device(); + auto device_name_label = "GPU: " + std::string(device.get_gpu().get_properties().deviceName.data()); + ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize(device_name_label.c_str()).x); + ImGui::Text("%s", device_name_label.c_str()); +} + +template +inline void Gui::show_debug_window(DebugInfo &debug_info, const ImVec2 &position) +{ + auto &io = ImGui::GetIO(); + auto &style = ImGui::GetStyle(); + auto &font = get_font(default_window_font); + + // Calculate only once + if (debug_view.label_column_width == 0) + { + debug_view.label_column_width = style.ItemInnerSpacing.x + debug_info.get_longest_label() * font.size / debug_view.scale; + } + + ImGui::SetNextWindowBgAlpha(overlay_alpha); + ImGui::SetNextWindowPos(position, ImGuiCond_FirstUseEver); + ImGui::SetNextWindowContentSize(ImVec2{io.DisplaySize.x, 0.0f}); + + bool is_open = true; + const ImGuiWindowFlags flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; + + ImGui::Begin("Debug Window", &is_open, flags); + ImGui::PushFont(font.handle); + + auto field_count = debug_info.get_fields().size() > debug_view.max_fields ? debug_view.max_fields : debug_info.get_fields().size(); + + ImGui::BeginChild("Table", ImVec2(0, field_count * (font.size + style.ItemSpacing.y)), false); + ImGui::Columns(2); + ImGui::SetColumnWidth(0, debug_view.label_column_width); + ImGui::SetColumnWidth(1, io.DisplaySize.x - debug_view.label_column_width); + for (auto &field : debug_info.get_fields()) + { + const std::string &label = field->label; + const std::string &value = field->to_string(); + ImGui::Text("%s", label.c_str()); + ImGui::NextColumn(); + ImGui::Text(" %s", value.c_str()); + ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::EndChild(); + + ImGui::PopFont(); + ImGui::End(); +} + +template +inline void Gui::show_options_window(std::function body, const uint32_t lines) +{ + // Add padding around the text so that the options are not + // too close to the edges and are easier to interact with. + // Also add double vertical padding to avoid rounded corners. + const float window_padding = ImGui::CalcTextSize("T").x; + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{window_padding, window_padding * 2.0f}); + auto window_height = lines * ImGui::GetTextLineHeightWithSpacing() + ImGui::GetStyle().WindowPadding.y * 2.0f; + auto window_width = ImGui::GetIO().DisplaySize.x; + ImGui::SetNextWindowBgAlpha(overlay_alpha); + const ImVec2 size = ImVec2(window_width, 0); + ImGui::SetNextWindowSize(size, ImGuiCond_Always); + const ImVec2 pos = ImVec2(0.0f, ImGui::GetIO().DisplaySize.y - window_height); + ImGui::SetNextWindowPos(pos, ImGuiCond_Always); + const ImGuiWindowFlags flags = ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoFocusOnAppearing; + bool is_open = true; + ImGui::Begin("Options", &is_open, flags); + body(); + ImGui::End(); + ImGui::PopStyleVar(); +} + +template +inline void Gui::show_simple_window(const std::string &name, uint32_t last_fps, std::function body) +{ + ImGuiIO &io = ImGui::GetIO(); + ImGui::NewFrame(); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); + ImGui::SetNextWindowPos(ImVec2(10, 10)); + ImGui::SetNextWindowSize(ImVec2(0, 0), ImGuiCond_FirstUseEver); + ImGui::Begin("Vulkan Example", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); + ImGui::TextUnformatted(name.c_str()); + ImGui::TextUnformatted(std::string(render_context.get_device().get_gpu().get_properties().deviceName.data()).c_str()); + ImGui::Text("%.2f ms/frame (%.1d fps)", (1000.0f / last_fps), last_fps); + ImGui::PushItemWidth(110.0f * dpi_factor); + + body(); + + ImGui::PopItemWidth(); + ImGui::End(); + ImGui::PopStyleVar(); } + +template +inline void Gui::show_stats(const StatsType &stats) +{ + for (const auto &stat_index : stats.get_requested_stats()) + { + // Draw graph + auto &graph_data = stats_view.get_stat_graph_data(stat_index); + const auto &graph_elements = stats.get_data(stat_index); + float graph_min = 0.0f; + float graph_max = graph_data.max_value; + + if (!graph_data.has_fixed_max) + { + auto new_max = *std::max_element(graph_elements.begin(), graph_elements.end()) * stats_view.get_top_padding(); + if (new_max > graph_max) + { + graph_max = new_max; + } + } + + const ImVec2 graph_size = ImVec2{ImGui::GetIO().DisplaySize.x, stats_view.get_graph_height() /* dpi */ * dpi_factor}; + + std::stringstream graph_label; + float avg = std::accumulate(graph_elements.begin(), graph_elements.end(), 0.0f) / graph_elements.size(); + + // Check if the stat is available in the current platform + if (stats.is_available(stat_index)) + { + auto graph_value = avg * graph_data.scale_factor; + graph_label << fmt::vformat(graph_data.name + ": " + graph_data.format, fmt::make_format_args(graph_value)); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PlotLines("", &graph_elements[0], static_cast(graph_elements.size()), 0, graph_label.str().c_str(), graph_min, graph_max, graph_size); + ImGui::PopItemFlag(); + } + else + { + graph_label << graph_data.name << ": not available"; + ImGui::Text("%s", graph_label.str().c_str()); + } + } +} + +template +inline void Gui::show_top_window(const std::string &app_name, const StatsType *stats, DebugInfo *debug_info) +{ + // Transparent background + ImGui::SetNextWindowBgAlpha(overlay_alpha); + ImVec2 size{ImGui::GetIO().DisplaySize.x, 0.0f}; + ImGui::SetNextWindowSize(size, ImGuiCond_Always); + + // Top left + ImVec2 pos{0.0f, 0.0f}; + ImGui::SetNextWindowPos(pos, ImGuiCond_Always); + + bool is_open = true; + ImGui::Begin("Top", &is_open, common_flags); + + show_app_info(app_name); + + if (stats) + { + show_stats(*stats); + + // Reset max values if user taps on this window + if (ImGui::IsWindowHovered() && ImGui::IsMouseClicked(0 /* left */)) + { + stats_view.reset_max_values(); + } + } + + if (debug_info) + { + if (debug_view.active) + { + show_debug_window(*debug_info, ImVec2{0, ImGui::GetWindowSize().y}); + } + } + + ImGui::End(); +} + +template +inline void Gui::update(const float delta_time) +{ + if (visible != prev_visible) + { + drawer.set_dirty(true); + prev_visible = visible; + } + + if (!visible) + { + ImGui::EndFrame(); + return; + } + + // Update imGui + ImGuiIO &io = ImGui::GetIO(); + auto extent = render_context.get_surface_extent(); + resize(extent.width, extent.height); + io.DeltaTime = delta_time; + + // Render to generate draw buffers + ImGui::Render(); +} + +template +inline bool Gui::update_buffers() +{ + ImDrawData *draw_data = ImGui::GetDrawData(); + + if (!draw_data) + { + return false; + } + + size_t vertex_buffer_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); + size_t index_buffer_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); + + if ((vertex_buffer_size == 0) || (index_buffer_size == 0)) + { + return false; + } + + bool updated = false; + if (!vertex_buffer->get_handle() || (vertex_buffer_size != vertex_buffer->get_size())) + { + vertex_buffer.reset(); + vertex_buffer = std::make_unique(render_context.get_device(), vertex_buffer_size, + vk::BufferUsageFlagBits::eVertexBuffer, + VMA_MEMORY_USAGE_GPU_TO_CPU); + vertex_buffer->set_debug_name("GUI vertex buffer"); + updated = true; + } + + if (!index_buffer->get_handle() || (index_buffer_size != index_buffer->get_size())) + { + index_buffer.reset(); + index_buffer = std::make_unique(render_context.get_device(), index_buffer_size, + vk::BufferUsageFlagBits::eIndexBuffer, + VMA_MEMORY_USAGE_GPU_TO_CPU); + index_buffer->set_debug_name("GUI index buffer"); + updated = true; + } + + // Upload data + upload_draw_data(draw_data, vertex_buffer->map(), index_buffer->map()); + + vertex_buffer->flush(); + index_buffer->flush(); + + vertex_buffer->unmap(); + index_buffer->unmap(); + + return updated; +} + +template +inline vkb::BufferAllocationCpp Gui::update_buffers(vkb::core::CommandBufferCpp &command_buffer) +{ + ImDrawData *draw_data = ImGui::GetDrawData(); + + if (!draw_data) + { + return vkb::BufferAllocationCpp{}; + } + + size_t vertex_buffer_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); + size_t index_buffer_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); + + if ((vertex_buffer_size == 0) || (index_buffer_size == 0)) + { + return vkb::BufferAllocationCpp{}; + } + + std::vector vertex_data(vertex_buffer_size); + std::vector index_data(index_buffer_size); + + upload_draw_data(draw_data, vertex_data.data(), index_data.data()); + + auto vertex_allocation = render_context.get_active_frame().allocate_buffer(vk::BufferUsageFlagBits::eVertexBuffer, vertex_buffer_size); + + vertex_allocation.update(vertex_data); + + std::vector> buffers; + buffers.emplace_back(std::ref(vertex_allocation.get_buffer())); + + std::vector offsets{vertex_allocation.get_offset()}; + + command_buffer.bind_vertex_buffers(0, buffers, offsets); + + auto index_allocation = render_context.get_active_frame().allocate_buffer(vk::BufferUsageFlagBits::eIndexBuffer, index_buffer_size); + + index_allocation.update(index_data); + + command_buffer.bind_index_buffer(index_allocation.get_buffer(), index_allocation.get_offset(), vk::IndexType::eUint16); + + return vertex_allocation; +} + +template +inline void Gui::upload_draw_data(const ImDrawData *draw_data, uint8_t *vertex_data, uint8_t *index_data) +{ + ImDrawVert *vtx_dst = reinterpret_cast(vertex_data); + ImDrawIdx *idx_dst = reinterpret_cast(index_data); + + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList *cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } +} + +template +inline Gui::StatsView::StatsView(const StatsType *stats) +{ + if (stats == nullptr) + { + return; + } + + // Request graph data information for each stat and record it in graph_map + const std::set &indices = stats->get_requested_stats(); + + for (StatIndex i : indices) + { + graph_map[i] = stats->get_graph_data(i); + } +} + +template +inline float Gui::StatsView::get_graph_height() const +{ + return graph_height; +} + +template +inline StatGraphData const &Gui::StatsView::get_stat_graph_data(StatIndex const &stat_index) const +{ + auto graph_map_it = graph_map.find(stat_index); + + assert(graph_map_it != graph_map.end() && "StatIndex not implemented in gui graph_map"); + + return graph_map_it->second; +} + +template +inline float Gui::StatsView::get_top_padding() const +{ + return top_padding; +} + +template +inline void Gui::StatsView::reset_max_value(const StatIndex index) +{ + auto pr = graph_map.find(index); + if (pr != graph_map.end()) + { + reset_graph_max_value(pr->second); + } +} + +template +inline void Gui::StatsView::reset_max_values() +{ + // For every entry in the map + std::ranges::for_each(graph_map, [](auto &pr) { reset_graph_max_value(pr.second); }); +} + } // namespace vkb diff --git a/framework/hpp_api_vulkan_sample.cpp b/framework/hpp_api_vulkan_sample.cpp index 4f1e4da3d5..8d23877134 100644 --- a/framework/hpp_api_vulkan_sample.cpp +++ b/framework/hpp_api_vulkan_sample.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,10 +16,9 @@ * limitations under the License. */ -#include - -#include -#include +#include "hpp_api_vulkan_sample.h" +#include "core/hpp_queue.h" +#include "gui.h" // Instantiate the default dispatcher VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE @@ -33,6 +32,9 @@ bool HPPApiVulkanSample::prepare(const vkb::ApplicationOptions &options) depth_format = vkb::common::get_suitable_depth_format(get_device().get_gpu().get_handle()); + // Update extent from surface extent to reflect command line arguments + extent = get_render_context().get_surface_extent(); + // Create synchronization objects // Create a semaphore used to synchronize image presentation // Ensures that the current swapchain render target has completed presentation and has been released by the presentation engine, ready for rendering @@ -50,7 +52,7 @@ bool HPPApiVulkanSample::prepare(const vkb::ApplicationOptions &options) submit_info.setWaitSemaphores(semaphores.acquired_image_ready); submit_info.setSignalSemaphores(semaphores.render_complete); - queue = get_device().get_suitable_graphics_queue().get_handle(); + queue = get_device().get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0).get_handle(); create_swapchain_buffers(); create_command_pool(); @@ -61,8 +63,6 @@ bool HPPApiVulkanSample::prepare(const vkb::ApplicationOptions &options) create_pipeline_cache(); setup_framebuffer(); - extent = get_render_context().get_surface_extent(); - prepare_gui(); return true; @@ -73,8 +73,8 @@ void HPPApiVulkanSample::prepare_gui() create_gui(*window, nullptr, 15.0f, true); get_gui().prepare(pipeline_cache, render_pass, - {static_cast(load_shader("uioverlay/uioverlay.vert", vk::ShaderStageFlagBits::eVertex)), - static_cast(load_shader("uioverlay/uioverlay.frag", vk::ShaderStageFlagBits::eFragment))}); + {load_shader("uioverlay/uioverlay.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("uioverlay/uioverlay.frag.spv", vk::ShaderStageFlagBits::eFragment)}); } void HPPApiVulkanSample::update(float delta_time) @@ -85,6 +85,7 @@ void HPPApiVulkanSample::update(float delta_time) view_changed(); } + assert(has_render_context()); render(delta_time); camera.update(delta_time); if (camera.moving()) @@ -377,7 +378,7 @@ bool HPPApiVulkanSample::check_command_buffers() { for (auto &command_buffer : draw_cmd_buffers) { - if (command_buffer) + if (!command_buffer) { return false; } @@ -388,8 +389,9 @@ bool HPPApiVulkanSample::check_command_buffers() void HPPApiVulkanSample::create_command_buffers() { // Create one command buffer for each swap chain image and reuse for rendering - vk::CommandBufferAllocateInfo allocate_info( - cmd_pool, vk::CommandBufferLevel::ePrimary, static_cast(get_render_context().get_render_frames().size())); + vk::CommandBufferAllocateInfo allocate_info{.commandPool = cmd_pool, + .level = vk::CommandBufferLevel::ePrimary, + .commandBufferCount = static_cast(get_render_context().get_render_frames().size())}; draw_cmd_buffers = get_device().get_handle().allocateCommandBuffers(allocate_info); } @@ -404,35 +406,20 @@ void HPPApiVulkanSample::create_pipeline_cache() pipeline_cache = get_device().get_handle().createPipelineCache({}); } -vk::PipelineShaderStageCreateInfo HPPApiVulkanSample::load_shader(const std::string &file, vk::ShaderStageFlagBits stage, vkb::ShaderSourceLanguage src_language) +vk::PipelineShaderStageCreateInfo HPPApiVulkanSample::load_shader(const std::string &file, vk::ShaderStageFlagBits stage) { - shader_modules.push_back(vkb::common::load_shader(file.c_str(), get_device().get_handle(), stage, src_language)); + shader_modules.push_back(vkb::common::load_shader(file.c_str(), get_device().get_handle(), stage)); assert(shader_modules.back()); - return vk::PipelineShaderStageCreateInfo({}, stage, shader_modules.back(), "main"); + return vk::PipelineShaderStageCreateInfo{.stage = stage, .module = shader_modules.back(), .pName = "main"}; } vk::PipelineShaderStageCreateInfo HPPApiVulkanSample::load_shader(const std::string &sample_folder_name, const std::string &shader_filename, vk::ShaderStageFlagBits stage) { - // Note: this can be reworked once offline compilation for GLSL shaders is added - - // Default to GLSL - std::string shader_folder{"glsl"}; - std::string shader_extension{""}; - vkb::ShaderSourceLanguage src_language = vkb::ShaderSourceLanguage::GLSL; - - if (get_shading_language() == vkb::ShadingLanguage::HLSL) - { - shader_folder = "hlsl"; - // HLSL shaders are offline compiled to SPIR-V, so source is SPV - src_language = vkb::ShaderSourceLanguage::SPV; - shader_extension = ".spv"; - } - - std::string full_file_name = sample_folder_name + "/" + shader_folder + "/" + shader_filename + shader_extension; + std::string full_file_name = sample_folder_name + "/" + get_shader_folder() + "/" + shader_filename; - shader_modules.push_back(vkb::common::load_shader(full_file_name, get_device().get_handle(), stage, src_language)); + shader_modules.push_back(vkb::common::load_shader(full_file_name, get_device().get_handle(), stage)); assert(shader_modules.back()); - return vk::PipelineShaderStageCreateInfo({}, stage, shader_modules.back(), "main"); + return vk::PipelineShaderStageCreateInfo{.stage = stage, .module = shader_modules.back(), .pName = "main"}; } void HPPApiVulkanSample::update_overlay(float delta_time, const std::function &additional_ui) @@ -464,8 +451,8 @@ void HPPApiVulkanSample::draw_ui(const vk::CommandBuffer command_buffer) { if (has_gui()) { - command_buffer.setViewport(0, vk::Viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f)); - command_buffer.setScissor(0, vk::Rect2D({0, 0}, extent)); + command_buffer.setViewport(0, vk::Viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}); + command_buffer.setScissor(0, vk::Rect2D{{0, 0}, extent}); get_gui().draw(command_buffer); } @@ -502,7 +489,7 @@ void HPPApiVulkanSample::submit_frame() vk::SwapchainKHR swapchain = get_render_context().get_swapchain().get_handle(); - vk::PresentInfoKHR present_info({}, swapchain, current_buffer); + vk::PresentInfoKHR present_info{.swapchainCount = 1, .pSwapchains = &swapchain, .pImageIndices = ¤t_buffer}; // Check if a wait semaphore has been specified to wait for before presenting the image if (semaphores.render_complete) { @@ -510,7 +497,7 @@ void HPPApiVulkanSample::submit_frame() } vk::DisplayPresentInfoKHR disp_present_info; - if (get_device().is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && + if (get_device().get_gpu().is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && window->get_display_present_info(reinterpret_cast(&disp_present_info), extent.width, extent.height)) { // Add display present info if supported and wanted @@ -603,7 +590,7 @@ void HPPApiVulkanSample::rebuild_command_buffers() void HPPApiVulkanSample::create_synchronization_primitives() { // Wait fences to sync command buffer access - vk::FenceCreateInfo fence_create_info(vk::FenceCreateFlagBits::eSignaled); + vk::FenceCreateInfo fence_create_info{.flags = vk::FenceCreateFlagBits::eSignaled}; wait_fences.resize(draw_cmd_buffers.size()); for (auto &fence : wait_fences) { @@ -614,7 +601,7 @@ void HPPApiVulkanSample::create_synchronization_primitives() void HPPApiVulkanSample::create_command_pool() { uint32_t queue_family_index = get_device().get_queue_by_flags(vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eCompute, 0).get_family_index(); - vk::CommandPoolCreateInfo command_pool_info({}, queue_family_index); + vk::CommandPoolCreateInfo command_pool_info{.queueFamilyIndex = queue_family_index}; cmd_pool = get_device().get_handle().createCommandPool(command_pool_info); } @@ -645,8 +632,12 @@ void HPPApiVulkanSample::setup_framebuffer() // Depth/Stencil attachment is the same for all frame buffers attachments[1] = depth_stencil.view; - vk::FramebufferCreateInfo framebuffer_create_info( - {}, render_pass, attachments, get_render_context().get_surface_extent().width, get_render_context().get_surface_extent().height, 1); + vk::FramebufferCreateInfo framebuffer_create_info{.renderPass = render_pass, + .attachmentCount = static_cast(attachments.size()), + .pAttachments = attachments.data(), + .width = get_render_context().get_surface_extent().width, + .height = get_render_context().get_surface_extent().height, + .layers = 1}; // Delete existing frame buffers for (auto &framebuffer : framebuffers) @@ -666,52 +657,62 @@ void HPPApiVulkanSample::setup_framebuffer() void HPPApiVulkanSample::setup_render_pass() { - std::array attachments; - // Color attachment - attachments[0].format = get_render_context().get_format(); - attachments[0].samples = vk::SampleCountFlagBits::e1; - attachments[0].loadOp = vk::AttachmentLoadOp::eClear; - attachments[0].storeOp = vk::AttachmentStoreOp::eStore; - attachments[0].stencilLoadOp = vk::AttachmentLoadOp::eDontCare; - attachments[0].stencilStoreOp = vk::AttachmentStoreOp::eDontCare; - attachments[0].initialLayout = vk::ImageLayout::eUndefined; - attachments[0].finalLayout = vk::ImageLayout::ePresentSrcKHR; - // Depth attachment - attachments[1].format = depth_format; - attachments[1].samples = vk::SampleCountFlagBits::e1; - attachments[1].loadOp = vk::AttachmentLoadOp::eClear; - attachments[1].storeOp = vk::AttachmentStoreOp::eDontCare; - attachments[1].stencilLoadOp = vk::AttachmentLoadOp::eClear; - attachments[1].stencilStoreOp = vk::AttachmentStoreOp::eDontCare; - attachments[1].initialLayout = vk::ImageLayout::eUndefined; - attachments[1].finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal; - - vk::AttachmentReference color_reference(0, vk::ImageLayout::eColorAttachmentOptimal); - - vk::AttachmentReference depth_reference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal); - - vk::SubpassDescription subpass_description({}, vk::PipelineBindPoint::eGraphics, {}, color_reference, {}, &depth_reference); + std::array attachments{{// Color attachment + {.format = get_render_context().get_format(), + .samples = vk::SampleCountFlagBits::e1, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + .stencilLoadOp = vk::AttachmentLoadOp::eDontCare, + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, + .initialLayout = vk::ImageLayout::eUndefined, + .finalLayout = vk::ImageLayout::ePresentSrcKHR}, + // Depth attachment + {.format = depth_format, + .samples = vk::SampleCountFlagBits::e1, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eDontCare, + .stencilLoadOp = vk::AttachmentLoadOp::eClear, + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, + .initialLayout = vk::ImageLayout::eUndefined, + .finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal}}}; + + vk::AttachmentReference color_reference{0, vk::ImageLayout::eColorAttachmentOptimal}; + + vk::AttachmentReference depth_reference{1, vk::ImageLayout::eDepthStencilAttachmentOptimal}; + + vk::SubpassDescription subpass_description{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, + .colorAttachmentCount = 1, + .pColorAttachments = &color_reference, + .pDepthStencilAttachment = &depth_reference}; // Subpass dependencies for layout transitions - std::array dependencies; - - dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; - dependencies[0].dstSubpass = 0; - dependencies[0].srcStageMask = vk::PipelineStageFlagBits::eBottomOfPipe; - dependencies[0].dstStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests; - dependencies[0].srcAccessMask = vk::AccessFlagBits::eNoneKHR; - dependencies[0].dstAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite; - dependencies[0].dependencyFlags = vk::DependencyFlagBits::eByRegion; - - dependencies[1].srcSubpass = 0; - dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL; - dependencies[1].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests; - dependencies[1].dstStageMask = vk::PipelineStageFlagBits::eBottomOfPipe; - dependencies[1].srcAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite; - dependencies[1].dstAccessMask = vk::AccessFlagBits::eMemoryRead; - dependencies[1].dependencyFlags = vk::DependencyFlagBits::eByRegion; - - vk::RenderPassCreateInfo render_pass_create_info({}, attachments, subpass_description, dependencies); + std::array dependencies{{ + {.srcSubpass = vk::SubpassExternal, + .dstSubpass = 0, + .srcStageMask = vk::PipelineStageFlagBits::eBottomOfPipe, + .dstStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, + .srcAccessMask = vk::AccessFlagBits::eNoneKHR, + .dstAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | + vk::AccessFlagBits::eDepthStencilAttachmentWrite, + .dependencyFlags = vk::DependencyFlagBits::eByRegion}, + {.srcSubpass = 0, + .dstSubpass = vk::SubpassExternal, + .srcStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, + .dstStageMask = vk::PipelineStageFlagBits::eBottomOfPipe, + .srcAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | + vk::AccessFlagBits::eDepthStencilAttachmentWrite, + .dstAccessMask = vk::AccessFlagBits::eMemoryRead, + .dependencyFlags = vk::DependencyFlagBits::eByRegion}, + }}; + + vk::RenderPassCreateInfo render_pass_create_info{.attachmentCount = static_cast(attachments.size()), + .pAttachments = attachments.data(), + .subpassCount = 1, + .pSubpasses = &subpass_description, + .dependencyCount = static_cast(dependencies.size()), + .pDependencies = dependencies.data()}; render_pass = get_device().get_handle().createRenderPass(render_pass_create_info); } @@ -730,52 +731,62 @@ void HPPApiVulkanSample::update_render_pass_flags(RenderPassCreateFlags flags) color_attachment_image_layout = vk::ImageLayout::ePresentSrcKHR; } - std::array attachments = {}; - // Color attachment - attachments[0].format = get_render_context().get_format(); - attachments[0].samples = vk::SampleCountFlagBits::e1; - attachments[0].loadOp = color_attachment_load_op; - attachments[0].storeOp = vk::AttachmentStoreOp::eStore; - attachments[0].stencilLoadOp = vk::AttachmentLoadOp::eDontCare; - attachments[0].stencilStoreOp = vk::AttachmentStoreOp::eDontCare; - attachments[0].initialLayout = color_attachment_image_layout; - attachments[0].finalLayout = vk::ImageLayout::ePresentSrcKHR; - // Depth attachment - attachments[1].format = depth_format; - attachments[1].samples = vk::SampleCountFlagBits::e1; - attachments[1].loadOp = vk::AttachmentLoadOp::eClear; - attachments[1].storeOp = vk::AttachmentStoreOp::eDontCare; - attachments[1].stencilLoadOp = vk::AttachmentLoadOp::eClear; - attachments[1].stencilStoreOp = vk::AttachmentStoreOp::eDontCare; - attachments[1].initialLayout = vk::ImageLayout::eUndefined; - attachments[1].finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal; - - vk::AttachmentReference color_reference(0, vk::ImageLayout::eColorAttachmentOptimal); - - vk::AttachmentReference depth_reference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal); - - vk::SubpassDescription subpass_description({}, vk::PipelineBindPoint::eGraphics, {}, color_reference, {}, &depth_reference); + std::array attachments = {{// Color attachment + {.format = get_render_context().get_format(), + .samples = vk::SampleCountFlagBits::e1, + .loadOp = color_attachment_load_op, + .storeOp = vk::AttachmentStoreOp::eStore, + .stencilLoadOp = vk::AttachmentLoadOp::eDontCare, + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, + .initialLayout = color_attachment_image_layout, + .finalLayout = vk::ImageLayout::ePresentSrcKHR}, + // Depth attachment + {.format = depth_format, + .samples = vk::SampleCountFlagBits::e1, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eDontCare, + .stencilLoadOp = vk::AttachmentLoadOp::eClear, + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, + .initialLayout = vk::ImageLayout::eUndefined, + .finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal}}}; + + vk::AttachmentReference color_reference{0, vk::ImageLayout::eColorAttachmentOptimal}; + + vk::AttachmentReference depth_reference{1, vk::ImageLayout::eDepthStencilAttachmentOptimal}; + + vk::SubpassDescription subpass_description{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, + .colorAttachmentCount = 1, + .pColorAttachments = &color_reference, + .pDepthStencilAttachment = &depth_reference}; // Subpass dependencies for layout transitions - std::array dependencies; - - dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; - dependencies[0].dstSubpass = 0; - dependencies[0].srcStageMask = vk::PipelineStageFlagBits::eBottomOfPipe; - dependencies[0].dstStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests; - dependencies[0].srcAccessMask = vk::AccessFlagBits::eNoneKHR; - dependencies[0].dstAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite; - dependencies[0].dependencyFlags = vk::DependencyFlagBits::eByRegion; - - dependencies[1].srcSubpass = 0; - dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL; - dependencies[1].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests; - dependencies[1].dstStageMask = vk::PipelineStageFlagBits::eBottomOfPipe; - dependencies[1].srcAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite; - dependencies[1].dstAccessMask = vk::AccessFlagBits::eMemoryRead; - dependencies[1].dependencyFlags = vk::DependencyFlagBits::eByRegion; - - vk::RenderPassCreateInfo render_pass_create_info({}, attachments, subpass_description, dependencies); + std::array dependencies{{ + {.srcSubpass = vk::SubpassExternal, + .dstSubpass = 0, + .srcStageMask = vk::PipelineStageFlagBits::eBottomOfPipe, + .dstStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, + .srcAccessMask = vk::AccessFlagBits::eNoneKHR, + .dstAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | + vk::AccessFlagBits::eDepthStencilAttachmentWrite, + .dependencyFlags = vk::DependencyFlagBits::eByRegion}, + {.srcSubpass = 0, + .dstSubpass = vk::SubpassExternal, + .srcStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, + .dstStageMask = vk::PipelineStageFlagBits::eBottomOfPipe, + .srcAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentRead | + vk::AccessFlagBits::eDepthStencilAttachmentWrite, + .dstAccessMask = vk::AccessFlagBits::eMemoryRead, + .dependencyFlags = vk::DependencyFlagBits::eByRegion}, + }}; + + vk::RenderPassCreateInfo render_pass_create_info{.attachmentCount = static_cast(attachments.size()), + .pAttachments = attachments.data(), + .subpassCount = 1, + .pSubpasses = &subpass_description, + .dependencyCount = static_cast(dependencies.size()), + .pDependencies = dependencies.data()}; render_pass = get_device().get_handle().createRenderPass(render_pass_create_info); } @@ -842,7 +853,8 @@ void HPPApiVulkanSample::handle_surface_changes() vk::SurfaceCapabilitiesKHR surface_properties = get_device().get_gpu().get_handle().getSurfaceCapabilitiesKHR(get_render_context().get_swapchain().get_surface()); - if (surface_properties.currentExtent != get_render_context().get_surface_extent()) + if (surface_properties.currentExtent != get_render_context().get_surface_extent() && + surface_properties.currentExtent != vk::Extent2D{0xFFFFFFFF, 0xFFFFFFFF}) { resize(surface_properties.currentExtent.width, surface_properties.currentExtent.height); } @@ -895,7 +907,7 @@ HPPTexture HPPApiVulkanSample::load_texture(const std::string &file, vkb::scene_ bufferCopyRegions.push_back(buffer_copy_region); } - vk::ImageSubresourceRange subresource_range(vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, 1); + vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, 1}; // Image barrier for optimal image (target) // Optimal image will be used as destination for the copy @@ -959,7 +971,7 @@ HPPTexture HPPApiVulkanSample::load_texture_array(const std::string &file, vkb:: } } - vk::ImageSubresourceRange subresource_range(vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, layers); + vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, layers}; // Image barrier for optimal image (target) // Optimal image will be used as destination for the copy @@ -1023,7 +1035,7 @@ HPPTexture HPPApiVulkanSample::load_texture_cubemap(const std::string &file, vkb } } - vk::ImageSubresourceRange subresource_range(vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, layers); + vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, layers}; // Image barrier for optimal image (target) // Optimal image will be used as destination for the copy diff --git a/framework/hpp_api_vulkan_sample.h b/framework/hpp_api_vulkan_sample.h index 3633bb24f2..3ac6c070e5 100644 --- a/framework/hpp_api_vulkan_sample.h +++ b/framework/hpp_api_vulkan_sample.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -304,9 +303,8 @@ class HPPApiVulkanSample : public vkb::VulkanSampleCpp * @brief Load a SPIR-V shader * @param file The file location of the shader relative to the shaders folder * @param stage The shader stage - * @param src_language The shader language */ - vk::PipelineShaderStageCreateInfo load_shader(const std::string &file, vk::ShaderStageFlagBits stage, vkb::ShaderSourceLanguage src_language = vkb::ShaderSourceLanguage::GLSL); + vk::PipelineShaderStageCreateInfo load_shader(const std::string &file, vk::ShaderStageFlagBits stage); /** * @brief Load a SPIR-V shader based on current shader language selection diff --git a/framework/hpp_fence_pool.h b/framework/hpp_fence_pool.h index ffa0c1bd99..00117fbec9 100644 --- a/framework/hpp_fence_pool.h +++ b/framework/hpp_fence_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,8 +24,10 @@ namespace vkb { namespace core { -class HPPDevice; -} +template +class Device; +using DeviceCpp = Device; +} // namespace core /** * @brief facade class around vkb::FencePool, providing a vulkan.hpp-based interface @@ -38,8 +40,8 @@ class HPPFencePool : private vkb::FencePool using vkb::FencePool::reset; using vkb::FencePool::wait; - HPPFencePool(vkb::core::HPPDevice &device) : - vkb::FencePool(reinterpret_cast(device)) + HPPFencePool(vkb::core::DeviceCpp &device) : + vkb::FencePool(reinterpret_cast(device)) {} vk::Fence request_fence() diff --git a/framework/hpp_glsl_compiler.h b/framework/hpp_glsl_compiler.h deleted file mode 100644 index a188f9a05a..0000000000 --- a/framework/hpp_glsl_compiler.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "glsl_compiler.h" -#include - -namespace vkb -{ -/** - * @brief facade class around vkb::GLSLCompiler, providing a vulkan.hpp-based interface - * - * See vkb::GLSLCompiler for documentation - */ -class HPPGLSLCompiler : private vkb::GLSLCompiler -{ - public: - inline bool compile_to_spirv(vk::ShaderStageFlagBits stage, - const std::vector &glsl_source, - const std::string & entry_point, - const ShaderVariant & shader_variant, - std::vector &spirv, - std::string & info_log) - { - return vkb::GLSLCompiler::compile_to_spirv(static_cast(stage), glsl_source, entry_point, shader_variant, spirv, info_log); - } -}; -} // namespace vkb diff --git a/framework/hpp_gltf_loader.h b/framework/hpp_gltf_loader.h index 2b41aa4f7f..cb001d85ea 100644 --- a/framework/hpp_gltf_loader.h +++ b/framework/hpp_gltf_loader.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,7 +19,6 @@ #include -#include #include #include @@ -33,8 +32,8 @@ namespace vkb class HPPGLTFLoader : private vkb::GLTFLoader { public: - HPPGLTFLoader(vkb::core::HPPDevice &device) : - GLTFLoader(reinterpret_cast(device)) + HPPGLTFLoader(vkb::core::DeviceCpp &device) : + GLTFLoader(reinterpret_cast(device)) {} std::unique_ptr read_model_from_file( diff --git a/framework/hpp_gui.cpp b/framework/hpp_gui.cpp deleted file mode 100644 index 458ac2cb21..0000000000 --- a/framework/hpp_gui.cpp +++ /dev/null @@ -1,1045 +0,0 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "hpp_gui.h" -#include "vulkan_sample.h" -#include -#include -#include - -#include - -namespace vkb -{ -namespace -{ -void upload_draw_data(const ImDrawData *draw_data, uint8_t *vertex_data, uint8_t *index_data) -{ - ImDrawVert *vtx_dst = reinterpret_cast(vertex_data); - ImDrawIdx *idx_dst = reinterpret_cast(index_data); - - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList *cmd_list = draw_data->CmdLists[n]; - memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); - memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); - vtx_dst += cmd_list->VtxBuffer.Size; - idx_dst += cmd_list->IdxBuffer.Size; - } -} - -void reset_graph_max_value(StatGraphData &graph_data) -{ - // If it does not have a fixed max - if (!graph_data.has_fixed_max) - { - // Reset it - graph_data.max_value = 0.0f; - } -} -} // namespace - -bool HPPGui::visible = true; -const double HPPGui::press_time_ms = 200.0f; -const float HPPGui::overlay_alpha = 0.3f; -const std::string HPPGui::default_font = "Roboto-Regular"; -const ImGuiWindowFlags HPPGui::common_flags = ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoFocusOnAppearing; -const ImGuiWindowFlags HPPGui::options_flags = HPPGui::common_flags; -const ImGuiWindowFlags HPPGui::info_flags = HPPGui::common_flags | ImGuiWindowFlags_NoInputs; - -HPPGui::HPPGui(VulkanSampleCpp &sample_, const vkb::Window &window, const vkb::stats::HPPStats *stats, float font_size, bool explicit_update) : - sample{sample_}, content_scale_factor{window.get_content_scale_factor()}, dpi_factor{window.get_dpi_factor() * content_scale_factor}, explicit_update{explicit_update}, stats_view(stats) -{ - ImGui::CreateContext(); - - ImGuiStyle &style = ImGui::GetStyle(); - - // Color scheme - style.Colors[ImGuiCol_WindowBg] = ImVec4(0.005f, 0.005f, 0.005f, 0.94f); - style.Colors[ImGuiCol_TitleBg] = ImVec4(1.0f, 0.0f, 0.0f, 0.6f); - style.Colors[ImGuiCol_TitleBgActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); - style.Colors[ImGuiCol_MenuBarBg] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_Header] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_HeaderActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_HeaderHovered] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_FrameBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.8f); - style.Colors[ImGuiCol_CheckMark] = ImVec4(0.0f, 1.0f, 0.0f, 1.0f); - style.Colors[ImGuiCol_SliderGrab] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); - style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(1.0f, 1.0f, 1.0f, 0.1f); - style.Colors[ImGuiCol_FrameBgActive] = ImVec4(1.0f, 1.0f, 1.0f, 0.2f); - style.Colors[ImGuiCol_Button] = ImVec4(1.0f, 0.0f, 0.0f, 0.4f); - style.Colors[ImGuiCol_ButtonHovered] = ImVec4(1.0f, 0.0f, 0.0f, 0.6f); - style.Colors[ImGuiCol_ButtonActive] = ImVec4(1.0f, 0.0f, 0.0f, 0.8f); - - // Borderless window - style.WindowBorderSize = 0.0f; - - // Global scale - style.ScaleAllSizes(dpi_factor); - - // Dimensions - ImGuiIO &io = ImGui::GetIO(); - auto const &extent = sample.get_render_context().get_surface_extent(); - io.DisplaySize.x = static_cast(extent.width); - io.DisplaySize.y = static_cast(extent.height); - io.FontGlobalScale = 1.0f; - io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); - - // Enable keyboard navigation - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; - io.KeyMap[ImGuiKey_Space] = static_cast(KeyCode::Space); - io.KeyMap[ImGuiKey_Enter] = static_cast(KeyCode::Enter); - io.KeyMap[ImGuiKey_LeftArrow] = static_cast(KeyCode::Left); - io.KeyMap[ImGuiKey_RightArrow] = static_cast(KeyCode::Right); - io.KeyMap[ImGuiKey_UpArrow] = static_cast(KeyCode::Up); - io.KeyMap[ImGuiKey_DownArrow] = static_cast(KeyCode::Down); - io.KeyMap[ImGuiKey_Tab] = static_cast(KeyCode::Tab); - io.KeyMap[ImGuiKey_Escape] = static_cast(KeyCode::Backspace); - - // Default font - fonts.emplace_back(default_font, font_size * dpi_factor); - - // Debug window font - fonts.emplace_back("RobotoMono-Regular", (font_size / 2) * dpi_factor); - - // Create font texture - unsigned char *font_data; - int tex_width, tex_height; - io.Fonts->GetTexDataAsRGBA32(&font_data, &tex_width, &tex_height); - size_t upload_size = tex_width * tex_height * 4 * sizeof(char); - - auto &device = sample.get_render_context().get_device(); - - // Create target image for copy - font_image = - vkb::core::HPPImageBuilder(to_u32(tex_width), to_u32(tex_height)) - .with_format(vk::Format::eR8G8B8A8Unorm) - .with_usage(vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst) - .with_debug_name("GUI font image") - .build_unique(device); - - font_image_view = std::make_unique(*font_image, vk::ImageViewType::e2D); - font_image_view->set_debug_name("View on GUI font image"); - - // Upload font data into the vulkan image memory - { - vkb::core::BufferCpp stage_buffer = vkb::core::BufferCpp::create_staging_buffer(device, upload_size, font_data); - - auto &command_buffer = device.get_command_pool().request_command_buffer(); - - vkb::HPPFencePool fence_pool(device); - - // Begin recording - command_buffer.begin(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); - - { - // Prepare for transfer - vkb::common::HPPImageMemoryBarrier memory_barrier; - memory_barrier.old_layout = vk::ImageLayout::eUndefined; - memory_barrier.new_layout = vk::ImageLayout::eTransferDstOptimal; - memory_barrier.src_access_mask = {}; - memory_barrier.dst_access_mask = vk::AccessFlagBits::eTransferWrite; - memory_barrier.src_stage_mask = vk::PipelineStageFlagBits::eHost; - memory_barrier.dst_stage_mask = vk::PipelineStageFlagBits::eTransfer; - - command_buffer.image_memory_barrier(*font_image_view, memory_barrier); - } - - // Copy - vk::BufferImageCopy buffer_copy_region; - buffer_copy_region.imageSubresource.layerCount = font_image_view->get_subresource_range().layerCount; - buffer_copy_region.imageSubresource.aspectMask = font_image_view->get_subresource_range().aspectMask; - buffer_copy_region.imageExtent = font_image->get_extent(); - - command_buffer.copy_buffer_to_image(stage_buffer, *font_image, {buffer_copy_region}); - - { - // Prepare for fragmen shader - vkb::common::HPPImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = vk::ImageLayout::eTransferDstOptimal; - memory_barrier.new_layout = vk::ImageLayout::eShaderReadOnlyOptimal; - memory_barrier.src_access_mask = vk::AccessFlagBits::eTransferWrite; - memory_barrier.dst_access_mask = vk::AccessFlagBits::eShaderRead; - memory_barrier.src_stage_mask = vk::PipelineStageFlagBits::eTransfer; - memory_barrier.dst_stage_mask = vk::PipelineStageFlagBits::eFragmentShader; - - command_buffer.image_memory_barrier(*font_image_view, memory_barrier); - } - - // End recording - command_buffer.end(); - - auto &queue = device.get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0); - - queue.submit(command_buffer, device.get_fence_pool().request_fence()); - - // Wait for the command buffer to finish its work before destroying the staging buffer - device.get_fence_pool().wait(); - device.get_fence_pool().reset(); - device.get_command_pool().reset_pool(); - } - - vkb::core::HPPShaderSource vert_shader("imgui.vert"); - vkb::core::HPPShaderSource frag_shader("imgui.frag"); - - std::vector shader_modules; - shader_modules.push_back(&device.get_resource_cache().request_shader_module(vk::ShaderStageFlagBits::eVertex, vert_shader, {})); - shader_modules.push_back(&device.get_resource_cache().request_shader_module(vk::ShaderStageFlagBits::eFragment, frag_shader, {})); - - pipeline_layout = &device.get_resource_cache().request_pipeline_layout(shader_modules); - - // Determine the filtering to be used, based on what is supported for the format - const vk::FormatProperties fmt_props = device.get_gpu().get_handle().getFormatProperties(font_image_view->get_format()); - - vk::Filter filter = (fmt_props.optimalTilingFeatures & vk::FormatFeatureFlagBits::eSampledImageFilterLinear) ? - vk::Filter::eLinear : - vk::Filter::eNearest; - - // Create texture sampler - vk::SamplerCreateInfo sampler_info; - sampler_info.maxAnisotropy = 1.0f; - sampler_info.magFilter = filter; - sampler_info.minFilter = filter; - sampler_info.mipmapMode = vk::SamplerMipmapMode::eNearest; - sampler_info.addressModeU = vk::SamplerAddressMode::eClampToEdge; - sampler_info.addressModeV = vk::SamplerAddressMode::eClampToEdge; - sampler_info.addressModeW = vk::SamplerAddressMode::eClampToEdge; - sampler_info.borderColor = vk::BorderColor::eFloatOpaqueWhite; - - sampler = std::make_unique(device, sampler_info); - sampler->set_debug_name("GUI sampler"); - - if (explicit_update) - { - auto &device = sample.get_render_context().get_device(); - - vertex_buffer = - vkb::core::BufferBuilderCpp(1) - .with_usage(vk::BufferUsageFlagBits::eVertexBuffer) - .with_vma_usage(VMA_MEMORY_USAGE_GPU_TO_CPU) - .with_debug_name("GUI vertex buffer") - .build_unique(device); - - index_buffer = - vkb::core::BufferBuilderCpp(1) - .with_usage(vk::BufferUsageFlagBits::eIndexBuffer) - .with_vma_usage(VMA_MEMORY_USAGE_GPU_TO_CPU) - .with_debug_name("GUI index buffer") - .build_unique(device); - } -} - -void HPPGui::prepare(vk::PipelineCache pipeline_cache, vk::RenderPass render_pass, const std::vector &shader_stages) -{ - vk::Device device = sample.get_render_context().get_device().get_handle(); - - // Descriptor pool - vk::DescriptorPoolSize pool_size(vk::DescriptorType::eCombinedImageSampler, 1); - vk::DescriptorPoolCreateInfo descriptor_pool_create_info({}, 2, pool_size); - descriptor_pool = device.createDescriptorPool(descriptor_pool_create_info); - - // Descriptor set layout - vk::DescriptorSetLayoutBinding layout_binding(0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment); - vk::DescriptorSetLayoutCreateInfo descriptor_set_layout_create_info({}, layout_binding); - descriptor_set_layout = device.createDescriptorSetLayout(descriptor_set_layout_create_info); - - // Descriptor set -#if defined(ANDROID) - vk::DescriptorSetAllocateInfo descriptor_set_allocate_info(descriptor_pool, 1, &descriptor_set_layout); -#else - vk::DescriptorSetAllocateInfo descriptor_set_allocate_info(descriptor_pool, descriptor_set_layout); -#endif - descriptor_set = device.allocateDescriptorSets(descriptor_set_allocate_info).front(); - - vk::DescriptorImageInfo font_descriptor(sampler->get_handle(), font_image_view->get_handle(), vk::ImageLayout::eShaderReadOnlyOptimal); - vk::WriteDescriptorSet write_descriptor_set(descriptor_set, 0, 0, vk::DescriptorType::eCombinedImageSampler, font_descriptor); - device.updateDescriptorSets(write_descriptor_set, {}); - - // Setup graphics pipeline for UI rendering - - // Vertex bindings an attributes based on ImGui vertex definition - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(ImDrawVert), vk::VertexInputRate::eVertex); - std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32Sfloat, offsetof(ImDrawVert, pos)}, // Location 0: Position - {1, 0, vk::Format::eR32G32Sfloat, offsetof(ImDrawVert, uv)}, // Location 1 : UV - {2, 0, vk::Format::eR8G8B8A8Unorm, offsetof(ImDrawVert, col)}}}; // Location 2: Color - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); - - vk::PipelineInputAssemblyStateCreateInfo input_assembly_state({}, vk::PrimitiveTopology::eTriangleList, false); - - vk::PipelineViewportStateCreateInfo viewport_state({}, 1, nullptr, 1, nullptr); - - vk::PipelineRasterizationStateCreateInfo rasterization_state( - {}, false, {}, vk::PolygonMode::eFill, vk::CullModeFlagBits::eNone, vk::FrontFace::eCounterClockwise, {}, {}, {}, {}, 1.0f); - - vk::PipelineMultisampleStateCreateInfo multisample_state({}, vk::SampleCountFlagBits::e1); - - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state({}, false, false, vk::CompareOp::eAlways, {}, {}, {}, {{}, {}, {}, vk::CompareOp::eAlways}); - - // Enable blending - vk::PipelineColorBlendAttachmentState blend_attachment_state(true, - vk::BlendFactor::eSrcAlpha, - vk::BlendFactor::eOneMinusSrcAlpha, - vk::BlendOp::eAdd, - vk::BlendFactor::eOneMinusSrcAlpha, - vk::BlendFactor::eZero, - vk::BlendOp::eAdd, - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | - vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA); - vk::PipelineColorBlendStateCreateInfo color_blend_state({}, {}, {}, blend_attachment_state); - - std::array dynamic_state_enables = {{vk::DynamicState::eViewport, vk::DynamicState::eScissor}}; - vk::PipelineDynamicStateCreateInfo dynamic_state({}, dynamic_state_enables); - - vk::GraphicsPipelineCreateInfo pipeline_create_info({}, - shader_stages, - &vertex_input_state, - &input_assembly_state, - nullptr, - &viewport_state, - &rasterization_state, - &multisample_state, - &depth_stencil_state, - &color_blend_state, - &dynamic_state, - pipeline_layout->get_handle(), - render_pass, - 0, - nullptr, - -1); - - pipeline = device.createGraphicsPipeline(pipeline_cache, pipeline_create_info).value; -} - -void HPPGui::update(const float delta_time) -{ - if (visible != prev_visible) - { - drawer.set_dirty(true); - prev_visible = visible; - } - - if (!visible) - { - ImGui::EndFrame(); - return; - } - - // Update imGui - ImGuiIO &io = ImGui::GetIO(); - auto extent = sample.get_render_context().get_surface_extent(); - resize(extent.width, extent.height); - io.DeltaTime = delta_time; - - // Render to generate draw buffers - ImGui::Render(); -} - -bool HPPGui::update_buffers() -{ - ImDrawData *draw_data = ImGui::GetDrawData(); - bool updated = false; - - if (!draw_data) - { - return false; - } - - size_t vertex_buffer_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); - size_t index_buffer_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); - - if ((vertex_buffer_size == 0) || (index_buffer_size == 0)) - { - return false; - } - - if ((!vertex_buffer->get_handle()) || (vertex_buffer_size != last_vertex_buffer_size)) - { - last_vertex_buffer_size = vertex_buffer_size; - updated = true; - - vertex_buffer = std::make_unique(sample.get_render_context().get_device(), vertex_buffer_size, - vk::BufferUsageFlagBits::eVertexBuffer, - VMA_MEMORY_USAGE_GPU_TO_CPU); - vertex_buffer->set_debug_name("GUI vertex buffer"); - } - - if ((!index_buffer->get_handle()) || (index_buffer_size != last_index_buffer_size)) - { - last_index_buffer_size = index_buffer_size; - updated = true; - - index_buffer = std::make_unique(sample.get_render_context().get_device(), index_buffer_size, - vk::BufferUsageFlagBits::eIndexBuffer, - VMA_MEMORY_USAGE_GPU_TO_CPU); - index_buffer->set_debug_name("GUI index buffer"); - } - - // Upload data - upload_draw_data(draw_data, vertex_buffer->map(), index_buffer->map()); - - vertex_buffer->flush(); - index_buffer->flush(); - - vertex_buffer->unmap(); - index_buffer->unmap(); - - return updated; -} - -void HPPGui::update_buffers(vkb::core::HPPCommandBuffer &command_buffer) const -{ - ImDrawData *draw_data = ImGui::GetDrawData(); - vkb::rendering::HPPRenderFrame &render_frame = sample.get_render_context().get_active_frame(); - - if (!draw_data || (draw_data->TotalVtxCount == 0) || (draw_data->TotalIdxCount == 0)) - { - return; - } - - size_t vertex_buffer_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); - size_t index_buffer_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); - - std::vector vertex_data(vertex_buffer_size); - std::vector index_data(index_buffer_size); - - upload_draw_data(draw_data, vertex_data.data(), index_data.data()); - - auto vertex_allocation = render_frame.allocate_buffer(vk::BufferUsageFlagBits::eVertexBuffer, vertex_buffer_size); - - vertex_allocation.update(vertex_data); - - std::vector> buffers; - buffers.emplace_back(std::ref(vertex_allocation.get_buffer())); - - command_buffer.bind_vertex_buffers(0, buffers, {vertex_allocation.get_offset()}); - - auto index_allocation = render_frame.allocate_buffer(vk::BufferUsageFlagBits::eIndexBuffer, index_buffer_size); - - index_allocation.update(index_data); - - command_buffer.bind_index_buffer(index_allocation.get_buffer(), index_allocation.get_offset(), vk::IndexType::eUint16); -} - -void HPPGui::resize(uint32_t width, uint32_t height) const -{ - auto &io = ImGui::GetIO(); - io.DisplaySize.x = static_cast(width); - io.DisplaySize.y = static_cast(height); -} - -void HPPGui::new_frame() const -{ - ImGui::NewFrame(); -} - -void HPPGui::draw(vkb::core::HPPCommandBuffer &command_buffer) -{ - if (!visible) - { - return; - } - - vkb::core::HPPScopedDebugLabel debug_label(command_buffer, "GUI"); - - // Vertex input state - vk::VertexInputBindingDescription vertex_input_binding({}, to_u32(sizeof(ImDrawVert))); - - // Location 0: Position - vk::VertexInputAttributeDescription pos_attr(0, 0, vk::Format::eR32G32Sfloat, to_u32(offsetof(ImDrawVert, pos))); - - // Location 1: UV - vk::VertexInputAttributeDescription uv_attr(1, 0, vk::Format::eR32G32Sfloat, to_u32(offsetof(ImDrawVert, uv))); - - // Location 2: Color - vk::VertexInputAttributeDescription col_attr(2, 0, vk::Format::eR8G8B8A8Unorm, to_u32(offsetof(ImDrawVert, col))); - - vkb::rendering::HPPVertexInputState vertex_input_state; - vertex_input_state.bindings = {vertex_input_binding}; - vertex_input_state.attributes = {pos_attr, uv_attr, col_attr}; - - command_buffer.set_vertex_input_state(vertex_input_state); - - // Blend state - vkb::rendering::HPPColorBlendAttachmentState color_attachment; - color_attachment.blend_enable = true; - color_attachment.color_write_mask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB; - color_attachment.src_color_blend_factor = vk::BlendFactor::eSrcAlpha; - color_attachment.dst_color_blend_factor = vk::BlendFactor::eOneMinusSrcAlpha; - color_attachment.src_alpha_blend_factor = vk::BlendFactor::eOneMinusSrcAlpha; - - vkb::rendering::HPPColorBlendState blend_state{}; - blend_state.attachments = {color_attachment}; - - command_buffer.set_color_blend_state(blend_state); - - vkb::rendering::HPPRasterizationState rasterization_state{}; - rasterization_state.cull_mode = vk::CullModeFlagBits::eNone; - command_buffer.set_rasterization_state(rasterization_state); - - vkb::rendering::HPPDepthStencilState depth_state{}; - depth_state.depth_test_enable = false; - depth_state.depth_write_enable = false; - command_buffer.set_depth_stencil_state(depth_state); - - // Bind pipeline layout - command_buffer.bind_pipeline_layout(*pipeline_layout); - - command_buffer.bind_image(*font_image_view, *sampler, 0, 0, 0); - - // Pre-rotation - auto &io = ImGui::GetIO(); - auto push_transform = glm::mat4(1.0f); - - if (sample.get_render_context().has_swapchain()) - { - auto transform = sample.get_render_context().get_swapchain().get_transform(); - - glm::vec3 rotation_axis = glm::vec3(0.0f, 0.0f, 1.0f); - if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate90) - { - push_transform = glm::rotate(push_transform, glm::radians(90.0f), rotation_axis); - } - else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate270) - { - push_transform = glm::rotate(push_transform, glm::radians(270.0f), rotation_axis); - } - else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate180) - { - push_transform = glm::rotate(push_transform, glm::radians(180.0f), rotation_axis); - } - } - - // GUI coordinate space to screen space - push_transform = glm::translate(push_transform, glm::vec3(-1.0f, -1.0f, 0.0f)); - push_transform = glm::scale(push_transform, glm::vec3(2.0f / io.DisplaySize.x, 2.0f / io.DisplaySize.y, 0.0f)); - - // Push constants - command_buffer.push_constants(push_transform); - - // If a render context is used, then use the frames buffer pools to allocate GUI vertex/index data from - if (!explicit_update) - { - update_buffers(command_buffer); - } - else - { - std::vector> buffers; - buffers.push_back(*vertex_buffer); - command_buffer.bind_vertex_buffers(0, buffers, {0}); - - command_buffer.bind_index_buffer(*index_buffer, 0, vk::IndexType::eUint16); - } - - // Render commands - ImDrawData *draw_data = ImGui::GetDrawData(); - int32_t vertex_offset = 0; - uint32_t index_offset = 0; - - if (!draw_data || draw_data->CmdListsCount == 0) - { - return; - } - - for (int32_t i = 0; i < draw_data->CmdListsCount; i++) - { - const ImDrawList *cmd_list = draw_data->CmdLists[i]; - for (int32_t j = 0; j < cmd_list->CmdBuffer.Size; j++) - { - const ImDrawCmd *cmd = &cmd_list->CmdBuffer[j]; - vk::Rect2D scissor_rect; - scissor_rect.offset.x = std::max(static_cast(cmd->ClipRect.x), 0); - scissor_rect.offset.y = std::max(static_cast(cmd->ClipRect.y), 0); - scissor_rect.extent.width = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - scissor_rect.extent.height = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - - // Adjust for pre-rotation if necessary - if (sample.get_render_context().has_swapchain()) - { - auto transform = sample.get_render_context().get_swapchain().get_transform(); - if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate90) - { - scissor_rect.offset.x = static_cast(io.DisplaySize.y - cmd->ClipRect.w); - scissor_rect.offset.y = static_cast(cmd->ClipRect.x); - scissor_rect.extent.width = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - scissor_rect.extent.height = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - } - else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate180) - { - scissor_rect.offset.x = static_cast(io.DisplaySize.x - cmd->ClipRect.z); - scissor_rect.offset.y = static_cast(io.DisplaySize.y - cmd->ClipRect.w); - scissor_rect.extent.width = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - scissor_rect.extent.height = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - } - else if (transform & vk::SurfaceTransformFlagBitsKHR::eRotate270) - { - scissor_rect.offset.x = static_cast(cmd->ClipRect.y); - scissor_rect.offset.y = static_cast(io.DisplaySize.x - cmd->ClipRect.z); - scissor_rect.extent.width = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - scissor_rect.extent.height = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - } - } - - command_buffer.set_scissor(0, {scissor_rect}); - command_buffer.draw_indexed(cmd->ElemCount, 1, index_offset, vertex_offset, 0); - index_offset += cmd->ElemCount; - } - vertex_offset += cmd_list->VtxBuffer.Size; - } -} - -void HPPGui::draw(vk::CommandBuffer command_buffer) const -{ - if (!visible) - { - return; - } - - ImDrawData *draw_data = ImGui::GetDrawData(); - - if ((!draw_data) || (draw_data->CmdListsCount == 0)) - { - return; - } - - command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); - command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline_layout->get_handle(), 0, descriptor_set, {}); - - // Push constants - auto &io = ImGui::GetIO(); - glm::mat4 push_transform = glm::scale(glm::translate(glm::mat4(1.0f), glm::vec3(-1.0f, -1.0f, 0.0f)), glm::vec3(2.0f / io.DisplaySize.x, 2.0f / io.DisplaySize.y, 0.0f)); - command_buffer.pushConstants(pipeline_layout->get_handle(), vk::ShaderStageFlagBits::eVertex, 0, push_transform); - - vk::DeviceSize offset = 0; - command_buffer.bindVertexBuffers(0, vertex_buffer->get_handle(), offset); - - command_buffer.bindIndexBuffer(index_buffer->get_handle(), 0, vk::IndexType::eUint16); - - int32_t vertex_offset = 0; - int32_t index_offset = 0; - for (int32_t i = 0; i < draw_data->CmdListsCount; i++) - { - const ImDrawList *cmd_list = draw_data->CmdLists[i]; - for (int32_t j = 0; j < cmd_list->CmdBuffer.Size; j++) - { - const ImDrawCmd *cmd = &cmd_list->CmdBuffer[j]; - vk::Rect2D scissor_rect; - scissor_rect.offset.x = std::max(static_cast(cmd->ClipRect.x), 0); - scissor_rect.offset.y = std::max(static_cast(cmd->ClipRect.y), 0); - scissor_rect.extent.width = static_cast(cmd->ClipRect.z - cmd->ClipRect.x); - scissor_rect.extent.height = static_cast(cmd->ClipRect.w - cmd->ClipRect.y); - - command_buffer.setScissor(0, scissor_rect); - command_buffer.drawIndexed(cmd->ElemCount, 1, index_offset, vertex_offset, 0); - index_offset += cmd->ElemCount; - } - vertex_offset += cmd_list->VtxBuffer.Size; - } -} - -HPPGui::~HPPGui() -{ - vk::Device device = sample.get_render_context().get_device().get_handle(); - // descriptor_set is implicitly freed by destroying descriptor_pool! - device.destroyDescriptorPool(descriptor_pool); - device.destroyDescriptorSetLayout(descriptor_set_layout); - device.destroyPipeline(pipeline); - - ImGui::DestroyContext(); -} - -void HPPGui::show_demo_window() const -{ - ImGui::ShowDemoWindow(); -} - -const HPPGui::StatsView &HPPGui::get_stats_view() const -{ - return stats_view; -} - -Drawer &HPPGui::get_drawer() -{ - return drawer; -} - -HPPFont const &HPPGui::get_font(const std::string &font_name) const -{ - assert(!fonts.empty() && "No fonts exist"); - - auto it = std::find_if(fonts.begin(), fonts.end(), [&font_name](HPPFont const &font) { return font.name == font_name; }); - - if (it != fonts.end()) - { - return *it; - } - else - { - LOGW("Couldn't find font with name {}", font_name); - return *fonts.begin(); - } -} - -bool HPPGui::is_debug_view_active() const -{ - return debug_view.active; -} - -HPPGui::StatsView::StatsView(const vkb::stats::HPPStats *stats) -{ - if (stats == nullptr) - { - return; - } - - // Request graph data information for each stat and record it in graph_map - const std::set &indices = stats->get_requested_stats(); - - for (StatIndex i : indices) - { - graph_map[i] = stats->get_graph_data(i); - } -} - -void HPPGui::StatsView::reset_max_value(const StatIndex index) -{ - auto pr = graph_map.find(index); - if (pr != graph_map.end()) - { - reset_graph_max_value(pr->second); - } -} - -void HPPGui::StatsView::reset_max_values() -{ - // For every entry in the map - std::for_each(graph_map.begin(), graph_map.end(), [](auto &pr) { reset_graph_max_value(pr.second); }); -} - -void HPPGui::show_top_window(const std::string &app_name, const vkb::stats::HPPStats *stats, const DebugInfo *debug_info) -{ - // Transparent background - ImGui::SetNextWindowBgAlpha(overlay_alpha); - ImVec2 size{ImGui::GetIO().DisplaySize.x, 0.0f}; - ImGui::SetNextWindowSize(size, ImGuiCond_Always); - - // Top left - ImVec2 pos{0.0f, 0.0f}; - ImGui::SetNextWindowPos(pos, ImGuiCond_Always); - - bool is_open = true; - ImGui::Begin("Top", &is_open, common_flags); - - show_app_info(app_name); - - if (stats) - { - show_stats(*stats); - - // Reset max values if user taps on this window - if (ImGui::IsWindowHovered() && ImGui::IsMouseClicked(0 /* left */)) - { - stats_view.reset_max_values(); - } - } - - if (debug_info) - { - if (debug_view.active) - { - show_debug_window(*debug_info, ImVec2{0, ImGui::GetWindowSize().y}); - } - } - - ImGui::End(); -} - -void HPPGui::show_app_info(const std::string &app_name) const -{ - // Sample name - ImGui::Text("%s", app_name.c_str()); - - // GPU name - auto &device = sample.get_render_context().get_device(); - auto device_name_label = "GPU: " + std::string(device.get_gpu().get_properties().deviceName.data()); - ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize(device_name_label.c_str()).x); - ImGui::Text("%s", device_name_label.c_str()); -} - -void HPPGui::show_debug_window(const DebugInfo &debug_info, const ImVec2 &position) -{ - auto &io = ImGui::GetIO(); - auto &style = ImGui::GetStyle(); - auto &font = get_font("RobotoMono-Regular"); - - // Calculate only once - if (debug_view.label_column_width == 0) - { - debug_view.label_column_width = style.ItemInnerSpacing.x + debug_info.get_longest_label() * font.size / debug_view.scale; - } - - ImGui::SetNextWindowBgAlpha(overlay_alpha); - ImGui::SetNextWindowPos(position, ImGuiCond_FirstUseEver); - ImGui::SetNextWindowContentSize(ImVec2{io.DisplaySize.x, 0.0f}); - - bool is_open = true; - const ImGuiWindowFlags flags = ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoNav; - - ImGui::Begin("Debug Window", &is_open, flags); - ImGui::PushFont(font.handle); - - auto field_count = debug_info.get_fields().size() > debug_view.max_fields ? debug_view.max_fields : debug_info.get_fields().size(); - - ImGui::BeginChild("Table", ImVec2(0, field_count * (font.size + style.ItemSpacing.y)), false); - ImGui::Columns(2); - ImGui::SetColumnWidth(0, debug_view.label_column_width); - ImGui::SetColumnWidth(1, io.DisplaySize.x - debug_view.label_column_width); - for (auto &field : debug_info.get_fields()) - { - const std::string &label = field->label; - const std::string &value = field->to_string(); - ImGui::Text("%s", label.c_str()); - ImGui::NextColumn(); - ImGui::Text(" %s", value.c_str()); - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::EndChild(); - - ImGui::PopFont(); - ImGui::End(); -} - -void HPPGui::show_stats(const vkb::stats::HPPStats &stats) -{ - for (const auto &stat_index : stats.get_requested_stats()) - { - // Find the graph data of this stat index - auto pr = stats_view.graph_map.find(stat_index); - - assert(pr != stats_view.graph_map.end() && "StatIndex not implemented in gui graph_map"); - - // Draw graph - auto &graph_data = pr->second; - const auto &graph_elements = stats.get_data(stat_index); - float graph_min = 0.0f; - float &graph_max = graph_data.max_value; - - if (!graph_data.has_fixed_max) - { - auto new_max = *std::max_element(graph_elements.begin(), graph_elements.end()) * stats_view.top_padding; - if (new_max > graph_max) - { - graph_max = new_max; - } - } - - const ImVec2 graph_size = ImVec2{ - ImGui::GetIO().DisplaySize.x, - stats_view.graph_height /* dpi */ * dpi_factor}; - - std::stringstream graph_label; - float avg = std::accumulate(graph_elements.begin(), graph_elements.end(), 0.0f) / graph_elements.size(); - - // Check if the stat is available in the current platform - if (stats.is_available(stat_index)) - { - graph_label << fmt::format(graph_data.name + ": " + graph_data.format, avg * graph_data.scale_factor); - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PlotLines("", &graph_elements[0], static_cast(graph_elements.size()), 0, graph_label.str().c_str(), graph_min, graph_max, graph_size); - ImGui::PopItemFlag(); - } - else - { - graph_label << graph_data.name << ": not available"; - ImGui::Text("%s", graph_label.str().c_str()); - } - } -} - -void HPPGui::show_options_window(std::function body, const uint32_t lines) const -{ - // Add padding around the text so that the options are not - // too close to the edges and are easier to interact with. - // Also add double vertical padding to avoid rounded corners. - const float window_padding = ImGui::CalcTextSize("T").x; - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{window_padding, window_padding * 2.0f}); - auto window_height = lines * ImGui::GetTextLineHeightWithSpacing() + ImGui::GetStyle().WindowPadding.y * 2.0f; - auto window_width = ImGui::GetIO().DisplaySize.x; - ImGui::SetNextWindowBgAlpha(overlay_alpha); - const ImVec2 size = ImVec2(window_width, 0); - ImGui::SetNextWindowSize(size, ImGuiCond_Always); - const ImVec2 pos = ImVec2(0.0f, ImGui::GetIO().DisplaySize.y - window_height); - ImGui::SetNextWindowPos(pos, ImGuiCond_Always); - const ImGuiWindowFlags flags = (ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_AlwaysUseWindowPadding | - ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoFocusOnAppearing); - bool is_open = true; - ImGui::Begin("Options", &is_open, flags); - body(); - ImGui::End(); - ImGui::PopStyleVar(); -} - -void HPPGui::show_simple_window(const std::string &name, uint32_t last_fps, std::function body) const -{ - ImGuiIO &io = ImGui::GetIO(); - - ImGui::NewFrame(); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - ImGui::SetNextWindowPos(ImVec2(10, 10)); - ImGui::SetNextWindowSize(ImVec2(0, 0), ImGuiCond_FirstUseEver); - ImGui::Begin("Vulkan Example", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); - ImGui::TextUnformatted(name.c_str()); - ImGui::TextUnformatted(sample.get_render_context().get_device().get_gpu().get_properties().deviceName.data()); - ImGui::Text("%.2f ms/frame (%.1d fps)", (1000.0f / last_fps), last_fps); - ImGui::PushItemWidth(110.0f * dpi_factor); - - body(); - - ImGui::PopItemWidth(); - ImGui::End(); - ImGui::PopStyleVar(); -} - -bool HPPGui::input_event(const InputEvent &input_event) -{ - auto &io = ImGui::GetIO(); - auto capture_move_event = false; - - if (input_event.get_source() == EventSource::Keyboard) - { - const auto &key_event = static_cast(input_event); - - if (key_event.get_action() == KeyAction::Down) - { - io.KeysDown[static_cast(key_event.get_code())] = true; - } - else if (key_event.get_action() == KeyAction::Up) - { - io.KeysDown[static_cast(key_event.get_code())] = false; - } - } - else if (input_event.get_source() == EventSource::Mouse) - { - const auto &mouse_button = static_cast(input_event); - - io.MousePos = ImVec2{mouse_button.get_pos_x() * content_scale_factor, - mouse_button.get_pos_y() * content_scale_factor}; - - auto button_id = static_cast(mouse_button.get_button()); - - if (mouse_button.get_action() == MouseAction::Down) - { - io.MouseDown[button_id] = true; - } - else if (mouse_button.get_action() == MouseAction::Up) - { - io.MouseDown[button_id] = false; - } - else if (mouse_button.get_action() == MouseAction::Move) - { - capture_move_event = io.WantCaptureMouse; - } - } - else if (input_event.get_source() == EventSource::Touchscreen) - { - const auto &touch_event = static_cast(input_event); - - io.MousePos = ImVec2{touch_event.get_pos_x(), touch_event.get_pos_y()}; - - if (touch_event.get_action() == TouchAction::Down) - { - io.MouseDown[touch_event.get_pointer_id()] = true; - } - else if (touch_event.get_action() == TouchAction::Up) - { - io.MouseDown[touch_event.get_pointer_id()] = false; - } - else if (touch_event.get_action() == TouchAction::Move) - { - capture_move_event = io.WantCaptureMouse; - } - } - - // Toggle GUI elements when tap or clicking outside the GUI windows - if (!io.WantCaptureMouse) - { - bool press_down = (input_event.get_source() == EventSource::Mouse && static_cast(input_event).get_action() == MouseAction::Down) || (input_event.get_source() == EventSource::Touchscreen && static_cast(input_event).get_action() == TouchAction::Down); - bool press_up = (input_event.get_source() == EventSource::Mouse && static_cast(input_event).get_action() == MouseAction::Up) || (input_event.get_source() == EventSource::Touchscreen && static_cast(input_event).get_action() == TouchAction::Up); - - if (press_down) - { - timer.start(); - if (input_event.get_source() == EventSource::Touchscreen) - { - const auto &touch_event = static_cast(input_event); - if (touch_event.get_touch_points() == 2) - { - two_finger_tap = true; - } - } - } - if (press_up) - { - auto press_delta = timer.stop(); - if (press_delta < press_time_ms) - { - if (input_event.get_source() == EventSource::Mouse) - { - const auto &mouse_button = static_cast(input_event); - if (mouse_button.get_button() == MouseButton::Right) - { - debug_view.active = !debug_view.active; - } - } - else if (input_event.get_source() == EventSource::Touchscreen) - { - const auto &touch_event = static_cast(input_event); - if (two_finger_tap && touch_event.get_touch_points() == 2) - { - debug_view.active = !debug_view.active; - } - else - { - two_finger_tap = false; - } - } - } - } - } - - return capture_move_event; -} - -} // namespace vkb diff --git a/framework/hpp_gui.h b/framework/hpp_gui.h deleted file mode 100644 index d45cc159b3..0000000000 --- a/framework/hpp_gui.h +++ /dev/null @@ -1,288 +0,0 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -#include "core/hpp_command_buffer.h" -#include "core/hpp_image_view.h" -#include "core/hpp_pipeline_layout.h" -#include "debug_info.h" -#include "drawer.h" -#include "filesystem/legacy.h" -#include "platform/input_events.h" -#include "stats/hpp_stats.h" - -namespace vkb -{ -template -class VulkanSample; -using VulkanSampleCpp = VulkanSample; - -/** - * @brief Helper structure for fonts loaded from TTF - */ -struct HPPFont -{ - /** - * @brief Constructor - * @param name The name of the font file that exists within 'assets/fonts' (without extension) - * @param size The font size, scaled by DPI - */ - HPPFont(const std::string &name, float size) : - name{name}, - data{vkb::fs::read_asset("fonts/" + name + ".ttf")}, - size{size} - { - // Keep ownership of the font data to avoid a double delete - ImFontConfig font_config{}; - font_config.FontDataOwnedByAtlas = false; - - if (size < 1.0f) - { - size = 20.0f; - } - - ImGuiIO &io = ImGui::GetIO(); - handle = io.Fonts->AddFontFromMemoryTTF(data.data(), static_cast(data.size()), size, &font_config); - } - - std::vector data; - ImFont *handle = nullptr; - std::string name; - float size = 0.0f; -}; - -/** - * @brief Vulkan helper class for Dear ImGui, based on vulkan.hpp - */ -class HPPGui -{ - public: - /** - * @brief Helper class for drawing statistics - */ - class StatsView - { - public: - /** - * @brief Constructs a StatsView - * @param stats Const pointer to the Stats data object; may be null - */ - StatsView(const vkb::stats::HPPStats *stats); - - /** - * @brief Resets the max values for the stats - * which do not have a fixed max - */ - void reset_max_values(); - - /** - * @brief Resets the max value for a specific stat - */ - void reset_max_value(StatIndex index); - - public: - std::map graph_map; - float graph_height = 50.0f; - float top_padding = 1.1f; - }; - - public: - // The name of the default font file to use - static const std::string default_font; - // Used to show/hide the GUI - static bool visible; - - public: - /** - * @brief Initializes the HPPGui - * @param sample A vulkan render context - * @param window A Window object from which to draw DPI and content scaling information - * @param stats A statistics object (null if no statistics are used) - * @param font_size The font size - * @param explicit_update If true, update buffers every frame - */ - HPPGui(VulkanSampleCpp &sample, - const vkb::Window &window, - const vkb::stats::HPPStats *stats = nullptr, - float font_size = 21.0f, - bool explicit_update = false); - - /** - * @brief Destroys the HPPGui - */ - ~HPPGui(); - - void prepare(vk::PipelineCache pipeline_cache, vk::RenderPass render_pass, const std::vector &shader_stages); - - /** - * @brief Handles resizing of the window - * @param width New width of the window - * @param height New height of the window - */ - void resize(uint32_t width, uint32_t height) const; - - /** - * @brief Starts a new ImGui frame - * to be called before drawing any window - */ - void new_frame() const; - - /** - * @brief Updates the HPPGui - * @param delta_time Time passed since last update - */ - void update(float delta_time); - - bool update_buffers(); - - /** - * @brief Draws the HPPGui - * @param command_buffer Command buffer to register draw-commands - */ - void draw(vkb::core::HPPCommandBuffer &command_buffer); - - /** - * @brief Draws the HPPGui - * @param command_buffer Command buffer to register draw-commands - */ - void draw(vk::CommandBuffer command_buffer) const; - - /** - * @brief Shows an overlay top window with app info and maybe stats - * @param app_name Application name - * @param stats Statistics to show (can be null) - * @param debug_info Debug info to show (can be null) - */ - void show_top_window(const std::string &app_name, const vkb::stats::HPPStats *stats = nullptr, const DebugInfo *debug_info = nullptr); - - /** - * @brief Shows the ImGui Demo window - */ - void show_demo_window() const; - - /** - * @brief Shows an child with app info - * @param app_name Application name - */ - void show_app_info(const std::string &app_name) const; - - /** - * @brief Shows a moveable window with debug information - * @param debug_info The object holding the data fields to be displayed - * @param position The absolute position to set - */ - void show_debug_window(const DebugInfo &debug_info, const ImVec2 &position); - - /** - * @brief Shows a child with statistics - * @param stats Statistics to show - */ - void show_stats(const vkb::stats::HPPStats &stats); - - /** - * @brief Shows an options windows, to be filled by the sample, - * which will be positioned at the top - * @param body ImGui commands defining the body of the window - * @param lines The number of lines of text to draw in the window - * These will help the gui to calculate the height of the window - */ - void show_options_window(std::function body, const uint32_t lines = 3) const; - - void show_simple_window(const std::string &name, uint32_t last_fps, std::function body) const; - - bool input_event(const InputEvent &input_event); - - /** - * @return The stats view - */ - const StatsView &get_stats_view() const; - - Drawer &get_drawer(); - - HPPFont const &get_font(const std::string &font_name = HPPGui::default_font) const; - - bool is_debug_view_active() const; - - private: - /** - * @brief Updates Vulkan buffers - * @param frame Frame to render into - */ - void update_buffers(vkb::core::HPPCommandBuffer &command_buffer) const; - - private: - /** - * @brief Helper class for rendering debug statistics in the GUI - */ - struct DebugView - { - bool active = false; - uint32_t max_fields = 8; - float label_column_width = 0; - float scale = 1.7f; - }; - - struct PushConstBlock - { - glm::vec2 scale; - glm::vec2 translate; - }; - - private: - /** - * @brief Block size of a buffer pool in kilobytes - */ - static constexpr uint32_t BUFFER_POOL_BLOCK_SIZE = 256; - - static const double press_time_ms; - static const float overlay_alpha; - static const ImGuiWindowFlags common_flags; - static const ImGuiWindowFlags options_flags; - static const ImGuiWindowFlags info_flags; - - private: - PushConstBlock push_const_block; - VulkanSampleCpp &sample; - std::unique_ptr vertex_buffer; - std::unique_ptr index_buffer; - size_t last_vertex_buffer_size = 0; - size_t last_index_buffer_size = 0; - float content_scale_factor = 1.0f; // Scale factor to apply due to a difference between the window and GL pixel sizes - float dpi_factor = 1.0f; // Scale factor to apply to the size of gui elements (expressed in dp) - bool explicit_update = false; - Drawer drawer; - std::vector fonts; - std::unique_ptr font_image; - std::unique_ptr font_image_view; - std::unique_ptr sampler; - vkb::core::HPPPipelineLayout *pipeline_layout = nullptr; - StatsView stats_view; - DebugView debug_view; - vk::DescriptorPool descriptor_pool = nullptr; - vk::DescriptorSetLayout descriptor_set_layout = nullptr; - vk::DescriptorSet descriptor_set = nullptr; - vk::Pipeline pipeline = nullptr; - Timer timer; // Used to measure duration of input events - bool prev_visible = true; - bool two_finger_tap = false; // Whether or not the GUI has detected a multi touch gesture - bool show_graph_file_output = false; - uint32_t subpass = 0; -}; -} // namespace vkb diff --git a/framework/hpp_resource_binding_state.h b/framework/hpp_resource_binding_state.h index d3cb22c573..2e95588515 100644 --- a/framework/hpp_resource_binding_state.h +++ b/framework/hpp_resource_binding_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,11 +18,19 @@ #pragma once #include "resource_binding_state.h" -#include -#include namespace vkb { +namespace core +{ +template +class Buffer; +using BufferCpp = Buffer; + +class HPPImageView; +class HPPSampler; +} // namespace core + /** * @brief facade class around vkb::ResourceBindingState, providing a vulkan.hpp-based interface * diff --git a/framework/hpp_resource_cache.cpp b/framework/hpp_resource_cache.cpp index f5882f9dd4..cb9b55889e 100644 --- a/framework/hpp_resource_cache.cpp +++ b/framework/hpp_resource_cache.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,9 +16,9 @@ */ #include "hpp_resource_cache.h" +#include "core/device.h" #include #include -#include #include #include @@ -28,7 +28,7 @@ namespace { template T &request_resource( - vkb::core::HPPDevice &device, vkb::HPPResourceRecord &recorder, std::mutex &resource_mutex, std::unordered_map &resources, A &...args) + vkb::core::DeviceCpp &device, vkb::HPPResourceRecord &recorder, std::mutex &resource_mutex, std::unordered_map &resources, A &...args) { std::lock_guard guard(resource_mutex); @@ -38,7 +38,7 @@ T &request_resource( } } // namespace -HPPResourceCache::HPPResourceCache(vkb::core::HPPDevice &device) : +HPPResourceCache::HPPResourceCache(vkb::core::DeviceCpp &device) : device{device} {} @@ -169,7 +169,12 @@ void HPPResourceCache::update_descriptor_sets(const std::vectordescriptorType, image_info); + vk::WriteDescriptorSet write_descriptor_set{.dstSet = descriptor_set.get_handle(), + .dstBinding = binding, + .dstArrayElement = array_element, + .descriptorCount = 1, + .descriptorType = binding_info->descriptorType, + .pImageInfo = &image_info}; set_updates.push_back(write_descriptor_set); } else diff --git a/framework/hpp_resource_cache.h b/framework/hpp_resource_cache.h index 5095dbc6a4..a4a17fdf77 100644 --- a/framework/hpp_resource_cache.h +++ b/framework/hpp_resource_cache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -29,6 +29,10 @@ namespace vkb { namespace core { +template +class Device; +using DeviceCpp = Device; + class HPPDescriptorPool; class HPPDescriptorSetLayout; class HPPImageView; @@ -64,7 +68,7 @@ struct HPPResourceCacheState class HPPResourceCache { public: - HPPResourceCache(vkb::core::HPPDevice &device); + HPPResourceCache(vkb::core::DeviceCpp &device); HPPResourceCache(const HPPResourceCache &) = delete; HPPResourceCache(HPPResourceCache &&) = delete; @@ -101,7 +105,7 @@ class HPPResourceCache void warmup(const std::vector &data); private: - vkb::core::HPPDevice &device; + vkb::core::DeviceCpp &device; vkb::HPPResourceRecord recorder = {}; vkb::HPPResourceReplay replayer = {}; vk::PipelineCache pipeline_cache = nullptr; diff --git a/framework/hpp_semaphore_pool.h b/framework/hpp_semaphore_pool.h index 2997208474..0b53c9820f 100644 --- a/framework/hpp_semaphore_pool.h +++ b/framework/hpp_semaphore_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,15 @@ #pragma once #include "semaphore_pool.h" +#include namespace vkb { +namespace core +{ +class HPPDevice; +} + /** * @brief facade class around vkb::SemaphorePool, providing a vulkan.hpp-based interface * @@ -31,8 +37,8 @@ class HPPSemaphorePool : private vkb::SemaphorePool public: using vkb::SemaphorePool::reset; - HPPSemaphorePool(vkb::core::HPPDevice &device) : - vkb::SemaphorePool(reinterpret_cast(device)) + HPPSemaphorePool(vkb::core::DeviceCpp &device) : + vkb::SemaphorePool(reinterpret_cast(device)) {} void release_owned_semaphore(vk::Semaphore semaphore) diff --git a/framework/platform/android/android_platform.cpp b/framework/platform/android/android_platform.cpp index 5f629f574b..fc0ff97db4 100644 --- a/framework/platform/android/android_platform.cpp +++ b/framework/platform/android/android_platform.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -344,6 +344,10 @@ AndroidPlatform::AndroidPlatform(const PlatformContext &context) : ExitCode AndroidPlatform::initialize(const std::vector &plugins) { + for (auto plugin : plugins) + { + plugin->clear_platform(); + } android_app_set_key_event_filter(app, key_event_filter); android_app_set_motion_event_filter(app, motion_event_filter); @@ -461,6 +465,7 @@ void AndroidPlatform::terminate(ExitCode code) // Process events until app->destroyRequested is set } + plugins.clear(); Platform::terminate(code); } diff --git a/framework/platform/android/android_platform.h b/framework/platform/android/android_platform.h index f960b69f95..0f6085cbff 100644 --- a/framework/platform/android/android_platform.h +++ b/framework/platform/android/android_platform.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2024, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -81,8 +81,7 @@ inline bool process_android_events(android_app *app) int ident; int events; - while ((ident = ALooper_pollAll(0, nullptr, &events, - (void **) &source)) >= 0) + while ((ident = ALooper_pollOnce(0, nullptr, &events, (void **) &source)) > ALOOPER_POLL_TIMEOUT) { if (source) { diff --git a/framework/platform/android/android_window.cpp b/framework/platform/android/android_window.cpp index b3b569a91c..338d8d4b46 100644 --- a/framework/platform/android/android_window.cpp +++ b/framework/platform/android/android_window.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2023, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -28,7 +28,7 @@ AndroidWindow::AndroidWindow(AndroidPlatform *platform, ANativeWindow *&window, { } -VkSurfaceKHR AndroidWindow::create_surface(Instance &instance) +VkSurfaceKHR AndroidWindow::create_surface(vkb::core::InstanceC &instance) { return create_surface(instance.get_handle(), VK_NULL_HANDLE); } diff --git a/framework/platform/android/android_window.h b/framework/platform/android/android_window.h index 6f92b29bf2..8382d2c9c7 100644 --- a/framework/platform/android/android_window.h +++ b/framework/platform/android/android_window.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2023, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -47,7 +47,7 @@ class AndroidWindow : public Window * @brief Creates a Vulkan surface to the native window * If headless, this will return VK_NULL_HANDLE */ - virtual VkSurfaceKHR create_surface(Instance &instance) override; + virtual VkSurfaceKHR create_surface(vkb::core::InstanceC &instance) override; /** * @brief Creates a Vulkan surface to the native window diff --git a/framework/platform/application.cpp b/framework/platform/application.cpp index 03dff8ec82..5da8d31b6b 100644 --- a/framework/platform/application.cpp +++ b/framework/platform/application.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -84,19 +84,4 @@ DebugInfo &Application::get_debug_info() return debug_info; } -void Application::change_shader(const vkb::ShaderSourceLanguage &shader_language) -{ - LOGE("Not implemented by sample"); -} - -const std::map>> &Application::get_available_shaders() const -{ - return available_shaders; -} - -void Application::store_shaders(const vkb::ShaderSourceLanguage &shader_language, const std::vector> &list_of_shaders) -{ - available_shaders.insert({shader_language, list_of_shaders}); -} - } // namespace vkb diff --git a/framework/platform/application.h b/framework/platform/application.h index 72f05fc6ea..104d521231 100644 --- a/framework/platform/application.h +++ b/framework/platform/application.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -102,17 +102,6 @@ class Application requested_close = true; } - /** - * @brief Indicates that the plugin wants to change the shader in the sample - * @param shader_language language the shader uses - */ - virtual void change_shader(const vkb::ShaderSourceLanguage &shader_language); - - /** - * @brief Returns stored shaders by sample - */ - const std::map>> &get_available_shaders() const; - /** * @brief Set the shading language to be used for this sample (glsl, hlsl) * @param language The shading language that the sample will use @@ -124,14 +113,12 @@ class Application */ static vkb::ShadingLanguage get_shading_language(); - protected: /** - * @brief Stores a list of shaders for the active sample, used by plugins to dynamically change the shader - * @param shader_language The shader language for which the shader list will be provided - * @param list_of_shaders The shader list, where paths and shader types are provided + * @brief Returns the default folder for the currently selected shading language */ - void store_shaders(const vkb::ShaderSourceLanguage &shader_language, const std::vector> &list_of_shaders); + static std::string get_shader_folder(); + protected: float fps{0.0f}; float frame_time{0.0f}; // In ms @@ -147,11 +134,6 @@ class Application private: std::string name{}; - /** - * @brief stores the names of the shaders the sample uses - */ - std::map>> available_shaders; - // The debug info of the app DebugInfo debug_info{}; @@ -171,4 +153,17 @@ inline vkb::ShadingLanguage Application::get_shading_language() return shading_language; } +inline std::string Application::get_shader_folder() +{ + switch (shading_language) + { + case ShadingLanguage::HLSL: + return "hlsl"; + case ShadingLanguage::SLANG: + return "slang"; + default: + return "glsl"; + } +} + } // namespace vkb diff --git a/framework/platform/configuration.h b/framework/platform/configuration.h index f6a9cae25f..6473b1079d 100644 --- a/framework/platform/configuration.h +++ b/framework/platform/configuration.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +18,7 @@ #pragma once #include +#include #include #include #include diff --git a/framework/platform/glfw_window.cpp b/framework/platform/glfw_window.cpp index 9743b3e36d..a3d08eb75b 100644 --- a/framework/platform/glfw_window.cpp +++ b/framework/platform/glfw_window.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -334,7 +334,7 @@ GlfwWindow::~GlfwWindow() glfwTerminate(); } -VkSurfaceKHR GlfwWindow::create_surface(Instance &instance) +VkSurfaceKHR GlfwWindow::create_surface(vkb::core::InstanceC &instance) { return create_surface(instance.get_handle(), VK_NULL_HANDLE); } diff --git a/framework/platform/glfw_window.h b/framework/platform/glfw_window.h index 8f16433b20..0622b5c10c 100644 --- a/framework/platform/glfw_window.h +++ b/framework/platform/glfw_window.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -36,7 +36,7 @@ class GlfwWindow : public Window virtual ~GlfwWindow(); - VkSurfaceKHR create_surface(Instance &instance) override; + VkSurfaceKHR create_surface(vkb::core::InstanceC &instance) override; VkSurfaceKHR create_surface(VkInstance instance, VkPhysicalDevice physical_device) override; diff --git a/framework/platform/headless_window.cpp b/framework/platform/headless_window.cpp index 53528cd8cb..5d23b0cb32 100644 --- a/framework/platform/headless_window.cpp +++ b/framework/platform/headless_window.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,7 +24,7 @@ HeadlessWindow::HeadlessWindow(const Window::Properties &properties) : { } -VkSurfaceKHR HeadlessWindow::create_surface(Instance &instance) +VkSurfaceKHR HeadlessWindow::create_surface(vkb::core::InstanceC &instance) { return create_surface(instance.get_handle(), VK_NULL_HANDLE); } diff --git a/framework/platform/headless_window.h b/framework/platform/headless_window.h index e8225218b2..2f186f601d 100644 --- a/framework/platform/headless_window.h +++ b/framework/platform/headless_window.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -37,7 +37,7 @@ class HeadlessWindow : public Window * @brief A direct window doesn't have a surface * @returns VK_NULL_HANDLE */ - VkSurfaceKHR create_surface(Instance &instance) override; + VkSurfaceKHR create_surface(vkb::core::InstanceC &instance) override; /** * @brief A direct window doesn't have a surface diff --git a/framework/platform/ios/ios_window.h b/framework/platform/ios/ios_window.h index af35770492..d8aedaa6da 100644 --- a/framework/platform/ios/ios_window.h +++ b/framework/platform/ios/ios_window.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Inc. +/* Copyright (c) 2023-2025, Holochip Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -49,7 +49,7 @@ class IosWindow : public Window * @brief Creates a Vulkan surface to the native window * If headless, this will return VK_NULL_HANDLE */ - VkSurfaceKHR create_surface(Instance &instance) override; + VkSurfaceKHR create_surface(vkb::core::InstanceC &instance) override; /** * @brief Creates a Vulkan surface to the native window @@ -65,6 +65,8 @@ class IosWindow : public Window float get_dpi_factor() const override; + float get_content_scale_factor() const override; + std::vector get_required_surface_extensions() const override; VulkanView * get_vulkan_view() {return view;} diff --git a/framework/platform/ios/ios_window.mm b/framework/platform/ios/ios_window.mm index 4f1050aac3..7f7a0aa37d 100644 --- a/framework/platform/ios/ios_window.mm +++ b/framework/platform/ios/ios_window.mm @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Inc. +/* Copyright (c) 2023-2025, Holochip Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -29,7 +29,7 @@ { } -VkSurfaceKHR IosWindow::create_surface(Instance &instance) +VkSurfaceKHR IosWindow::create_surface(vkb::core::InstanceC &instance) { return create_surface(instance.get_handle(), VK_NULL_HANDLE); } @@ -72,6 +72,11 @@ return 1.0; } +float IosWindow::get_content_scale_factor() const +{ + return [[UIScreen mainScreen] nativeScale]; +} + std::vector IosWindow::get_required_surface_extensions() const { return {VK_EXT_METAL_SURFACE_EXTENSION_NAME}; diff --git a/framework/platform/parser.cpp b/framework/platform/parser.cpp deleted file mode 100644 index 1ed019dfc3..0000000000 --- a/framework/platform/parser.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (c) 2021-2023, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "parser.h" - -namespace vkb -{ -Command::Command(const std::string &name, const std::string &help_line) : - _name(name), - _help_line(help_line){ - - }; - -const std::string &Command::get_name() const -{ - assert(!_name.empty() && "Command name unset"); - return _name; -} - -void Command::set_name(const std::string &name) -{ - _name = name; -} - -const std::string &Command::get_help_line() const -{ - assert(!_help_line.empty() && "Command help line unset"); - return _help_line; -} - -void Command::set_help_line(const std::string &help_line) -{ - _help_line = help_line; -} - -MultipleCommands::MultipleCommands(const std::vector &commands) : - _commands(commands) -{} - -const std::vector &MultipleCommands::get_commands() const -{ - return _commands; -} - -CommandGroup::CommandGroup(const std::string &name, const std::vector &commands) : - TypedCommand(name, ""), MultipleCommands(commands) -{ -} - -SubCommand::SubCommand(const std::string &name, const std::string &help_line, const std::vector &commands) : - TypedCommand(name, help_line), MultipleCommands(commands) -{} - -PositionalCommand::PositionalCommand(const std::string &name, const std::string &help_line) : - TypedCommand(name, help_line) -{} - -FlagCommand::FlagCommand(FlagType type, const std::string &long_name, const std::string &short_name, const std::string &help_line) : - TypedCommand("", help_line), _type{type} -{ - std::string name; - - if (!short_name.empty()) - { - name += "-" + short_name; - } - - if (!long_name.empty()) - { - if (!name.empty()) - { - name += ","; - } - - name += "--" + long_name; - } - - Command::set_name(name); -} - -FlagType FlagCommand::get_flag_type() const -{ - return _type; -} - -bool CommandParser::parse(const std::vector &commands) -{ - return parse(nullptr, commands); -} - -bool CommandParser::parse(CommandParserContext *context, const std::vector &commands) -{ -#define PARSE(type) \ - if (command->is()) \ - { \ - parse(context, command->get()); \ - } - - for (auto *command : commands) - { - PARSE(SubCommand); - PARSE(PositionalCommand); - PARSE(FlagCommand); - PARSE(CommandGroup); - } - -#undef PARSE - - return true; -} - -} // namespace vkb \ No newline at end of file diff --git a/framework/platform/parser.h b/framework/platform/parser.h deleted file mode 100644 index 73e8e28768..0000000000 --- a/framework/platform/parser.h +++ /dev/null @@ -1,332 +0,0 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace vkb -{ -class Plugin; - -/** - * @brief Abstract wrapper for implementing lists of commands. Useful for the CommandParser - */ -class Command -{ - public: - Command(const std::string &name, const std::string &help_line); - virtual ~Command() = default; - - /** - * @brief Check that the command can be casted to another type of command - * - * @tparam U The type to cast to - * @return true Can be casted - * @return false Can not be casted - */ - template - bool is() const - { - return is_impl(typeid(U)); - } - - /** - * @brief Case to a specific type of command - * - * @tparam U The type of command to cast to - * @return U* A ptr to this as the type of command - */ - template - U *get() - { - assert(is() && "Attempting to retrieve incorrect command type"); - return static_cast(this); - } - - /** - * @brief Case to a specific type of command - * - * @tparam U The type of command to cast to - * @return const U* A ptr to this as the type of command - */ - template - const U *get() const - { - assert(is() && "Attempting to retrieve incorrect command type"); - return static_cast(this); - } - - const std::string &get_name() const; - void set_name(const std::string &name); - const std::string &get_help_line() const; - void set_help_line(const std::string &help_line); - - protected: - /** - * @brief Implementation of the is method. See TypedCommand - * - * @param index The type index to compare against - * @return true Is equal to the given index - * @return false Is not the equal to the given index - */ - virtual bool is_impl(const std::type_index &index) const = 0; - - private: - std::string _name; - std::string _help_line; -}; - -/** - * @brief Allow a given command to implement subcommands - */ -class MultipleCommands -{ - public: - MultipleCommands(const std::vector &commands); - virtual ~MultipleCommands() = default; - - const std::vector &get_commands() const; - - private: - std::vector _commands; -}; - -/** - * @brief Implement type logic through is - * - * @tparam Type The type of the command - */ -template -class TypedCommand : public Command -{ - public: - TypedCommand(const std::string &name, const std::string &help_line) : - Command(name, help_line) - { - } - virtual ~TypedCommand() = default; - - protected: - virtual bool is_impl(const std::type_index &index) const override - { - return _type == index; - } - - private: - std::type_index _type = std::type_index(typeid(Type)); -}; - -/** - * @brief Command groups allow separate commands to be shown in a labeled group - */ -class CommandGroup : public TypedCommand, public MultipleCommands -{ - public: - CommandGroup(const std::string &name, const std::vector &commands); - virtual ~CommandGroup() = default; -}; - -/** - * @brief Subcommands act as separate entrypoints to the application and may implement a subset of commands - */ -class SubCommand : public TypedCommand, public MultipleCommands -{ - public: - SubCommand(const std::string &name, const std::string &help_line, const std::vector &commands); - virtual ~SubCommand() = default; -}; - -/** - * @brief Positional commands are values taken from a given position in the command string - */ -class PositionalCommand : public TypedCommand -{ - public: - PositionalCommand(const std::string &name, const std::string &help_line); - virtual ~PositionalCommand() = default; -}; - -enum class FlagType -{ - FlagOnly, - OneValue, - ManyValues, -}; - -/** - * @brief Flag command represent a flag and value e.g --sample afbc - */ -class FlagCommand : public TypedCommand -{ - public: - FlagCommand(FlagType type, const std::string &long_name, const std::string &short_name, const std::string &help_line); - virtual ~FlagCommand() = default; - - FlagType get_flag_type() const; - - private: - FlagType _type; -}; - -/** - * @brief Abstract context which different command parsers may use to pass their own specialized contexts - */ -class CommandParserContext -{ - public: - CommandParserContext() = default; - virtual ~CommandParserContext() = default; -}; - -/** - * @brief Visitor stype command parser used to construct a CLI and parse command line arguments - */ -class CommandParser -{ - public: - virtual ~CommandParser() = default; - - virtual bool contains(Command *command) const = 0; - - /** - * @brief Cast a commands value to a given type - * - * @tparam Type Type to cast to - * @param command Pointer to the command that should be casted - * @return Type A cast version of the commands underlying value or a default initialization - */ - template - Type as(Command *command) const - { - auto values = get_command_value(command); - Type type{}; - bool implemented_type_conversion = convert_type(values, &type); - assert(implemented_type_conversion && "Failed to retrieve value. Type unsupported"); - return type; - } - - /** - * @brief Retrieve the help menu generated by a parser implementation - * - * @return std::vector A list of individual lines - */ - virtual std::vector help() const = 0; - - virtual bool parse(const std::vector &plugins) = 0; - - virtual bool parse(const std::vector &commands) = 0; - - protected: - /* - * Individual parse functions visit each type of command to configure the underlying CLI implementation - */ - virtual bool parse(CommandParserContext *context, const std::vector &commands); - virtual void parse(CommandParserContext *context, CommandGroup *command) = 0; - virtual void parse(CommandParserContext *context, SubCommand *command) = 0; - virtual void parse(CommandParserContext *context, PositionalCommand *command) = 0; - virtual void parse(CommandParserContext *context, FlagCommand *command) = 0; - - private: - /** - * @brief Get the raw value parsed from command line arguments - * - * @param command The command to retrieve the raw value from - * @return std::vector The raw values for a given command - */ - virtual std::vector get_command_value(Command *command) const = 0; - - /** - * @brief Cast from the CLI raw value to a given type - * - * @tparam Type Type required - * @param values The raw CLI values - * @param type The required type to cast to - * @return true if implemented - * @return false if no implementation exists - */ - template - inline bool convert_type(const std::vector &values, Type *type) const - { - return false; - } -}; - -template <> -inline bool CommandParser::convert_type(const std::vector &values, uint32_t *type) const -{ - if (values.size() != 1) - { - *type = 0; - } - else - { - auto number = atoi(values[0].c_str()); - *type = static_cast(number); - } - return true; -} - -template <> -inline bool CommandParser::convert_type(const std::vector &values, float *type) const -{ - if (values.size() != 1) - { - *type = 0.0f; - } - else - { - *type = std::stof(values[0].c_str()); - } - return true; -} - -template <> -inline bool CommandParser::convert_type(const std::vector &values, std::vector *type) const -{ - *type = values; - return true; -} - -template <> -inline bool CommandParser::convert_type(const std::vector &values, std::unordered_set *type) const -{ - *type = std::unordered_set(values.begin(), values.end()); - return true; -} - -template <> -inline bool CommandParser::convert_type(const std::vector &values, std::string *type) const -{ - if (values.size() > 0) - { - *type = values[0]; - } - else - { - *type = ""; - } - - return true; -} - -} // namespace vkb diff --git a/framework/platform/parsers/CLI11.cpp b/framework/platform/parsers/CLI11.cpp deleted file mode 100644 index 2a1c66505d..0000000000 --- a/framework/platform/parsers/CLI11.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "CLI11.h" - -#include - -#include "common/strings.h" -#include "core/util/logging.hpp" - -namespace vkb -{ -CLI11CommandContext::CLI11CommandContext(CLI::App *cli, const CLI11CommandContextState &state) : - CommandParserContext(), cli11(cli), _state(state) -{} - -bool CLI11CommandContext::has_group_name() const -{ - return !_state.group_name.empty(); -} - -const std::string &CLI11CommandContext::get_group_name() const -{ - return _state.group_name; -} - -CLI11CommandContextState CLI11CommandContext::get_state() const -{ - return _state; -} - -CLI11CommandParser::CLI11CommandParser(const std::string &name, const std::string &description, const std::vector &args) : - _cli11{std::make_unique(description, name)}, _formatter{std::make_shared()} -{ - _cli11->formatter(_formatter); - - _args.resize(args.size()); - std::transform(args.begin(), args.end(), _args.begin(), [](const std::string &string) -> char * { return const_cast(string.c_str()); }); -} - -std::vector CLI11CommandParser::help() const -{ - return split(_cli11->help(), "\n"); -} - -// Helper to reduce duplication - throw should not occur as there should always be a valid context passed -#define CAST(type) \ - void CLI11CommandParser::parse(CommandParserContext *context, type *command) \ - { \ - parse(context == nullptr ? throw : dynamic_cast(context), command); \ - } -CAST(CommandGroup); -CAST(SubCommand); -CAST(PositionalCommand); -CAST(FlagCommand); -#undef CAST - -void CLI11CommandParser::parse(CLI11CommandContext *context, CommandGroup *command) -{ - auto state = context->get_state(); - state.group_name = command->get_name(); - CLI11CommandContext group_context(context->cli11, state); - CommandParser::parse(&group_context, command->get_commands()); -} - -void CLI11CommandParser::parse(CLI11CommandContext *context, SubCommand *command) -{ - auto *subcommand = context->cli11->add_subcommand(command->get_name(), command->get_help_line()); - _sub_commands[command] = subcommand; - subcommand->formatter(_formatter); - CLI11CommandContext subcommand_context(subcommand, context->get_state()); - CommandParser::parse(&subcommand_context, command->get_commands()); -} - -void CLI11CommandParser::parse(CLI11CommandContext *context, PositionalCommand *command) -{ - auto *option = context->cli11->add_option(command->get_name(), command->get_help_line()); - - _options.emplace(command, option); - - if (context->has_group_name()) - { - option->group(context->get_group_name()); - } -} - -void CLI11CommandParser::parse(CLI11CommandContext *context, FlagCommand *command) -{ - CLI::Option *flag; - - auto flagType = command->get_flag_type(); - switch (flagType) - { - case FlagType::FlagOnly: - flag = context->cli11->add_flag(command->get_name(), command->get_help_line()); - break; - case FlagType::OneValue: - case FlagType::ManyValues: - flag = context->cli11->add_option(command->get_name(), command->get_help_line()); - break; - default: - throw std::runtime_error("Unknown flag type"); - } - - if (flagType == FlagType::ManyValues) - { - flag = flag->expected(1, INT_MAX); - } - - _options.emplace(command, flag); - - if (context->has_group_name()) - { - flag->group(context->get_group_name()); - } -} - -bool CLI11CommandParser::contains(Command *command) const -{ - { - auto it = _options.find(command); - - if (it != _options.end()) - { - return it->second->count() > 0; - } - } - - { - auto it = _sub_commands.find(command); - - if (it != _sub_commands.end()) - { - return it->second->count() > 0; - } - } - - return false; -} - -std::vector CLI11CommandParser::get_command_value(Command *command) const -{ - auto it = _options.find(command); - - if (it == _options.end()) - { - return {}; - } - - return it->second->results(); -} - -/* - -To create a CLI composed of multiple interoperable plugins using CLI11, we must create a CLI11 app from each plugin. -This acts as a group for the commands used in said plugin. Once we have groups for each plugin we can then nest then -nest them inside each other using the CLI11::App::add_subcommand() method. - -This is required as CLI11 does not allow the redefinition of the same flag. Within the same app context. - -*/ -bool CLI11CommandParser::parse(const std::vector &plugins) -{ - // Generate all command groups - for (auto plugin : plugins) - { - auto group = std::make_unique(); - - _formatter->register_meta(group.get(), {plugin->get_name(), plugin->get_description()}); - - CLI11CommandContext context(group.get()); - CommandParser::parse(&context, plugin->get_cli_commands()); - - _option_groups[plugin] = std::move(group); - } - - // Associate correct command groups - for (auto plugin : plugins) - { - auto plugin_cli = _option_groups[plugin]; - auto included_plugins = plugin->get_inclusions(); - auto commands = plugin->get_cli_commands(); - - for (auto command : commands) - { - // Share flags and options with sub commands - if (command->is()) - { - auto cli11_sub_command = _sub_commands[command]; - - for (auto included_plugin : included_plugins) - { - cli11_sub_command->add_subcommand(_option_groups[included_plugin]); - } - } - } - - _cli11->add_subcommand(plugin_cli); - } - - return cli11_parse(_cli11.get()); -} - -bool CLI11CommandParser::parse(const std::vector &commands) -{ - CLI11CommandContext context(_cli11.get()); - if (!CommandParser::parse(&context, commands)) - { - return false; - } - - return cli11_parse(_cli11.get()); -} - -// A header is defining success as a macro, which is causing a conflict with CLI11 -#ifdef Success -# undef Success -#endif - -bool CLI11CommandParser::cli11_parse(CLI::App *app) -{ - try - { - _args.insert(_args.begin(), "vulkan_samples"); - app->parse(static_cast(_args.size()), _args.data()); - } - catch (CLI::CallForHelp e) - { - return false; - } - catch (CLI::ParseError e) - { - bool success = e.get_exit_code() == static_cast(CLI::ExitCodes::Success); - - if (!success) - { - LOGE("CLI11 Parse Error: [{}] {}", e.get_name(), e.what()); - return false; - } - } - - return true; -} -} // namespace vkb \ No newline at end of file diff --git a/framework/platform/parsers/CLI11.h b/framework/platform/parsers/CLI11.h deleted file mode 100644 index e1f18c29a1..0000000000 --- a/framework/platform/parsers/CLI11.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (c) 2021, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -#include - -#include "help_formatter.h" -#include "platform/parser.h" -#include "platform/plugins/plugin.h" - -namespace vkb -{ -struct CLI11CommandContextState - -{ - std::string group_name = ""; -}; - -class CLI11CommandContext : public CommandParserContext -{ - public: - CLI11CommandContext(CLI::App *cli, const CLI11CommandContextState &state = {}); - - virtual ~CLI11CommandContext() = default; - - bool has_group_name() const; - const std::string & get_group_name() const; - CLI11CommandContextState get_state() const; - - CLI::App *cli11; - - private: - CLI11CommandContextState _state; -}; - -class CLI11CommandParser : public CommandParser -{ - public: - CLI11CommandParser(const std::string &name, const std::string &description, const std::vector &args); - virtual ~CLI11CommandParser() = default; - - virtual std::vector help() const override; - - virtual bool parse(const std::vector &plugins) override; - - virtual bool parse(const std::vector &commands) override; - - protected: -#define CAST(type) virtual void parse(CommandParserContext *context, type *command) override; - CAST(CommandGroup); - CAST(SubCommand); - CAST(PositionalCommand); - CAST(FlagCommand); -#undef CAST - - void parse(CLI11CommandContext *context, CommandGroup *command); - void parse(CLI11CommandContext *context, SubCommand *command); - void parse(CLI11CommandContext *context, PositionalCommand *command); - void parse(CLI11CommandContext *context, FlagCommand *command); - - virtual bool contains(Command *command) const override; - - private: - std::vector _args; - - std::unique_ptr _cli11; - std::unordered_map _options; - std::unordered_map _sub_commands; - std::unordered_map> _option_groups; - std::shared_ptr _formatter; - - virtual std::vector get_command_value(Command *command) const override; - - bool cli11_parse(CLI::App *app); -}; -} // namespace vkb \ No newline at end of file diff --git a/framework/platform/parsers/help_formatter.cpp b/framework/platform/parsers/help_formatter.cpp deleted file mode 100644 index 5548f4058f..0000000000 --- a/framework/platform/parsers/help_formatter.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* Copyright (c) 2021-2023, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "help_formatter.h" - -#include - -#include "CLI11.h" -#include "common/strings.h" - -namespace vkb -{ -const std::string SPACER = " "; - -std::string prepend(const std::string &target, const std::string prepended) -{ - auto lines = split(target, "\n"); - - if (lines.size() == 1) - { - if (lines[0].size() > 0) - { - return prepended + lines[0]; - } - } - else if (lines.size() > 1) - { - return prepended + join(lines, "\n" + prepended); - } - - return target; -} - -std::string HelpFormatter::make_help(const CLI::App *app, std::string name, CLI::AppFormatMode mode) const -{ - // This immediately forwards to the make_expanded method. This is done this way so that subcommands can - // have overridden formatters - if (mode == CLI::AppFormatMode::Sub) - { - return make_expanded(app); - } - - std::stringstream out; - if ((app->get_name().empty()) && (app->get_parent() != nullptr)) - { - if (app->get_group() != "Subcommands") - { - out << app->get_group() << ':'; - } - } - - out << make_description(app); - out << make_usage(app, name); - out << prepend(make_positionals(app), SPACER); - out << prepend(make_groups(app, mode), SPACER); - out << "\n" - << prepend(make_subcommands(app, mode), SPACER); - - return out.str(); -} - -std::string HelpFormatter::make_expanded(const CLI::App *sub) const -{ -#define SPACE() \ - { \ - size_t current_size = out.str().size(); \ - if (current_size > last_size) \ - { \ - last_size = current_size; \ - out << "\n"; \ - } \ - } - - const auto *meta = get_meta(sub); - - std::stringstream out; - - if (meta != nullptr) - { - out << meta->name << "\n"; - } - else - { - out << sub->get_display_name(true) << "\n"; - } - - if (meta != nullptr) - { - out << SPACER << meta->description << "\n"; - } - else - { - out << prepend(make_description(sub), SPACER); - } - - if (sub->get_name().empty() && !sub->get_aliases().empty()) - { - CLI::detail::format_aliases(out, sub->get_aliases(), column_width_ + 2); - } - - size_t last_size = out.str().size(); - - out << prepend(make_positionals(sub), SPACER); - - SPACE(); - - out << prepend(make_groups(sub, CLI::AppFormatMode::Sub), SPACER); - - SPACE(); - - out << prepend(make_subcommands(sub, CLI::AppFormatMode::Sub), SPACER); - - SPACE(); - - return out.str(); - -#undef SPACE -} - -void HelpFormatter::register_meta(const CLI::App *command, const HelpFormatter::Meta &meta) -{ - _meta.insert({command, meta}); -} - -const HelpFormatter::Meta *HelpFormatter::get_meta(const CLI::App *command) const -{ - auto it = _meta.find(command); - return it == _meta.end() ? nullptr : &it->second; -} -} // namespace vkb \ No newline at end of file diff --git a/framework/platform/parsers/help_formatter.h b/framework/platform/parsers/help_formatter.h deleted file mode 100644 index 59181b6d8c..0000000000 --- a/framework/platform/parsers/help_formatter.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2021, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include - -#include -namespace vkb -{ -class HelpFormatter : public CLI::Formatter -{ - public: - struct Meta - { - std::string name; - std::string description; - }; - - HelpFormatter() = default; - HelpFormatter(const HelpFormatter &) = default; - HelpFormatter(HelpFormatter &&) = default; - - std::string make_help(const CLI::App *, std::string, CLI::AppFormatMode) const override; - virtual std::string make_expanded(const CLI::App *sub) const override; - - void register_meta(const CLI::App *command, const Meta &meta); - - private: - std::unordered_map _meta; - - const Meta *get_meta(const CLI::App *command) const; -}; -} // namespace vkb \ No newline at end of file diff --git a/framework/platform/platform.cpp b/framework/platform/platform.cpp index 9f6877fbec..30010b67af 100644 --- a/framework/platform/platform.cpp +++ b/framework/platform/platform.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,6 +20,7 @@ #include #include +#include #include #include @@ -30,8 +32,6 @@ #include "core/util/logging.hpp" #include "force_close/force_close.h" -#include "glsl_compiler.h" -#include "platform/parsers/CLI11.h" #include "platform/plugins/plugin.h" #include "vulkan_sample.h" @@ -45,8 +45,10 @@ Platform::Platform(const PlatformContext &context) arguments = context.arguments(); } -ExitCode Platform::initialize(const std::vector &plugins) +ExitCode Platform::initialize(const std::vector &plugins_) { + plugins = plugins_; + auto sinks = get_platform_sinks(); auto logger = std::make_shared("logger", sinks.begin(), sinks.end()); @@ -62,40 +64,81 @@ ExitCode Platform::initialize(const std::vector &plugins) LOGI("Logger initialized"); - parser = std::make_unique("vulkan_samples", "\n\tVulkan Samples\n\n\t\tA collection of samples to demonstrate the Vulkan best practice.\n", arguments); - - // Process command line arguments - if (!parser->parse(associate_plugins(plugins))) + // To get the error messages formatted as we like them to have, exit after initializing the logger, earliest + if (arguments.empty()) + { + return ExitCode::NoSample; + } + else if (std::ranges::any_of(arguments, [](auto const &arg) { return arg == "-h" || arg == "--help"; })) { return ExitCode::Help; } - // Subscribe plugins to requested hooks and store activated plugins - for (auto *plugin : plugins) + for (auto const &plugin : plugins) { - if (plugin->activate_plugin(this, *parser.get())) + plugin->set_platform(this); + for (auto const &command : plugin->get_commands()) { - auto &plugin_hooks = plugin->get_hooks(); - for (auto hook : plugin_hooks) + auto [it, inserted] = command_map.insert(std::make_pair(command.first, plugin)); + if (!inserted) { - auto it = hooks.find(hook); - - if (it == hooks.end()) - { - auto r = hooks.emplace(hook, std::vector{}); - - if (r.second) - { - it = r.first; - } - } - - it->second.emplace_back(plugin); + LOGE("Command \"{}\" from plugin \"{}\" is already listed for plugin \"{}\"!", command.first, plugin->get_name(), it->second->get_name()); } + } + for (auto const &option : plugin->get_options()) + { + auto [it, inserted] = option_map.insert(std::make_pair(option.first, plugin)); + if (!inserted) + { + LOGE("Option \"{}\" from plugin \"{}\" is already listed for plugin \"{}\"!", option.first, plugin->get_name(), it->second->get_name()); + } + } + } + + std::deque argumentDeque(arguments.begin(), arguments.end()); - active_plugins.emplace_back(plugin); + // the arguments have to start with a command + auto commandIt = command_map.find(argumentDeque[0]); + if (commandIt == command_map.end()) + { + LOGE("Command \"{}\" is unknown!", argumentDeque[0]); + return ExitCode::Help; + } + else if (commandIt->second->handle_command(argumentDeque)) + { + register_hooks(commandIt->second); + } + else + { + LOGE("Command \"{}\" advertised by plugin \"{}\" was not handled!", argumentDeque[0], commandIt->second->get_name()); + return ExitCode::Help; + } + // and then there are options only + while (!argumentDeque.empty()) + { + if (argumentDeque[0].substr(0, 2) != "--") + { + LOGE("Option \"{}\" does not start with \"--\"!", argumentDeque[0]); + return ExitCode::Help; + } + auto optionIt = option_map.find(argumentDeque[0].substr(2)); + if (optionIt == option_map.end()) + { + LOGE("Option \"{}\" is unknown!", argumentDeque[0]); + return ExitCode::Help; + } + else if (optionIt->second->handle_option(argumentDeque)) + { + register_hooks(optionIt->second); + } + else + { + LOGE("Option \"{}\" advertised by plugin \"{}\" was not handled!", argumentDeque[0], optionIt->second->get_name()); + return ExitCode::Help; } } + // Now that all options are handled, trigger the command + commandIt->second->trigger_command(); // Platform has been closed by a plugins initialization phase if (close_requested) @@ -119,6 +162,32 @@ ExitCode Platform::initialize(const std::vector &plugins) return ExitCode::Success; } +void Platform::register_hooks(Plugin *plugin) +{ + auto &plugin_hooks = plugin->get_hooks(); + for (auto hook : plugin_hooks) + { + auto it = hooks.find(hook); + + if (it == hooks.end()) + { + auto r = hooks.emplace(hook, std::vector{}); + assert(r.second); + it = r.first; + } + + if (std::ranges::none_of(it->second, [plugin](auto p) { return p == plugin; })) + { + it->second.emplace_back(plugin); + } + } + + if (std::ranges::none_of(active_plugins, [plugin](auto p) { return p == plugin; })) + { + active_plugins.emplace_back(plugin); + } +} + ExitCode Platform::main_loop_frame() { try @@ -151,6 +220,11 @@ ExitCode Platform::main_loop_frame() } window->process_events(); + + if (window->should_close() || close_requested) + { + return ExitCode::Close; + } } catch (std::exception &e) { @@ -175,13 +249,8 @@ ExitCode Platform::main_loop_frame() ExitCode Platform::main_loop() { - if (!app_requested()) - { - return ExitCode::NoSample; - } - ExitCode exit_code = ExitCode::Success; - while ((exit_code == ExitCode::Success) && !window->should_close() && !close_requested) + while (exit_code == ExitCode::Success) { exit_code = main_loop_frame(); } @@ -202,7 +271,7 @@ void Platform::update() delta_time = simulation_frame_time; } - active_app->update_overlay(delta_time, [=]() { + active_app->update_overlay(delta_time, [=, this]() { on_update_ui_overlay(*active_app->get_drawer()); }); active_app->update(delta_time); @@ -211,7 +280,7 @@ void Platform::update() { if (app->has_render_context()) { - on_post_draw(reinterpret_cast(app->get_render_context())); + on_post_draw(reinterpret_cast(app->get_render_context())); } } else if (auto *app = dynamic_cast(active_app.get())) @@ -228,10 +297,33 @@ void Platform::terminate(ExitCode code) { if (code == ExitCode::Help) { - auto help = parser->help(); - for (auto &line : help) + LOGI(""); + LOGI("\tVulkan Samples"); + LOGI(""); + LOGI("\t\tA collection of samples to demonstrate the Vulkan best practice."); + LOGI(""); + LOGI("\tUsage: vulkan_samples [OPTIONS]"); + LOGI(""); + LOGI("\t\tOptions:"); + LOGI("\t\t\t-h,--help Print this help message and exit"); + + // determine the width for the commands/options + size_t width = 4; // minimal width for "help" + for (auto plugin : plugins) { - LOGI(line); + for (auto const &command : plugin->get_commands()) + { + width = std::max(width, command.first.length()); + } + for (auto const &option : plugin->get_options()) + { + width = std::max(width, option.first.length()); + } + } + + for (auto plugin : plugins) + { + plugin->log_help(width + 2); } } @@ -375,9 +467,6 @@ bool Platform::start_app() active_app->finish(); } - // Reset target environment to default prior to each sample to properly support batch mode - vkb::GLSLCompiler::reset_target_environment(); - active_app = requested_app_info->create(); if (!active_app) @@ -442,7 +531,7 @@ void Platform::resize(uint32_t width, uint32_t height) } \ } -void Platform::on_post_draw(RenderContext &context) +void Platform::on_post_draw(vkb::rendering::RenderContextC &context) { HOOK(Hook::PostDraw, on_post_draw(context)); } diff --git a/framework/platform/platform.h b/framework/platform/platform.h index 5dc89dce90..72195669d1 100644 --- a/framework/platform/platform.h +++ b/framework/platform/platform.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -29,7 +30,6 @@ #include "common/utils.h" #include "common/vk_common.h" #include "platform/application.h" -#include "platform/parser.h" #include "platform/plugins/plugin.h" #include "platform/window.h" #include "rendering/render_context.h" @@ -130,14 +130,12 @@ class Platform void set_window_properties(const Window::OptionalProperties &properties); - void on_post_draw(RenderContext &context); + void on_post_draw(vkb::rendering::RenderContextC &context); static const uint32_t MIN_WINDOW_WIDTH; static const uint32_t MIN_WINDOW_HEIGHT; protected: - std::unique_ptr parser; - std::vector active_plugins; std::unordered_map> hooks; @@ -155,6 +153,8 @@ class Platform */ virtual void create_window(const Window::Properties &properties) = 0; + void register_hooks(Plugin *plugin); + void on_update(float delta_time); void on_app_error(const std::string &app_id); void on_app_start(const std::string &app_id); @@ -170,16 +170,20 @@ class Platform bool focused{true}; /* App is currently in focus at an operating system level */ bool close_requested{false}; /* Close requested */ + protected: + std::vector plugins; + private: Timer timer; const apps::AppInfo *requested_app{nullptr}; - std::vector plugins; - std::vector arguments; std::string last_error; + + std::map command_map; + std::map option_map; }; template diff --git a/framework/platform/plugins/plugin.cpp b/framework/platform/plugins/plugin.cpp index 1992c6005b..fd223ef2e5 100644 --- a/framework/platform/plugins/plugin.cpp +++ b/framework/platform/plugins/plugin.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,58 +20,6 @@ namespace vkb { -std::vector associate_plugins(const std::vector &plugins) -{ - for (auto *plugin : plugins) - { - for (auto *comparison_plugin : plugins) - { - bool full_control = comparison_plugin->has_tags(); - bool stopping = comparison_plugin->has_tags(); - bool controlling = full_control || stopping; - - bool entrypoint = comparison_plugin->has_tags(); - - if (plugin->has_tag() && (controlling || entrypoint)) - { - plugin->excludes(comparison_plugin); - continue; - } - - if (plugin->has_tag() && stopping) - { - plugin->excludes(comparison_plugin); - continue; - } - - if (plugin->has_tag() && entrypoint) - { - plugin->excludes(comparison_plugin); - continue; - } - - plugin->includes(comparison_plugin); - } - } - - return plugins; -} - -bool Plugin::activate_plugin(Platform *p, const CommandParser &parser, bool force_activation) -{ - platform = p; - - bool active = is_active(parser); - - // Plugin activated - if (force_activation || active) - { - init(parser); - } - - return active; -} - const std::string &Plugin::get_name() const { return name; @@ -81,23 +30,40 @@ const std::string &Plugin::get_description() const return description; } -void Plugin::excludes(Plugin *plugin) +void Plugin::log_help(size_t width) const { - exclusions.push_back(plugin); -} + LOGI(""); + LOGI("\t{}", name); + LOGI("\t\t{}", description); + LOGI(""); -const std::vector &Plugin::get_exclusions() const -{ - return exclusions; -} + if (!commands.empty()) + { + LOGI("\t\tSubcommands:"); + for (auto const &command : commands) + { + std::ostringstream oss; + oss.setf(std::ios::left); + oss.width(width + 2); + oss << command.first; + LOGI("\t\t\t{}{}", oss.str().c_str(), command.second); + } + LOGI(""); + } -void Plugin::includes(Plugin *plugin) -{ - inclusions.push_back(plugin); + if (!options.empty()) + { + LOGI("\t\tOptions:"); + for (auto const &option : options) + { + std::ostringstream oss; + oss.setf(std::ios::left); + oss.width(width); + oss << option.first; + LOGI("\t\t\t--{}{}", oss.str().c_str(), option.second); + } + LOGI(""); + } } -const std::vector &Plugin::get_inclusions() const -{ - return inclusions; -} } // namespace vkb \ No newline at end of file diff --git a/framework/platform/plugins/plugin.h b/framework/platform/plugins/plugin.h index a8710863a9..433e5a6326 100644 --- a/framework/platform/plugins/plugin.h +++ b/framework/platform/plugins/plugin.h @@ -1,5 +1,6 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors - * Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,20 +19,26 @@ #pragma once #include +#include #include #include #include #include "common/tags.h" #include "gui.h" -#include "platform/parser.h" namespace vkb { class Platform; -class RenderContext; class Plugin; +namespace rendering +{ +template +class RenderContext; +using RenderContextC = RenderContext; +} // namespace rendering + /** * @brief Tags are used to define a plugins behaviour. This is useful to dictate which plugins will work together * and which will not without directly specifying an exclusion or inclusion list. Tags are struct types so that they can @@ -88,22 +95,13 @@ enum class Hook class Plugin { public: - Plugin(const std::string name, const std::string description) : - name{name}, description{description} {}; - virtual ~Plugin() = default; + Plugin(const std::string name, + const std::string description, + std::vector> const &commands = {}, + std::vector> const &options = {}) : + name{name}, description{description}, commands{commands}, options{options} {}; - /** - * @brief Conducts the process of activating and initializing an plugin - * - * @param platform The platform - * @param parser The parser used to check if the plugins flags are present - * @param force_activation Force a plugin to be activated, not advised unless the plugin works without inputs - * @return true If the plugin is to be activated - * @return false If the plugin is not active - */ - bool activate_plugin(Platform *platform, const CommandParser &parser, bool force_activation = false); - - virtual const std::vector &get_cli_commands() const = 0; + virtual ~Plugin() = default; /** * @brief Return a list of hooks that an plugin wants to subscribe to @@ -148,7 +146,7 @@ class Plugin /** * @brief Post Draw */ - virtual void on_post_draw(RenderContext &context) = 0; + virtual void on_post_draw(vkb::rendering::RenderContextC &context) = 0; /** * @brief Allows to add a UI to a sample @@ -157,12 +155,8 @@ class Plugin */ virtual void on_update_ui_overlay(vkb::Drawer &drawer) = 0; - const std::string &get_name() const; - const std::string &get_description() const; - void excludes(Plugin *plugin); - const std::vector &get_exclusions() const; - void includes(Plugin *plugin); - const std::vector &get_inclusions() const; + const std::string &get_name() const; + const std::string &get_description() const; /** * @brief Test whether the plugin contains a given tag @@ -205,31 +199,50 @@ class Plugin */ virtual bool has_tag(TagID id) const = 0; - protected: - /** - * @brief An plugin will override this method so that it can check if it will be activated - * - * @param parser A parser that has parsed the command line arguments when the app starts - * @return true If the plugin should be activated - * @return false If the plugin should be ignored - */ - virtual bool is_active(const CommandParser &parser) = 0; + std::vector> const &get_commands() const + { + return commands; + } - /** - * @brief Sets up an plugin by using values from the parser - * - * @param parser The parser - */ - virtual void init(const CommandParser &parser) = 0; + std::vector> const &get_options() const + { + return options; + } + + virtual bool handle_command(std::deque &arguments) const + { + return false; + } + + virtual bool handle_option(std::deque &arguments) + { + return false; + } + + virtual void trigger_command() + {} + void log_help(size_t width) const; + + void set_platform(Platform *platform) + { + assert(!this->platform && platform); + this->platform = platform; + } + + void clear_platform() + { + platform = nullptr; + } + + protected: Platform *platform = nullptr; private: - std::string name; - std::string description; - - std::vector exclusions; - std::vector inclusions; + std::string name; + std::string description; + std::vector> commands; + std::vector> options; }; /** diff --git a/framework/platform/plugins/plugin_base.h b/framework/platform/plugins/plugin_base.h index 1b0e9e6954..41f910a7be 100644 --- a/framework/platform/plugins/plugin_base.h +++ b/framework/platform/plugins/plugin_base.h @@ -1,5 +1,6 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors - * Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2020-2025, Arm Limited and Contributors + * Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,12 +21,18 @@ #include #include "common/tags.h" -#include "platform/parser.h" #include "platform/platform.h" #include "plugin.h" namespace vkb { +namespace rendering +{ +template +class RenderContext; +using RenderContextC = RenderContext; +} // namespace rendering + /** * @brief PluginBase is the base class that plugins inherit from. The class enforces the use of tags when creating new plugins. * For method information see Plugin @@ -34,40 +41,32 @@ template class PluginBase : public Plugin, public Tag { public: - PluginBase(const std::string name, const std::string description, const std::vector &hooks = {}, const std::vector &commands = {}); + PluginBase(const std::string name, const std::string description, const std::vector &hooks = {}, std::vector> const &commands = {}, std::vector> const &options = {}); virtual ~PluginBase() = default; - virtual const std::vector &get_cli_commands() const override; - virtual const std::vector &get_hooks() const override; - virtual bool has_tag(TagID id) const override; + const std::vector &get_hooks() const override; + bool has_tag(TagID id) const override; // hooks that can be implemented by plugins - virtual void on_update(float delta_time) override{}; - virtual void on_app_start(const std::string &app_id) override{}; - virtual void on_app_close(const std::string &app_id) override{}; - virtual void on_platform_close() override{}; - virtual void on_post_draw(RenderContext &context) override{}; - virtual void on_app_error(const std::string &app_id) override{}; - virtual void on_update_ui_overlay(vkb::Drawer &drawer) override{}; + void on_update(float delta_time) override{}; + void on_app_start(const std::string &app_id) override{}; + void on_app_close(const std::string &app_id) override{}; + void on_platform_close() override{}; + void on_post_draw(vkb::rendering::RenderContextC &context) override{}; + void on_app_error(const std::string &app_id) override{}; + void on_update_ui_overlay(vkb::Drawer &drawer) override{}; private: Tag *tags = reinterpret_cast *>(this); - std::vector hooks; - std::vector commands; + std::vector hooks; }; template -PluginBase::PluginBase(const std::string name, const std::string description, const std::vector &hooks, const std::vector &commands) : - Plugin(name, description), hooks{hooks}, commands{commands} -{ -} - -template -const std::vector &PluginBase::get_cli_commands() const +PluginBase::PluginBase(const std::string name, const std::string description, const std::vector &hooks, std::vector> const &commands, std::vector> const &options) : + Plugin(name, description, commands, options), hooks{hooks} { - return commands; } template diff --git a/framework/platform/unix/direct_window.cpp b/framework/platform/unix/direct_window.cpp index 62091f483a..4c5c0726e6 100644 --- a/framework/platform/unix/direct_window.cpp +++ b/framework/platform/unix/direct_window.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -242,7 +242,7 @@ DirectWindow::~DirectWindow() } } -VkSurfaceKHR DirectWindow::create_surface(Instance &instance) +VkSurfaceKHR DirectWindow::create_surface(vkb::core::InstanceC &instance) { return create_surface(instance.get_handle(), instance.get_first_gpu().get_handle()); } diff --git a/framework/platform/unix/direct_window.h b/framework/platform/unix/direct_window.h index 0e3c5a81c7..275d029d19 100644 --- a/framework/platform/unix/direct_window.h +++ b/framework/platform/unix/direct_window.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -37,7 +37,7 @@ class DirectWindow : public Window virtual ~DirectWindow(); - virtual VkSurfaceKHR create_surface(Instance &instance) override; + virtual VkSurfaceKHR create_surface(vkb::core::InstanceC &instance) override; virtual VkSurfaceKHR create_surface(VkInstance instance, VkPhysicalDevice physical_device) override; diff --git a/framework/platform/window.h b/framework/platform/window.h index ec9bef6f54..0f16e7bf88 100644 --- a/framework/platform/window.h +++ b/framework/platform/window.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2023, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -88,7 +88,7 @@ class Window * @param instance A Vulkan instance * @returns A VkSurfaceKHR handle, for use by the application */ - virtual VkSurfaceKHR create_surface(Instance &instance) = 0; + virtual VkSurfaceKHR create_surface(vkb::core::InstanceC &instance) = 0; /** * @brief Gets a handle from the platform's Vulkan surface diff --git a/framework/rendering/hpp_pipeline_state.h b/framework/rendering/hpp_pipeline_state.h index 3112f13211..eca1279e57 100644 --- a/framework/rendering/hpp_pipeline_state.h +++ b/framework/rendering/hpp_pipeline_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -49,15 +49,23 @@ struct HPPColorBlendState std::vector attachments; }; +struct HPPStencilOpState +{ + vk::StencilOp fail_op = vk::StencilOp::eReplace; + vk::StencilOp pass_op = vk::StencilOp::eReplace; + vk::StencilOp depth_fail_op = vk::StencilOp::eReplace; + vk::CompareOp compare_op = vk::CompareOp::eNever; +}; + struct HPPDepthStencilState { - vk::Bool32 depth_test_enable = true; - vk::Bool32 depth_write_enable = true; - vk::CompareOp depth_compare_op = vk::CompareOp::eGreater; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept - vk::Bool32 depth_bounds_test_enable = false; - vk::Bool32 stencil_test_enable = false; - StencilOpState front; - StencilOpState back; + vk::Bool32 depth_test_enable = true; + vk::Bool32 depth_write_enable = true; + vk::CompareOp depth_compare_op = vk::CompareOp::eGreater; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept + vk::Bool32 depth_bounds_test_enable = false; + vk::Bool32 stencil_test_enable = false; + HPPStencilOpState front; + HPPStencilOpState back; }; struct HPPInputAssemblyState @@ -89,14 +97,6 @@ struct HPPRasterizationState class HPPSpecializationConstantState : private vkb::SpecializationConstantState {}; -struct HPPStencilOpState -{ - vk::StencilOp fail_op = vk::StencilOp::eReplace; - vk::StencilOp pass_op = vk::StencilOp::eReplace; - vk::StencilOp depth_fail_op = vk::StencilOp::eReplace; - vk::CompareOp compare_op = vk::CompareOp::eNever; -}; - struct HPPVertexInputState { std::vector bindings; diff --git a/framework/rendering/hpp_render_context.cpp b/framework/rendering/hpp_render_context.cpp deleted file mode 100644 index 62b740efb7..0000000000 --- a/framework/rendering/hpp_render_context.cpp +++ /dev/null @@ -1,515 +0,0 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "hpp_render_context.h" - -#include - -namespace vkb -{ -namespace rendering -{ -vk::Format HPPRenderContext::DEFAULT_VK_FORMAT = vk::Format::eR8G8B8A8Srgb; - -HPPRenderContext::HPPRenderContext(vkb::core::HPPDevice &device, - vk::SurfaceKHR surface, - const vkb::Window &window, - vk::PresentModeKHR present_mode, - std::vector const &present_mode_priority_list, - std::vector const &surface_format_priority_list) : - device{device}, window{window}, queue{device.get_suitable_graphics_queue()}, surface_extent{window.get_extent().width, window.get_extent().height} -{ - if (surface) - { - vk::SurfaceCapabilitiesKHR surface_properties = device.get_gpu().get_handle().getSurfaceCapabilitiesKHR(surface); - - if (surface_properties.currentExtent.width == 0xFFFFFFFF) - { - swapchain = - std::make_unique(device, surface, present_mode, present_mode_priority_list, surface_format_priority_list, surface_extent); - } - else - { - swapchain = std::make_unique(device, surface, present_mode, present_mode_priority_list, surface_format_priority_list); - } - } -} - -void HPPRenderContext::prepare(size_t thread_count, vkb::rendering::HPPRenderTarget::CreateFunc create_render_target_func) -{ - device.get_handle().waitIdle(); - - if (swapchain) - { - surface_extent = swapchain->get_extent(); - - vk::Extent3D extent{surface_extent.width, surface_extent.height, 1}; - - for (auto &image_handle : swapchain->get_images()) - { - auto swapchain_image = core::HPPImage{device, image_handle, extent, swapchain->get_format(), swapchain->get_usage()}; - auto render_target = create_render_target_func(std::move(swapchain_image)); - frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); - } - } - else - { - // Otherwise, create a single RenderFrame - swapchain = nullptr; - - auto color_image = vkb::core::HPPImage{device, - vk::Extent3D{surface_extent.width, surface_extent.height, 1}, - DEFAULT_VK_FORMAT, // We can use any format here that we like - vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc, - VMA_MEMORY_USAGE_GPU_ONLY}; - - auto render_target = create_render_target_func(std::move(color_image)); - frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); - } - - this->create_render_target_func = create_render_target_func; - this->thread_count = thread_count; - this->prepared = true; -} - -vk::Format HPPRenderContext::get_format() const -{ - return swapchain ? swapchain->get_format() : DEFAULT_VK_FORMAT; -} - -void HPPRenderContext::update_swapchain(const vk::Extent2D &extent) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains extent. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - swapchain = std::make_unique(*swapchain, extent); - - recreate(); -} - -void HPPRenderContext::update_swapchain(const uint32_t image_count) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains image count. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - device.get_handle().waitIdle(); - - swapchain = std::make_unique(*swapchain, image_count); - - recreate(); -} - -void HPPRenderContext::update_swapchain(const std::set &image_usage_flags) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains image usage. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - swapchain = std::make_unique(*swapchain, image_usage_flags); - - recreate(); -} - -void HPPRenderContext::update_swapchain(const vk::Extent2D &extent, const vk::SurfaceTransformFlagBitsKHR transform) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains extent and surface transform. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - auto width = extent.width; - auto height = extent.height; - if (transform == vk::SurfaceTransformFlagBitsKHR::eRotate90 || transform == vk::SurfaceTransformFlagBitsKHR::eRotate270) - { - // Pre-rotation: always use native orientation i.e. if rotated, use width and height of identity transform - std::swap(width, height); - } - - swapchain = std::make_unique(*swapchain, vk::Extent2D{width, height}, transform); - - // Save the preTransform attribute for future rotations - pre_transform = transform; - - recreate(); -} - -void HPPRenderContext::recreate() -{ - LOGI("Recreated swapchain"); - - vk::Extent2D swapchain_extent = swapchain->get_extent(); - vk::Extent3D extent{swapchain_extent.width, swapchain_extent.height, 1}; - - auto frame_it = frames.begin(); - - for (auto &image_handle : swapchain->get_images()) - { - vkb::core::HPPImage swapchain_image{device, image_handle, extent, swapchain->get_format(), swapchain->get_usage()}; - - auto render_target = create_render_target_func(std::move(swapchain_image)); - - if (frame_it != frames.end()) - { - (*frame_it)->update_render_target(std::move(render_target)); - } - else - { - // Create a new frame if the new swapchain has more images than current frames - frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); - } - - ++frame_it; - } - - device.get_resource_cache().clear_framebuffers(); -} - -bool HPPRenderContext::handle_surface_changes(bool force_update) -{ - if (!swapchain) - { - LOGW("Can't handle surface changes. No swapchain, offscreen rendering detected, skipping."); - return false; - } - - vk::SurfaceCapabilitiesKHR surface_properties = device.get_gpu().get_handle().getSurfaceCapabilitiesKHR(swapchain->get_surface()); - - if (surface_properties.currentExtent.width == 0xFFFFFFFF) - { - return false; - } - - // Only recreate the swapchain if the dimensions have changed; - // handle_surface_changes() is called on VK_SUBOPTIMAL_KHR, - // which might not be due to a surface resize - if (surface_properties.currentExtent.width != surface_extent.width || - surface_properties.currentExtent.height != surface_extent.height || - force_update) - { - // Recreate swapchain - device.get_handle().waitIdle(); - - update_swapchain(surface_properties.currentExtent, pre_transform); - - surface_extent = surface_properties.currentExtent; - - return true; - } - - return false; -} - -vkb::core::HPPCommandBuffer &HPPRenderContext::begin(vkb::core::HPPCommandBuffer::ResetMode reset_mode) -{ - assert(prepared && "HPPRenderContext not prepared for rendering, call prepare()"); - - if (!frame_active) - { - begin_frame(); - } - - if (!acquired_semaphore) - { - throw std::runtime_error("Couldn't begin frame"); - } - - const auto &queue = device.get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0); - return get_active_frame().request_command_buffer(queue, reset_mode); -} - -void HPPRenderContext::submit(vkb::core::HPPCommandBuffer &command_buffer) -{ - submit({&command_buffer}); -} - -void HPPRenderContext::submit(const std::vector &command_buffers) -{ - assert(frame_active && "HPPRenderContext is inactive, cannot submit command buffer. Please call begin()"); - - vk::Semaphore render_semaphore; - - if (swapchain) - { - assert(acquired_semaphore && "We do not have acquired_semaphore, it was probably consumed?\n"); - render_semaphore = submit(queue, command_buffers, acquired_semaphore, vk::PipelineStageFlagBits::eColorAttachmentOutput); - } - else - { - submit(queue, command_buffers); - } - - end_frame(render_semaphore); -} - -void HPPRenderContext::begin_frame() -{ - // Only handle surface changes if a swapchain exists - if (swapchain) - { - handle_surface_changes(); - } - - assert(!frame_active && "Frame is still active, please call end_frame"); - - auto &prev_frame = *frames[active_frame_index]; - - // We will use the acquired semaphore in a different frame context, - // so we need to hold ownership. - acquired_semaphore = prev_frame.request_semaphore_with_ownership(); - - if (swapchain) - { - vk::Result result; - try - { - std::tie(result, active_frame_index) = swapchain->acquire_next_image(acquired_semaphore); - } - catch (vk::OutOfDateKHRError & /*err*/) - { - result = vk::Result::eErrorOutOfDateKHR; - } - - if (result == vk::Result::eSuboptimalKHR || result == vk::Result::eErrorOutOfDateKHR) - { -#if defined(PLATFORM__MACOS) - // On Apple platforms, force swapchain update on both eSuboptimalKHR and eErrorOutOfDateKHR - // eSuboptimalKHR may occur on macOS/iOS following changes to swapchain other than extent/size - bool swapchain_updated = handle_surface_changes(true); -#else - bool swapchain_updated = handle_surface_changes(result == vk::Result::eErrorOutOfDateKHR); -#endif - - if (swapchain_updated) - { - // Need to destroy and reallocate acquired_semaphore since it may have already been signaled - device.get_handle().destroySemaphore(acquired_semaphore); - acquired_semaphore = prev_frame.request_semaphore_with_ownership(); - std::tie(result, active_frame_index) = swapchain->acquire_next_image(acquired_semaphore); - } - } - - if (result != vk::Result::eSuccess) - { - prev_frame.reset(); - return; - } - } - - // Now the frame is active again - frame_active = true; - - // Wait on all resource to be freed from the previous render to this frame - wait_frame(); -} - -vk::Semaphore HPPRenderContext::submit(const vkb::core::HPPQueue &queue, - const std::vector &command_buffers, - vk::Semaphore wait_semaphore, - vk::PipelineStageFlags wait_pipeline_stage) -{ - std::vector cmd_buf_handles(command_buffers.size(), nullptr); - std::transform(command_buffers.begin(), command_buffers.end(), cmd_buf_handles.begin(), [](const vkb::core::HPPCommandBuffer *cmd_buf) { return cmd_buf->get_handle(); }); - - vkb::rendering::HPPRenderFrame &frame = get_active_frame(); - - vk::Semaphore signal_semaphore = frame.request_semaphore(); - - vk::SubmitInfo submit_info(nullptr, nullptr, cmd_buf_handles, signal_semaphore); - if (wait_semaphore) - { - submit_info.setWaitSemaphores(wait_semaphore); - submit_info.pWaitDstStageMask = &wait_pipeline_stage; - } - - vk::Fence fence = frame.request_fence(); - - queue.get_handle().submit(submit_info, fence); - - return signal_semaphore; -} - -void HPPRenderContext::submit(const vkb::core::HPPQueue &queue, const std::vector &command_buffers) -{ - std::vector cmd_buf_handles(command_buffers.size(), nullptr); - std::transform(command_buffers.begin(), command_buffers.end(), cmd_buf_handles.begin(), [](const vkb::core::HPPCommandBuffer *cmd_buf) { return cmd_buf->get_handle(); }); - - vkb::rendering::HPPRenderFrame &frame = get_active_frame(); - - vk::SubmitInfo submit_info(nullptr, nullptr, cmd_buf_handles); - - vk::Fence fence = frame.request_fence(); - - queue.get_handle().submit(submit_info, fence); -} - -void HPPRenderContext::wait_frame() -{ - get_active_frame().reset(); -} - -void HPPRenderContext::end_frame(vk::Semaphore semaphore) -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - - if (swapchain) - { - vk::SwapchainKHR vk_swapchain = swapchain->get_handle(); - vk::PresentInfoKHR present_info(semaphore, vk_swapchain, active_frame_index); - - vk::DisplayPresentInfoKHR disp_present_info; - if (device.is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && - window.get_display_present_info(reinterpret_cast(&disp_present_info), surface_extent.width, surface_extent.height)) - { - // Add display present info if supported and wanted - present_info.pNext = &disp_present_info; - } - - vk::Result result; - try - { - result = queue.present(present_info); - } - catch (vk::OutOfDateKHRError & /*err*/) - { - result = vk::Result::eErrorOutOfDateKHR; - } - - if (result == vk::Result::eSuboptimalKHR || result == vk::Result::eErrorOutOfDateKHR) - { - handle_surface_changes(); - } - } - - // Frame is not active anymore - if (acquired_semaphore) - { - release_owned_semaphore(acquired_semaphore); - acquired_semaphore = nullptr; - } - frame_active = false; -} - -vk::Semaphore HPPRenderContext::consume_acquired_semaphore() -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - return std::exchange(acquired_semaphore, nullptr); -} - -vkb::rendering::HPPRenderFrame &HPPRenderContext::get_active_frame() -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - return *frames[active_frame_index]; -} - -uint32_t HPPRenderContext::get_active_frame_index() -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - return active_frame_index; -} - -vkb::rendering::HPPRenderFrame &HPPRenderContext::get_last_rendered_frame() -{ - assert(!frame_active && "Frame is still active, please call end_frame"); - return *frames[active_frame_index]; -} - -vk::Semaphore HPPRenderContext::request_semaphore() -{ - return get_active_frame().request_semaphore(); -} - -vk::Semaphore HPPRenderContext::request_semaphore_with_ownership() -{ - return get_active_frame().request_semaphore_with_ownership(); -} - -void HPPRenderContext::release_owned_semaphore(vk::Semaphore semaphore) -{ - get_active_frame().release_owned_semaphore(semaphore); -} - -vkb::core::HPPDevice &HPPRenderContext::get_device() -{ - return device; -} - -void HPPRenderContext::recreate_swapchain() -{ - device.get_handle().waitIdle(); - device.get_resource_cache().clear_framebuffers(); - - vk::Extent2D swapchain_extent = swapchain->get_extent(); - vk::Extent3D extent{swapchain_extent.width, swapchain_extent.height, 1}; - - auto frame_it = frames.begin(); - - for (auto &image_handle : swapchain->get_images()) - { - vkb::core::HPPImage swapchain_image{device, image_handle, extent, swapchain->get_format(), swapchain->get_usage()}; - auto render_target = create_render_target_func(std::move(swapchain_image)); - (*frame_it)->update_render_target(std::move(render_target)); - - ++frame_it; - } -} - -bool HPPRenderContext::has_swapchain() -{ - return swapchain != nullptr; -} - -vkb::core::HPPSwapchain const &HPPRenderContext::get_swapchain() const -{ - assert(swapchain && "Swapchain is not valid"); - return *swapchain; -} - -vk::Extent2D const &HPPRenderContext::get_surface_extent() const -{ - return surface_extent; -} - -uint32_t HPPRenderContext::get_active_frame_index() const -{ - return active_frame_index; -} - -std::vector> &HPPRenderContext::get_render_frames() -{ - return frames; -} - -} // namespace rendering -} // namespace vkb diff --git a/framework/rendering/hpp_render_context.h b/framework/rendering/hpp_render_context.h deleted file mode 100644 index 6c83bf0459..0000000000 --- a/framework/rendering/hpp_render_context.h +++ /dev/null @@ -1,243 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include - -namespace vkb -{ -namespace rendering -{ -/** - * @brief HPPRenderContext is a transcoded version of vkb::RenderContext from vulkan to vulkan-hpp. - * - * See vkb::RenderContext for documentation - */ -class HPPRenderContext -{ - public: - // The format to use for the RenderTargets if a swapchain isn't created - static vk::Format DEFAULT_VK_FORMAT; - - /** - * @brief Constructor - * @param device A valid device - * @param surface A surface, nullptr if in offscreen mode - * @param window The window where the surface was created - * @param present_mode Requests to set the present mode of the swapchain - * @param present_mode_priority_list The order in which the swapchain prioritizes selecting its present mode - * @param surface_format_priority_list The order in which the swapchain prioritizes selecting its surface format - */ - HPPRenderContext(vkb::core::HPPDevice &device, - vk::SurfaceKHR surface, - const vkb::Window &window, - vk::PresentModeKHR present_mode = vk::PresentModeKHR::eFifo, - std::vector const &present_mode_priority_list = {vk::PresentModeKHR::eFifo, vk::PresentModeKHR::eMailbox}, - std::vector const &surface_format_priority_list = { - {vk::Format::eR8G8B8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}, {vk::Format::eB8G8R8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}}); - - HPPRenderContext(const HPPRenderContext &) = delete; - - HPPRenderContext(HPPRenderContext &&) = delete; - - virtual ~HPPRenderContext() = default; - - HPPRenderContext &operator=(const HPPRenderContext &) = delete; - - HPPRenderContext &operator=(HPPRenderContext &&) = delete; - - /** - * @brief Prepares the RenderFrames for rendering - * @param thread_count The number of threads in the application, necessary to allocate this many resource pools for each RenderFrame - * @param create_render_target_func A function delegate, used to create a RenderTarget - */ - void prepare(size_t thread_count = 1, HPPRenderTarget::CreateFunc create_render_target_func = HPPRenderTarget::DEFAULT_CREATE_FUNC); - - /** - * @brief Updates the swapchains extent, if a swapchain exists - * @param extent The width and height of the new swapchain images - */ - void update_swapchain(const vk::Extent2D &extent); - - /** - * @brief Updates the swapchains image count, if a swapchain exists - * @param image_count The amount of images in the new swapchain - */ - void update_swapchain(const uint32_t image_count); - - /** - * @brief Updates the swapchains image usage, if a swapchain exists - * @param image_usage_flags The usage flags the new swapchain images will have - */ - void update_swapchain(const std::set &image_usage_flags); - - /** - * @brief Updates the swapchains extent and surface transform, if a swapchain exists - * @param extent The width and height of the new swapchain images - * @param transform The surface transform flags - */ - void update_swapchain(const vk::Extent2D &extent, const vk::SurfaceTransformFlagBitsKHR transform); - - /** - * @returns True if a valid swapchain exists in the HPPRenderContext - */ - bool has_swapchain(); - - /** - * @brief Recreates the RenderFrames, called after every update - */ - void recreate(); - - /** - * @brief Recreates the swapchain - */ - void recreate_swapchain(); - - /** - * @brief Prepares the next available frame for rendering - * @param reset_mode How to reset the command buffer - * @returns A valid command buffer to record commands to be submitted - * Also ensures that there is an active frame if there is no existing active frame already - */ - vkb::core::HPPCommandBuffer &begin(vkb::core::HPPCommandBuffer::ResetMode reset_mode = vkb::core::HPPCommandBuffer::ResetMode::ResetPool); - - /** - * @brief Submits the command buffer to the right queue - * @param command_buffer A command buffer containing recorded commands - */ - void submit(vkb::core::HPPCommandBuffer &command_buffer); - - /** - * @brief Submits multiple command buffers to the right queue - * @param command_buffers Command buffers containing recorded commands - */ - void submit(const std::vector &command_buffers); - - /** - * @brief begin_frame - */ - void begin_frame(); - - vk::Semaphore submit(const vkb::core::HPPQueue &queue, - const std::vector &command_buffers, - vk::Semaphore wait_semaphore, - vk::PipelineStageFlags wait_pipeline_stage); - - /** - * @brief Submits a command buffer related to a frame to a queue - */ - void submit(const vkb::core::HPPQueue &queue, const std::vector &command_buffers); - - /** - * @brief Waits a frame to finish its rendering - */ - virtual void wait_frame(); - - void end_frame(vk::Semaphore semaphore); - - /** - * @brief An error should be raised if the frame is not active. - * A frame is active after @ref begin_frame has been called. - * @return The current active frame - */ - HPPRenderFrame &get_active_frame(); - - /** - * @brief An error should be raised if the frame is not active. - * A frame is active after @ref begin_frame has been called. - * @return The current active frame index - */ - uint32_t get_active_frame_index(); - - /** - * @brief An error should be raised if a frame is active. - * A frame is active after @ref begin_frame has been called. - * @return The previous frame - */ - HPPRenderFrame &get_last_rendered_frame(); - - vk::Semaphore request_semaphore(); - vk::Semaphore request_semaphore_with_ownership(); - void release_owned_semaphore(vk::Semaphore semaphore); - - vkb::core::HPPDevice &get_device(); - - /** - * @brief Returns the format that the RenderTargets are created with within the HPPRenderContext - */ - vk::Format get_format() const; - - vkb::core::HPPSwapchain const &get_swapchain() const; - - vk::Extent2D const &get_surface_extent() const; - - uint32_t get_active_frame_index() const; - - std::vector> &get_render_frames(); - - /** - * @brief Handles surface changes, only applicable if the render_context makes use of a swapchain - */ - virtual bool handle_surface_changes(bool force_update = false); - - /** - * @brief Returns the WSI acquire semaphore. Only to be used in very special circumstances. - * @return The WSI acquire semaphore. - */ - vk::Semaphore consume_acquired_semaphore(); - - protected: - vk::Extent2D surface_extent; - - private: - vkb::core::HPPDevice &device; - - const vkb::Window &window; - - /// If swapchain exists, then this will be a present supported queue, else a graphics queue - const vkb::core::HPPQueue &queue; - - std::unique_ptr swapchain; - - vkb::core::HPPSwapchainProperties swapchain_properties; - - std::vector> frames; - - vk::Semaphore acquired_semaphore; - - bool prepared{false}; - - /// Current active frame index - uint32_t active_frame_index{0}; - - /// Whether a frame is active or not - bool frame_active{false}; - - HPPRenderTarget::CreateFunc create_render_target_func = HPPRenderTarget::DEFAULT_CREATE_FUNC; - - vk::SurfaceTransformFlagBitsKHR pre_transform{vk::SurfaceTransformFlagBitsKHR::eIdentity}; - - size_t thread_count{1}; -}; - -} // namespace rendering -} // namespace vkb diff --git a/framework/rendering/hpp_render_frame.cpp b/framework/rendering/hpp_render_frame.cpp deleted file mode 100644 index 126d32e77f..0000000000 --- a/framework/rendering/hpp_render_frame.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "hpp_render_frame.h" -#include "buffer_pool.h" -#include - -constexpr uint32_t BUFFER_POOL_BLOCK_SIZE = 256; - -namespace vkb -{ -namespace rendering -{ -HPPRenderFrame::HPPRenderFrame(vkb::core::HPPDevice &device, std::unique_ptr &&render_target, size_t thread_count) : - device{device}, - fence_pool{device}, - semaphore_pool{device}, - swapchain_render_target{std::move(render_target)}, - thread_count{thread_count} -{ - for (auto &usage_it : supported_usage_map) - { - auto [buffer_pools_it, inserted] = buffer_pools.emplace(usage_it.first, std::vector>{}); - if (!inserted) - { - throw std::runtime_error("Failed to insert buffer pool"); - } - - for (size_t i = 0; i < thread_count; ++i) - { - buffer_pools_it->second.push_back(std::make_pair(vkb::BufferPoolCpp{device, BUFFER_POOL_BLOCK_SIZE * 1024 * usage_it.second, usage_it.first}, nullptr)); - } - } - - for (size_t i = 0; i < thread_count; ++i) - { - descriptor_pools.push_back(std::make_unique>()); - descriptor_sets.push_back(std::make_unique>()); - } -} - -vkb::BufferAllocationCpp HPPRenderFrame::allocate_buffer(const vk::BufferUsageFlags usage, const vk::DeviceSize size, size_t thread_index) -{ - assert(thread_index < thread_count && "Thread index is out of bounds"); - - // Find a pool for this usage - auto buffer_pool_it = buffer_pools.find(usage); - if (buffer_pool_it == buffer_pools.end()) - { - LOGE("No buffer pool for buffer usage " + vk::to_string(usage)); - return vkb::BufferAllocationCpp{}; - } - - assert(thread_index < buffer_pool_it->second.size()); - auto &buffer_pool = buffer_pool_it->second[thread_index].first; - auto &buffer_block = buffer_pool_it->second[thread_index].second; - - bool want_minimal_block = buffer_allocation_strategy == BufferAllocationStrategy::OneAllocationPerBuffer; - - if (want_minimal_block || !buffer_block || !buffer_block->can_allocate(size)) - { - // If we are creating a buffer for each allocation of there is no block associated with the pool or the current block is too small - // for this allocation, request a new buffer block - buffer_block = &buffer_pool.request_buffer_block(size, want_minimal_block); - } - - return buffer_block->allocate(to_u32(size)); -} - -void HPPRenderFrame::clear_descriptors() -{ - for (auto &desc_sets_per_thread : descriptor_sets) - { - desc_sets_per_thread->clear(); - } - - for (auto &desc_pools_per_thread : descriptor_pools) - { - for (auto &desc_pool : *desc_pools_per_thread) - { - desc_pool.second.reset(); - } - } -} - -std::vector HPPRenderFrame::collect_bindings_to_update(const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, - const BindingMap &buffer_infos, - const BindingMap &image_infos) -{ - std::set bindings_to_update; - - auto aggregate_binding_to_update = [&bindings_to_update, &descriptor_set_layout](const auto &infos_map) { - for (const auto &[binding_index, ignored] : infos_map) - { - if (!(descriptor_set_layout.get_layout_binding_flag(binding_index) & vk::DescriptorBindingFlagBits::eUpdateAfterBind)) - { - bindings_to_update.insert(binding_index); - } - } - }; - aggregate_binding_to_update(buffer_infos); - aggregate_binding_to_update(image_infos); - - return {bindings_to_update.begin(), bindings_to_update.end()}; -} - -std::vector> &HPPRenderFrame::get_command_pools(const vkb::core::HPPQueue &queue, - vkb::core::HPPCommandBuffer::ResetMode reset_mode) -{ - auto command_pool_it = command_pools.find(queue.get_family_index()); - - if (command_pool_it != command_pools.end()) - { - assert(!command_pool_it->second.empty()); - if (command_pool_it->second[0]->get_reset_mode() != reset_mode) - { - device.get_handle().waitIdle(); - - // Delete pools - command_pools.erase(command_pool_it); - } - else - { - return command_pool_it->second; - } - } - - bool inserted = false; - std::tie(command_pool_it, inserted) = command_pools.emplace(queue.get_family_index(), std::vector>{}); - if (!inserted) - { - throw std::runtime_error("Failed to insert command pool"); - } - - for (size_t i = 0; i < thread_count; i++) - { - command_pool_it->second.push_back(std::make_unique(device, queue.get_family_index(), this, i, reset_mode)); - } - - return command_pool_it->second; -} - -vkb::core::HPPDevice &HPPRenderFrame::get_device() -{ - return device; -} - -const vkb::HPPFencePool &HPPRenderFrame::get_fence_pool() const -{ - return fence_pool; -} - -vkb::rendering::HPPRenderTarget &HPPRenderFrame::get_render_target() -{ - return *swapchain_render_target; -} - -vkb::rendering::HPPRenderTarget const &HPPRenderFrame::get_render_target() const -{ - return *swapchain_render_target; -} - -const vkb::HPPSemaphorePool &HPPRenderFrame::get_semaphore_pool() const -{ - return semaphore_pool; -} - -void HPPRenderFrame::release_owned_semaphore(vk::Semaphore semaphore) -{ - semaphore_pool.release_owned_semaphore(semaphore); -} - -vkb::core::HPPCommandBuffer &HPPRenderFrame::request_command_buffer(const vkb::core::HPPQueue &queue, - vkb::core::HPPCommandBuffer::ResetMode reset_mode, - vk::CommandBufferLevel level, - size_t thread_index) -{ - assert(thread_index < thread_count && "Thread index is out of bounds"); - - auto &command_pools = get_command_pools(queue, reset_mode); - - auto command_pool_it = - std::find_if(command_pools.begin(), - command_pools.end(), - [&thread_index](std::unique_ptr &cmd_pool) { return cmd_pool->get_thread_index() == thread_index; }); - assert(command_pool_it != command_pools.end()); - - return (*command_pool_it)->request_command_buffer(level); -} - -vk::DescriptorSet HPPRenderFrame::request_descriptor_set(const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, - const BindingMap &buffer_infos, - const BindingMap &image_infos, - bool update_after_bind, - size_t thread_index) -{ - assert(thread_index < thread_count && "Thread index is out of bounds"); - - assert(thread_index < descriptor_pools.size()); - auto &descriptor_pool = vkb::common::request_resource(device, nullptr, *descriptor_pools[thread_index], descriptor_set_layout); - if (descriptor_management_strategy == DescriptorManagementStrategy::StoreInCache) - { - // The bindings we want to update before binding, if empty we update all bindings - std::vector bindings_to_update; - // If update after bind is enabled, we store the binding index of each binding that need to be updated before being bound - if (update_after_bind) - { - bindings_to_update = collect_bindings_to_update(descriptor_set_layout, buffer_infos, image_infos); - } - - // Request a descriptor set from the render frame, and write the buffer infos and image infos of all the specified bindings - assert(thread_index < descriptor_sets.size()); - auto &descriptor_set = - vkb::common::request_resource(device, nullptr, *descriptor_sets[thread_index], descriptor_set_layout, descriptor_pool, buffer_infos, image_infos); - descriptor_set.update(bindings_to_update); - return descriptor_set.get_handle(); - } - else - { - // Request a descriptor pool, allocate a descriptor set, write buffer and image data to it - vkb::core::HPPDescriptorSet descriptor_set{device, descriptor_set_layout, descriptor_pool, buffer_infos, image_infos}; - descriptor_set.apply_writes(); - return descriptor_set.get_handle(); - } -} - -vk::Fence HPPRenderFrame::request_fence() -{ - return fence_pool.request_fence(); -} - -vk::Semaphore HPPRenderFrame::request_semaphore() -{ - return semaphore_pool.request_semaphore(); -} - -vk::Semaphore HPPRenderFrame::request_semaphore_with_ownership() -{ - return semaphore_pool.request_semaphore_with_ownership(); -} - -void HPPRenderFrame::reset() -{ - VK_CHECK(fence_pool.wait()); - - fence_pool.reset(); - - for (auto &command_pools_per_queue : command_pools) - { - for (auto &command_pool : command_pools_per_queue.second) - { - command_pool->reset_pool(); - } - } - - for (auto &buffer_pools_per_usage : buffer_pools) - { - for (auto &buffer_pool : buffer_pools_per_usage.second) - { - buffer_pool.first.reset(); - buffer_pool.second = nullptr; - } - } - - semaphore_pool.reset(); - - if (descriptor_management_strategy == DescriptorManagementStrategy::CreateDirectly) - { - clear_descriptors(); - } -} - -void HPPRenderFrame::set_buffer_allocation_strategy(BufferAllocationStrategy new_strategy) -{ - buffer_allocation_strategy = new_strategy; -} - -void HPPRenderFrame::set_descriptor_management_strategy(DescriptorManagementStrategy new_strategy) -{ - descriptor_management_strategy = new_strategy; -} - -void HPPRenderFrame::update_descriptor_sets(size_t thread_index) -{ - assert(thread_index < descriptor_sets.size()); - auto &thread_descriptor_sets = *descriptor_sets[thread_index]; - for (auto &descriptor_set_it : thread_descriptor_sets) - { - descriptor_set_it.second.update(); - } -} - -void HPPRenderFrame::update_render_target(std::unique_ptr &&render_target) -{ - swapchain_render_target = std::move(render_target); -} - -} // namespace rendering -} // namespace vkb diff --git a/framework/rendering/hpp_render_frame.h b/framework/rendering/hpp_render_frame.h deleted file mode 100644 index 4efc44b1cf..0000000000 --- a/framework/rendering/hpp_render_frame.h +++ /dev/null @@ -1,181 +0,0 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "buffer_pool.h" -#include -#include -#include - -namespace vkb -{ -namespace rendering -{ -enum class BufferAllocationStrategy -{ - OneAllocationPerBuffer, - MultipleAllocationsPerBuffer -}; - -enum class DescriptorManagementStrategy -{ - StoreInCache, - CreateDirectly -}; - -/** - * @brief HPPRenderFrame is a transcoded version of vkb::RenderFrame from vulkan to vulkan-hpp. - * - * See vkb::HPPRenderFrame for documentation - */ -/** - * @brief HPPRenderFrame is a container for per-frame data, including BufferPool objects, - * synchronization primitives (semaphores, fences) and the swapchain RenderTarget. - * - * When creating a RenderTarget, we need to provide images that will be used as attachments - * within a RenderPass. The HPPRenderFrame is responsible for creating a RenderTarget using - * RenderTarget::CreateFunc. A custom RenderTarget::CreateFunc can be provided if a different - * render target is required. - * - * A HPPRenderFrame cannot be destroyed individually since frames are managed by the RenderContext, - * the whole context must be destroyed. This is because each HPPRenderFrame holds Vulkan objects - * such as the swapchain image. - */ -class HPPRenderFrame -{ - public: - HPPRenderFrame(vkb::core::HPPDevice &device, std::unique_ptr &&render_target, size_t thread_count = 1); - - HPPRenderFrame(const HPPRenderFrame &) = delete; - HPPRenderFrame(HPPRenderFrame &&) = delete; - HPPRenderFrame &operator=(const HPPRenderFrame &) = delete; - HPPRenderFrame &operator=(HPPRenderFrame &&) = delete; - - void clear_descriptors(); - vkb::core::HPPDevice &get_device(); - const vkb::HPPFencePool &get_fence_pool() const; - vkb::rendering::HPPRenderTarget &get_render_target(); - vkb::rendering::HPPRenderTarget const &get_render_target() const; - const vkb::HPPSemaphorePool &get_semaphore_pool() const; - void release_owned_semaphore(vk::Semaphore semaphore); - vk::DescriptorSet request_descriptor_set(const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, - const BindingMap &buffer_infos, - const BindingMap &image_infos, - bool update_after_bind, - size_t thread_index = 0); - vk::Fence request_fence(); - vk::Semaphore request_semaphore(); - vk::Semaphore request_semaphore_with_ownership(); - void reset(); - - /** - * @param usage Usage of the buffer - * @param size Amount of memory required - * @param thread_index Index of the buffer pool to be used by the current thread - * @return The requested allocation, it may be empty - */ - vkb::BufferAllocationCpp allocate_buffer(vk::BufferUsageFlags usage, vk::DeviceSize size, size_t thread_index = 0); - - /** - * @brief Requests a command buffer to the command pool of the active frame - * A frame should be active at the moment of requesting it - * @param queue The queue command buffers will be submitted on - * @param reset_mode Indicate how the command buffer will be used, may trigger a - * pool re-creation to set necessary flags - * @param level Command buffer level, either primary or secondary - * @param thread_index Selects the thread's command pool used to manage the buffer - * @return A command buffer related to the current active frame - */ - vkb::core::HPPCommandBuffer &request_command_buffer(const vkb::core::HPPQueue &queue, - vkb::core::HPPCommandBuffer::ResetMode reset_mode = vkb::core::HPPCommandBuffer::ResetMode::ResetPool, - vk::CommandBufferLevel level = vk::CommandBufferLevel::ePrimary, - size_t thread_index = 0); - - /** - * @brief Sets a new buffer allocation strategy - * @param new_strategy The new buffer allocation strategy - */ - void set_buffer_allocation_strategy(BufferAllocationStrategy new_strategy); - - /** - * @brief Sets a new descriptor set management strategy - * @param new_strategy The new descriptor set management strategy - */ - void set_descriptor_management_strategy(DescriptorManagementStrategy new_strategy); - - /** - * @brief Called when the swapchain changes - * @param render_target A new render target with updated images - */ - void update_render_target(std::unique_ptr &&render_target); - - /** - * @brief Updates all the descriptor sets in the current frame at a specific thread index - */ - void update_descriptor_sets(size_t thread_index = 0); - - private: - /** - * @brief Retrieve the frame's command pool(s) - * @param queue The queue command buffers will be submitted on - * @param reset_mode Indicate how the command buffers will be reset after execution, - * may trigger a pool re-creation to set necessary flags - * @return The frame's command pool(s) - */ - std::vector> &get_command_pools(const vkb::core::HPPQueue &queue, - vkb::core::HPPCommandBuffer::ResetMode reset_mode); - - static std::vector collect_bindings_to_update(const vkb::core::HPPDescriptorSetLayout &descriptor_set_layout, - const BindingMap &buffer_infos, - const BindingMap &image_infos); - - private: - // A map of the supported usages to a multiplier for the BUFFER_POOL_BLOCK_SIZE - const std::unordered_map supported_usage_map = { - {vk::BufferUsageFlagBits::eUniformBuffer, 1}, - {vk::BufferUsageFlagBits::eStorageBuffer, 2}, // x2 the size of BUFFER_POOL_BLOCK_SIZE since SSBOs are normally much larger than other types of buffers - {vk::BufferUsageFlagBits::eVertexBuffer, 1}, - {vk::BufferUsageFlagBits::eIndexBuffer, 1}}; - - vkb::core::HPPDevice &device; - - /// Commands pools associated to the frame - std::map>> command_pools; - - /// Descriptor pools for the frame - std::vector>> descriptor_pools; - - /// Descriptor sets for the frame - std::vector>> descriptor_sets; - - vkb::HPPFencePool fence_pool; - - vkb::HPPSemaphorePool semaphore_pool; - - size_t thread_count; - - std::unique_ptr swapchain_render_target; - - BufferAllocationStrategy buffer_allocation_strategy{BufferAllocationStrategy::MultipleAllocationsPerBuffer}; - - DescriptorManagementStrategy descriptor_management_strategy{DescriptorManagementStrategy::StoreInCache}; - - std::map>> buffer_pools; -}; -} // namespace rendering -} // namespace vkb diff --git a/framework/rendering/hpp_render_pipeline.h b/framework/rendering/hpp_render_pipeline.h index b13f97110b..a4b79c48c6 100644 --- a/framework/rendering/hpp_render_pipeline.h +++ b/framework/rendering/hpp_render_pipeline.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -38,11 +38,11 @@ class HPPRenderPipeline : private vkb::RenderPipeline vkb::RenderPipeline::add_subpass(std::move(subpass)); } - void draw(vkb::core::HPPCommandBuffer &command_buffer, + void draw(vkb::core::CommandBufferCpp &command_buffer, vkb::rendering::HPPRenderTarget &render_target, vk::SubpassContents contents = vk::SubpassContents::eInline) { - vkb::RenderPipeline::draw(reinterpret_cast(command_buffer), + vkb::RenderPipeline::draw(reinterpret_cast(command_buffer), reinterpret_cast(render_target), static_cast(contents)); } diff --git a/framework/rendering/hpp_render_target.cpp b/framework/rendering/hpp_render_target.cpp index 8791312d51..e346b4cf5a 100644 --- a/framework/rendering/hpp_render_target.cpp +++ b/framework/rendering/hpp_render_target.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -16,8 +16,10 @@ */ #include "rendering/hpp_render_target.h" - -#include "core/hpp_device.h" +#include "common/hpp_vk_common.h" +#include "core/device.h" +#include "core/hpp_image_view.h" +#include "core/physical_device.h" namespace vkb { @@ -45,7 +47,7 @@ HPPRenderTarget::HPPRenderTarget(std::vector &&images_) : assert(!images.empty() && "Should specify at least 1 image"); // check that every image is 2D - auto it = std::find_if(images.begin(), images.end(), [](core::HPPImage const &image) { return image.get_type() != vk::ImageType::e2D; }); + auto it = std::ranges::find_if(images, [](core::HPPImage const &image) { return image.get_type() != vk::ImageType::e2D; }); if (it != images.end()) { throw VulkanException{VK_ERROR_INITIALIZATION_FAILED, "Image type is not 2D"}; diff --git a/framework/rendering/hpp_render_target.h b/framework/rendering/hpp_render_target.h index 82ae02a09b..d46483e28c 100644 --- a/framework/rendering/hpp_render_target.h +++ b/framework/rendering/hpp_render_target.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +18,7 @@ #pragma once #include "core/hpp_image.h" +#include "core/hpp_image_view.h" #include #include @@ -97,7 +98,7 @@ class HPPRenderTarget vk::ImageLayout get_layout(uint32_t attachment) const; private: - core::HPPDevice const &device; + vkb::core::DeviceCpp const &device; vk::Extent2D extent; std::vector images; std::vector views; diff --git a/framework/rendering/pipeline_state.cpp b/framework/rendering/pipeline_state.cpp index 1b2fb77bad..15c4c476da 100644 --- a/framework/rendering/pipeline_state.cpp +++ b/framework/rendering/pipeline_state.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,6 +16,7 @@ */ #include "pipeline_state.h" +#include "core/render_pass.h" bool operator==(const VkVertexInputAttributeDescription &lhs, const VkVertexInputAttributeDescription &rhs) { diff --git a/framework/rendering/pipeline_state.h b/framework/rendering/pipeline_state.h index fd0fbf44f8..f6d189bfb7 100644 --- a/framework/rendering/pipeline_state.h +++ b/framework/rendering/pipeline_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,10 +21,11 @@ #include "common/vk_common.h" #include "core/pipeline_layout.h" -#include "core/render_pass.h" namespace vkb { +class RenderPass; + struct VertexInputState { std::vector bindings; diff --git a/framework/rendering/postprocessing_computepass.cpp b/framework/rendering/postprocessing_computepass.cpp index 592aeac2f8..f938ab1a5a 100644 --- a/framework/rendering/postprocessing_computepass.cpp +++ b/framework/rendering/postprocessing_computepass.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -56,7 +56,7 @@ PostProcessingComputePass::PostProcessingComputePass(PostProcessingPipeline *par } } -void PostProcessingComputePass::prepare(CommandBuffer &command_buffer, RenderTarget &default_render_target) +void PostProcessingComputePass::prepare(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) { // Build the compute shader upfront auto &resource_cache = get_render_context().get_device().get_resource_cache(); @@ -93,7 +93,7 @@ PostProcessingComputePass &PostProcessingComputePass::bind_storage_image(const s return *this; } -void PostProcessingComputePass::transition_images(CommandBuffer &command_buffer, RenderTarget &default_render_target) +void PostProcessingComputePass::transition_images(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) { BarrierInfo fallback_barrier_src{}; fallback_barrier_src.pipeline_stage = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; @@ -195,7 +195,7 @@ void PostProcessingComputePass::transition_images(CommandBuffer &command_buffer, } } -void PostProcessingComputePass::draw(CommandBuffer &command_buffer, RenderTarget &default_render_target) +void PostProcessingComputePass::draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) { transition_images(command_buffer, default_render_target); diff --git a/framework/rendering/postprocessing_computepass.h b/framework/rendering/postprocessing_computepass.h index 8a548a56dc..2890cd26d5 100644 --- a/framework/rendering/postprocessing_computepass.h +++ b/framework/rendering/postprocessing_computepass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -44,8 +44,8 @@ class PostProcessingComputePass : public PostProcessingPassrender_context; } diff --git a/framework/rendering/postprocessing_pass.h b/framework/rendering/postprocessing_pass.h index 0fb2207739..7466985f39 100644 --- a/framework/rendering/postprocessing_pass.h +++ b/framework/rendering/postprocessing_pass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2022, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -50,7 +50,7 @@ class PostProcessingPassBase * @remarks Passes that that do not explicitly have a vkb::RenderTarget set will render * to default_render_target. */ - virtual void prepare(CommandBuffer &command_buffer, RenderTarget &default_render_target) + virtual void prepare(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) { prepared = true; } @@ -60,7 +60,7 @@ class PostProcessingPassBase * @remarks Passes that that do not explicitly have a vkb::RenderTarget set will render * to default_render_target. */ - virtual void draw(CommandBuffer &command_buffer, RenderTarget &default_render_target) + virtual void draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) {} /** @@ -84,7 +84,7 @@ class PostProcessingPassBase /** * @brief Returns the parent's render context. */ - RenderContext &get_render_context() const; + vkb::rendering::RenderContextC &get_render_context() const; /** * @brief Returns the parent's fullscreen triangle vertex shader source. diff --git a/framework/rendering/postprocessing_pipeline.cpp b/framework/rendering/postprocessing_pipeline.cpp index 279eb9920b..1f6ec9fb14 100644 --- a/framework/rendering/postprocessing_pipeline.cpp +++ b/framework/rendering/postprocessing_pipeline.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,12 +21,12 @@ namespace vkb { -PostProcessingPipeline::PostProcessingPipeline(RenderContext &render_context, ShaderSource triangle_vs) : +PostProcessingPipeline::PostProcessingPipeline(vkb::rendering::RenderContextC &render_context, ShaderSource triangle_vs) : render_context{&render_context}, triangle_vs{std::move(triangle_vs)} {} -void PostProcessingPipeline::draw(CommandBuffer &command_buffer, RenderTarget &default_render_target) +void PostProcessingPipeline::draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) { for (current_pass_index = 0; current_pass_index < passes.size(); current_pass_index++) { diff --git a/framework/rendering/postprocessing_pipeline.h b/framework/rendering/postprocessing_pipeline.h index 9b5aedbdfd..d380fe3d46 100644 --- a/framework/rendering/postprocessing_pipeline.h +++ b/framework/rendering/postprocessing_pipeline.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,22 +24,22 @@ namespace vkb class PostProcessingRenderPass; /** -* @brief A rendering pipeline specialized for fullscreen post-processing and compute passes. -*/ + * @brief A rendering pipeline specialized for fullscreen post-processing and compute passes. + */ class PostProcessingPipeline { public: friend class PostProcessingPassBase; /** - * @brief Creates a rendering pipeline entirely made of fullscreen post-processing subpasses. - */ - PostProcessingPipeline(RenderContext &render_context, ShaderSource triangle_vs); + * @brief Creates a rendering pipeline entirely made of fullscreen post-processing subpasses. + */ + PostProcessingPipeline(vkb::rendering::RenderContextC &render_context, ShaderSource triangle_vs); - PostProcessingPipeline(const PostProcessingPipeline &to_copy) = delete; + PostProcessingPipeline(const PostProcessingPipeline &to_copy) = delete; PostProcessingPipeline &operator=(const PostProcessingPipeline &to_copy) = delete; - PostProcessingPipeline(PostProcessingPipeline &&to_move) = delete; + PostProcessingPipeline(PostProcessingPipeline &&to_move) = delete; PostProcessingPipeline &operator=(PostProcessingPipeline &&to_move) = delete; virtual ~PostProcessingPipeline() = default; @@ -49,7 +49,7 @@ class PostProcessingPipeline * @remarks vkb::PostProcessingRenderpass that do not explicitly have a vkb::RenderTarget set will render * to default_render_target. */ - void draw(CommandBuffer &command_buffer, RenderTarget &default_render_target); + void draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target); /** * @brief Gets all of the passes in the pipeline. @@ -72,7 +72,7 @@ class PostProcessingPipeline * @brief Adds a pass of the given type to the end of the pipeline by constructing it in-place. */ template - TPass &add_pass(ConstructorArgs &&... args) + TPass &add_pass(ConstructorArgs &&...args) { passes.emplace_back(std::make_unique(this, std::forward(args)...)); auto &added_pass = *dynamic_cast(passes.back().get()); @@ -82,7 +82,7 @@ class PostProcessingPipeline /** * @brief Returns the current render context. */ - inline RenderContext &get_render_context() const + inline vkb::rendering::RenderContextC &get_render_context() const { return *render_context; } @@ -96,7 +96,7 @@ class PostProcessingPipeline } private: - RenderContext * render_context{nullptr}; + vkb::rendering::RenderContextC *render_context{nullptr}; ShaderSource triangle_vs; std::vector> passes{}; size_t current_pass_index{0}; diff --git a/framework/rendering/postprocessing_renderpass.cpp b/framework/rendering/postprocessing_renderpass.cpp index 6c780a5e21..8582c3d164 100644 --- a/framework/rendering/postprocessing_renderpass.cpp +++ b/framework/rendering/postprocessing_renderpass.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,8 +24,11 @@ namespace vkb constexpr uint32_t DEPTH_RESOLVE_BITMASK = 0x80000000; constexpr uint32_t ATTACHMENT_BITMASK = 0x7FFFFFFF; -PostProcessingSubpass::PostProcessingSubpass(PostProcessingRenderPass *parent, RenderContext &render_context, ShaderSource &&triangle_vs, - ShaderSource &&fs, ShaderVariant &&fs_variant) : +PostProcessingSubpass::PostProcessingSubpass(PostProcessingRenderPass *parent, + vkb::rendering::RenderContextC &render_context, + ShaderSource &&triangle_vs, + ShaderSource &&fs, + ShaderVariant &&fs_variant) : Subpass(render_context, std::move(triangle_vs), std::move(fs)), parent{parent}, fs_variant{std::move(fs_variant)} @@ -119,7 +122,7 @@ void PostProcessingSubpass::prepare() resource_cache.request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, get_fragment_shader(), fs_variant); } -void PostProcessingSubpass::draw(CommandBuffer &command_buffer) +void PostProcessingSubpass::draw(vkb::core::CommandBufferC &command_buffer) { // Get shaders from cache auto &resource_cache = command_buffer.get_device().get_resource_cache(); @@ -194,7 +197,7 @@ void PostProcessingSubpass::draw(CommandBuffer &command_buffer) draw_func(command_buffer, render_target); } -void PostProcessingSubpass::default_draw_func(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &) +void PostProcessingSubpass::default_draw_func(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &) { command_buffer.draw(3, 1, 0, 0); } @@ -250,14 +253,14 @@ void PostProcessingRenderPass::update_load_stores( for (uint32_t j = 0; j < static_cast(render_target.get_attachments().size()); j++) { const bool is_input = input_attachments.find(j) != input_attachments.end(); - const bool is_sampled = std::find_if(sampled_attachments.begin(), sampled_attachments.end(), - [&render_target, j](auto &pair) { - // NOTE: if RT not set, default is the currently-active one - auto *sampled_rt = pair.first ? pair.first : &render_target; - // unpack attachment - uint32_t attachment = pair.second & ATTACHMENT_BITMASK; - return attachment == j && sampled_rt == &render_target; - }) != sampled_attachments.end(); + const bool is_sampled = std::ranges::find_if(sampled_attachments, + [&render_target, j](auto &pair) { + // NOTE: if RT not set, default is the currently-active one + auto *sampled_rt = pair.first ? pair.first : &render_target; + // unpack attachment + uint32_t attachment = pair.second & ATTACHMENT_BITMASK; + return attachment == j && sampled_rt == &render_target; + }) != sampled_attachments.end(); const bool is_output = output_attachments.find(j) != output_attachments.end(); VkAttachmentLoadOp load; @@ -330,12 +333,11 @@ static void ensure_src_access(uint32_t &src_access, uint32_t &src_stage, VkImage } } -void PostProcessingRenderPass::transition_attachments( - const AttachmentSet &input_attachments, - const SampledAttachmentSet &sampled_attachments, - const AttachmentSet &output_attachments, - CommandBuffer &command_buffer, - RenderTarget &fallback_render_target) +void PostProcessingRenderPass::transition_attachments(const AttachmentSet &input_attachments, + const SampledAttachmentSet &sampled_attachments, + const AttachmentSet &output_attachments, + vkb::core::CommandBufferC &command_buffer, + RenderTarget &fallback_render_target) { auto &render_target = this->render_target ? *this->render_target : fallback_render_target; const auto &views = render_target.get_views(); @@ -457,7 +459,7 @@ void PostProcessingRenderPass::transition_attachments( // so we don't want to transition them to UNDEFINED layout here } -void PostProcessingRenderPass::prepare_draw(CommandBuffer &command_buffer, RenderTarget &fallback_render_target) +void PostProcessingRenderPass::prepare_draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &fallback_render_target) { // Collect all input, output, and sampled-from attachments from all subpasses (steps) AttachmentSet input_attachments, output_attachments; @@ -501,7 +503,7 @@ void PostProcessingRenderPass::prepare_draw(CommandBuffer &command_buffer, Rende fallback_render_target); } -void PostProcessingRenderPass::draw(CommandBuffer &command_buffer, RenderTarget &default_render_target) +void PostProcessingRenderPass::draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &default_render_target) { prepare_draw(command_buffer, default_render_target); diff --git a/framework/rendering/postprocessing_renderpass.h b/framework/rendering/postprocessing_renderpass.h index 9c101a3a15..f7230c5ace 100644 --- a/framework/rendering/postprocessing_renderpass.h +++ b/framework/rendering/postprocessing_renderpass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -71,8 +71,11 @@ class PostProcessingRenderPass; class PostProcessingSubpass : public vkb::rendering::SubpassC { public: - PostProcessingSubpass(PostProcessingRenderPass *parent, RenderContext &render_context, ShaderSource &&triangle_vs, - ShaderSource &&fs, ShaderVariant &&fs_variant = {}); + PostProcessingSubpass(PostProcessingRenderPass *parent, + vkb::rendering::RenderContextC &render_context, + ShaderSource &&triangle_vs, + ShaderSource &&fs, + ShaderVariant &&fs_variant = {}); PostProcessingSubpass(const PostProcessingSubpass &to_copy) = delete; PostProcessingSubpass &operator=(const PostProcessingSubpass &to_copy) = delete; @@ -183,7 +186,7 @@ class PostProcessingSubpass : public vkb::rendering::SubpassC * @brief A functor used to draw the primitives for a post-processing step. * @see default_draw_func() */ - using DrawFunc = std::function; + using DrawFunc = std::function; /** * @brief Sets the function used to draw this postprocessing step. @@ -194,7 +197,7 @@ class PostProcessingSubpass : public vkb::rendering::SubpassC /** * @brief The default function used to draw a step; it draws 1 instance with 3 vertices. */ - static void default_draw_func(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target); + static void default_draw_func(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target); private: PostProcessingRenderPass *parent; @@ -210,7 +213,7 @@ class PostProcessingSubpass : public vkb::rendering::SubpassC DrawFunc draw_func{&PostProcessingSubpass::default_draw_func}; void prepare() override; - void draw(CommandBuffer &command_buffer) override; + void draw(vkb::core::CommandBufferC &command_buffer) override; }; /** @@ -229,7 +232,7 @@ class PostProcessingRenderPass : public PostProcessingPass &present_mode_priority_list, - const std::vector &surface_format_priority_list) : - device{device}, window{window}, queue{device.get_suitable_graphics_queue()}, surface_extent{window.get_extent().width, window.get_extent().height} -{ - if (surface != VK_NULL_HANDLE) - { - VkSurfaceCapabilitiesKHR surface_properties; - VK_CHECK(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device.get_gpu().get_handle(), - surface, - &surface_properties)); - - if (surface_properties.currentExtent.width == 0xFFFFFFFF) - { - swapchain = std::make_unique(device, surface, present_mode, present_mode_priority_list, surface_format_priority_list, surface_extent); - } - else - { - swapchain = std::make_unique(device, surface, present_mode, present_mode_priority_list, surface_format_priority_list); - } - } -} - -void RenderContext::prepare(size_t thread_count, RenderTarget::CreateFunc create_render_target_func) -{ - device.wait_idle(); - - if (swapchain) - { - surface_extent = swapchain->get_extent(); - - VkExtent3D extent{surface_extent.width, surface_extent.height, 1}; - - for (auto &image_handle : swapchain->get_images()) - { - auto swapchain_image = core::Image{ - device, image_handle, - extent, - swapchain->get_format(), - swapchain->get_usage()}; - auto render_target = create_render_target_func(std::move(swapchain_image)); - frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); - } - } - else - { - // Otherwise, create a single RenderFrame - swapchain = nullptr; - - auto color_image = core::Image{device, - VkExtent3D{surface_extent.width, surface_extent.height, 1}, - DEFAULT_VK_FORMAT, // We can use any format here that we like - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, - VMA_MEMORY_USAGE_GPU_ONLY}; - - auto render_target = create_render_target_func(std::move(color_image)); - frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); - } - - this->create_render_target_func = create_render_target_func; - this->thread_count = thread_count; - this->prepared = true; -} - -VkFormat RenderContext::get_format() const -{ - VkFormat format = DEFAULT_VK_FORMAT; - - if (swapchain) - { - format = swapchain->get_format(); - } - - return format; -} - -void RenderContext::update_swapchain(const VkExtent2D &extent) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains extent. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - swapchain = std::make_unique(*swapchain, extent); - - recreate(); -} - -void RenderContext::update_swapchain(const uint32_t image_count) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains image count. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - device.wait_idle(); - - swapchain = std::make_unique(*swapchain, image_count); - - recreate(); -} - -void RenderContext::update_swapchain(const std::set &image_usage_flags) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains image usage. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - swapchain = std::make_unique(*swapchain, image_usage_flags); - - recreate(); -} - -void RenderContext::update_swapchain(const VkExtent2D &extent, const VkSurfaceTransformFlagBitsKHR transform) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains extent and surface transform. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - auto width = extent.width; - auto height = extent.height; - if (transform == VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR || transform == VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) - { - // Pre-rotation: always use native orientation i.e. if rotated, use width and height of identity transform - std::swap(width, height); - } - - swapchain = std::make_unique(*swapchain, VkExtent2D{width, height}, transform); - - // Save the preTransform attribute for future rotations - pre_transform = transform; - - recreate(); -} - -void RenderContext::update_swapchain(const VkImageCompressionFlagsEXT compression, const VkImageCompressionFixedRateFlagsEXT compression_fixed_rate) -{ - if (!swapchain) - { - LOGW("Can't update the swapchains compression. No swapchain, offscreen rendering detected, skipping."); - return; - } - - device.get_resource_cache().clear_framebuffers(); - - swapchain = std::make_unique(*swapchain, compression, compression_fixed_rate); - - recreate(); -} - -void RenderContext::recreate() -{ - LOGI("Recreated swapchain"); - - VkExtent2D swapchain_extent = swapchain->get_extent(); - VkExtent3D extent{swapchain_extent.width, swapchain_extent.height, 1}; - - auto frame_it = frames.begin(); - - for (auto &image_handle : swapchain->get_images()) - { - core::Image swapchain_image{device, image_handle, - extent, - swapchain->get_format(), - swapchain->get_usage()}; - - auto render_target = create_render_target_func(std::move(swapchain_image)); - - if (frame_it != frames.end()) - { - (*frame_it)->update_render_target(std::move(render_target)); - } - else - { - // Create a new frame if the new swapchain has more images than current frames - frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); - } - - ++frame_it; - } - - device.get_resource_cache().clear_framebuffers(); -} - -bool RenderContext::handle_surface_changes(bool force_update) -{ - if (!swapchain) - { - LOGW("Can't handle surface changes. No swapchain, offscreen rendering detected, skipping."); - return false; - } - - VkSurfaceCapabilitiesKHR surface_properties; - VK_CHECK(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device.get_gpu().get_handle(), - swapchain->get_surface(), - &surface_properties)); - - if (surface_properties.currentExtent.width == 0xFFFFFFFF) - { - return false; - } - - // Only recreate the swapchain if the dimensions have changed; - // handle_surface_changes() is called on VK_SUBOPTIMAL_KHR, - // which might not be due to a surface resize - if (surface_properties.currentExtent.width != surface_extent.width || - surface_properties.currentExtent.height != surface_extent.height || - force_update) - { - // Recreate swapchain - device.wait_idle(); - - update_swapchain(surface_properties.currentExtent, pre_transform); - - surface_extent = surface_properties.currentExtent; - - return true; - } - - return false; -} - -CommandBuffer &RenderContext::begin(CommandBuffer::ResetMode reset_mode) -{ - assert(prepared && "RenderContext not prepared for rendering, call prepare()"); - - if (!frame_active) - { - begin_frame(); - } - - if (acquired_semaphore == VK_NULL_HANDLE) - { - throw std::runtime_error("Couldn't begin frame"); - } - - const auto &queue = device.get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - return get_active_frame().request_command_buffer(queue, reset_mode); -} - -void RenderContext::submit(CommandBuffer &command_buffer) -{ - submit({&command_buffer}); -} - -void RenderContext::submit(const std::vector &command_buffers) -{ - assert(frame_active && "RenderContext is inactive, cannot submit command buffer. Please call begin()"); - - VkSemaphore render_semaphore = VK_NULL_HANDLE; - - if (swapchain) - { - assert(acquired_semaphore && "We do not have acquired_semaphore, it was probably consumed?\n"); - render_semaphore = submit(queue, command_buffers, acquired_semaphore, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); - } - else - { - submit(queue, command_buffers); - } - - end_frame(render_semaphore); -} - -void RenderContext::begin_frame() -{ - // Only handle surface changes if a swapchain exists - if (swapchain) - { - handle_surface_changes(); - } - - assert(!frame_active && "Frame is still active, please call end_frame"); - - assert(active_frame_index < frames.size()); - auto &prev_frame = *frames[active_frame_index]; - - // We will use the acquired semaphore in a different frame context, - // so we need to hold ownership. - acquired_semaphore = prev_frame.request_semaphore_with_ownership(); - - if (swapchain) - { - auto result = swapchain->acquire_next_image(active_frame_index, acquired_semaphore, VK_NULL_HANDLE); - - if (result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_OUT_OF_DATE_KHR) - { -#if defined(PLATFORM__MACOS) - // On Apple platforms, force swapchain update on both VK_SUBOPTIMAL_KHR and VK_ERROR_OUT_OF_DATE_KHR - // VK_SUBOPTIMAL_KHR may occur on macOS/iOS following changes to swapchain other than extent/size - bool swapchain_updated = handle_surface_changes(true); -#else - bool swapchain_updated = handle_surface_changes(result == VK_ERROR_OUT_OF_DATE_KHR); -#endif - - if (swapchain_updated) - { - // Need to destroy and reallocate acquired_semaphore since it may have already been signaled - vkDestroySemaphore(device.get_handle(), acquired_semaphore, nullptr); - acquired_semaphore = prev_frame.request_semaphore_with_ownership(); - result = swapchain->acquire_next_image(active_frame_index, acquired_semaphore, VK_NULL_HANDLE); - } - } - - if (result != VK_SUCCESS) - { - prev_frame.reset(); - return; - } - } - - // Now the frame is active again - frame_active = true; - - // Wait on all resource to be freed from the previous render to this frame - wait_frame(); -} - -VkSemaphore RenderContext::submit(const Queue &queue, const std::vector &command_buffers, VkSemaphore wait_semaphore, VkPipelineStageFlags wait_pipeline_stage) -{ - std::vector cmd_buf_handles(command_buffers.size(), VK_NULL_HANDLE); - std::transform(command_buffers.begin(), command_buffers.end(), cmd_buf_handles.begin(), [](const CommandBuffer *cmd_buf) { return cmd_buf->get_handle(); }); - - RenderFrame &frame = get_active_frame(); - - VkSemaphore signal_semaphore = frame.request_semaphore(); - - VkSubmitInfo submit_info{VK_STRUCTURE_TYPE_SUBMIT_INFO}; - - submit_info.commandBufferCount = to_u32(cmd_buf_handles.size()); - submit_info.pCommandBuffers = cmd_buf_handles.data(); - - if (wait_semaphore != VK_NULL_HANDLE) - { - submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &wait_semaphore; - submit_info.pWaitDstStageMask = &wait_pipeline_stage; - } - - submit_info.signalSemaphoreCount = 1; - submit_info.pSignalSemaphores = &signal_semaphore; - - VkFence fence = frame.request_fence(); - - VK_CHECK(queue.submit({submit_info}, fence)); - - return signal_semaphore; -} - -void RenderContext::submit(const Queue &queue, const std::vector &command_buffers) -{ - std::vector cmd_buf_handles(command_buffers.size(), VK_NULL_HANDLE); - std::transform(command_buffers.begin(), command_buffers.end(), cmd_buf_handles.begin(), [](const CommandBuffer *cmd_buf) { return cmd_buf->get_handle(); }); - - RenderFrame &frame = get_active_frame(); - - VkSubmitInfo submit_info{VK_STRUCTURE_TYPE_SUBMIT_INFO}; - - submit_info.commandBufferCount = to_u32(cmd_buf_handles.size()); - submit_info.pCommandBuffers = cmd_buf_handles.data(); - - VkFence fence = frame.request_fence(); - - VK_CHECK(queue.submit({submit_info}, fence)); -} - -void RenderContext::wait_frame() -{ - RenderFrame &frame = get_active_frame(); - frame.reset(); -} - -void RenderContext::end_frame(VkSemaphore semaphore) -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - - if (swapchain) - { - VkSwapchainKHR vk_swapchain = swapchain->get_handle(); - - VkPresentInfoKHR present_info{VK_STRUCTURE_TYPE_PRESENT_INFO_KHR}; - - present_info.waitSemaphoreCount = 1; - present_info.pWaitSemaphores = &semaphore; - present_info.swapchainCount = 1; - present_info.pSwapchains = &vk_swapchain; - present_info.pImageIndices = &active_frame_index; - - VkDisplayPresentInfoKHR disp_present_info{}; - if (device.is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && - window.get_display_present_info(&disp_present_info, surface_extent.width, surface_extent.height)) - { - // Add display present info if supported and wanted - present_info.pNext = &disp_present_info; - } - - VkResult result = queue.present(present_info); - - if (result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_OUT_OF_DATE_KHR) - { - handle_surface_changes(); - } - } - - // Frame is not active anymore - if (acquired_semaphore) - { - release_owned_semaphore(acquired_semaphore); - acquired_semaphore = VK_NULL_HANDLE; - } - frame_active = false; -} - -VkSemaphore RenderContext::consume_acquired_semaphore() -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - auto sem = acquired_semaphore; - acquired_semaphore = VK_NULL_HANDLE; - return sem; -} - -RenderFrame &RenderContext::get_active_frame() -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - assert(active_frame_index < frames.size()); - return *frames[active_frame_index]; -} - -uint32_t RenderContext::get_active_frame_index() -{ - assert(frame_active && "Frame is not active, please call begin_frame"); - return active_frame_index; -} - -RenderFrame &RenderContext::get_last_rendered_frame() -{ - assert(!frame_active && "Frame is still active, please call end_frame"); - assert(active_frame_index < frames.size()); - return *frames[active_frame_index]; -} - -VkSemaphore RenderContext::request_semaphore() -{ - RenderFrame &frame = get_active_frame(); - return frame.request_semaphore(); -} - -VkSemaphore RenderContext::request_semaphore_with_ownership() -{ - RenderFrame &frame = get_active_frame(); - return frame.request_semaphore_with_ownership(); -} - -void RenderContext::release_owned_semaphore(VkSemaphore semaphore) -{ - RenderFrame &frame = get_active_frame(); - frame.release_owned_semaphore(semaphore); -} - -Device &RenderContext::get_device() -{ - return device; -} - -void RenderContext::recreate_swapchain() -{ - device.wait_idle(); - device.get_resource_cache().clear_framebuffers(); - - VkExtent2D swapchain_extent = swapchain->get_extent(); - VkExtent3D extent{swapchain_extent.width, swapchain_extent.height, 1}; - - auto frame_it = frames.begin(); - - for (auto &image_handle : swapchain->get_images()) - { - core::Image swapchain_image{device, image_handle, - extent, - swapchain->get_format(), - swapchain->get_usage()}; - - auto render_target = create_render_target_func(std::move(swapchain_image)); - (*frame_it)->update_render_target(std::move(render_target)); - - ++frame_it; - } -} - -bool RenderContext::has_swapchain() -{ - return swapchain != nullptr; -} - -Swapchain const &RenderContext::get_swapchain() const -{ - assert(swapchain && "Swapchain is not valid"); - return *swapchain; -} - -VkExtent2D const &RenderContext::get_surface_extent() const -{ - return surface_extent; -} - -uint32_t RenderContext::get_active_frame_index() const -{ - return active_frame_index; -} - -std::vector> &RenderContext::get_render_frames() -{ - return frames; -} - -} // namespace vkb diff --git a/framework/rendering/render_context.h b/framework/rendering/render_context.h index 69b7548581..648a720b05 100644 --- a/framework/rendering/render_context.h +++ b/framework/rendering/render_context.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,27 +17,33 @@ #pragma once -#include "common/helpers.h" #include "common/vk_common.h" -#include "core/command_buffer.h" -#include "core/command_pool.h" -#include "core/descriptor_set.h" -#include "core/descriptor_set_layout.h" -#include "core/framebuffer.h" -#include "core/pipeline.h" -#include "core/pipeline_layout.h" -#include "core/queue.h" -#include "core/render_pass.h" -#include "core/shader_module.h" -#include "core/swapchain.h" -#include "rendering/pipeline_state.h" +#include "core/device.h" +#include "core/hpp_swapchain.h" +#include "platform/window.h" +#include "rendering/hpp_render_target.h" #include "rendering/render_frame.h" -#include "rendering/render_target.h" -#include "resource_cache.h" +#include namespace vkb { -class Window; +class Queue; +class RenderTarget; +class Swapchain; + +namespace core +{ +template +class CommandBuffer; + +class HPPQueue; +} // namespace core + +namespace rendering +{ +template +class RenderFrame; +using RenderFrameCpp = RenderFrame; /** * @brief RenderContext acts as a frame manager for the sample, with a lifetime that is the @@ -54,11 +60,29 @@ class Window; * For offscreen rendering (no swapchain), the RenderContext can be given a valid Device, and * a width and height. A single RenderFrame will then be created. */ +template class RenderContext { public: // The format to use for the RenderTargets if a swapchain isn't created - static VkFormat DEFAULT_VK_FORMAT; + static inline vk::Format DEFAULT_VK_FORMAT = vk::Format::eR8G8B8A8Srgb; + + public: + using QueueType = typename std::conditional::type; + using RenderTargetType = typename std::conditional::type; + using SwapchainType = typename std::conditional::type; + + using Extent2DType = typename std::conditional::type; + using FormatType = typename std::conditional::type; + using ImageCompressionFixedRateFlagsType = typename std::conditional::type; + using ImageCompressionFlagsType = typename std::conditional::type; + using ImageUsageFlagBitsType = typename std::conditional::type; + using PipelineStageFlagsType = typename std::conditional::type; + using PresentModeType = typename std::conditional::type; + using SemaphoreType = typename std::conditional::type; + using SurfaceFormatType = typename std::conditional::type; + using SurfaceTransformFlagBitsType = typename std::conditional::type; + using SurfaceType = typename std::conditional::type; /** * @brief Constructor @@ -69,69 +93,102 @@ class RenderContext * @param present_mode_priority_list The order in which the swapchain prioritizes selecting its present mode * @param surface_format_priority_list The order in which the swapchain prioritizes selecting its surface format */ - RenderContext(Device &device, + RenderContext(vkb::core::DeviceCpp &device, + vk::SurfaceKHR surface, + const vkb::Window &window, + vk::PresentModeKHR present_mode = vk::PresentModeKHR::eFifo, + const std::vector &present_mode_priority_list = {vk::PresentModeKHR::eFifo, vk::PresentModeKHR::eMailbox}, + const std::vector &surface_format_priority_list = {{vk::Format::eR8G8B8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}, + {vk::Format::eB8G8R8A8Srgb, vk::ColorSpaceKHR::eSrgbNonlinear}}); + RenderContext(vkb::core::DeviceC &device, VkSurfaceKHR surface, - const Window &window, + const vkb::Window &window, VkPresentModeKHR present_mode = VK_PRESENT_MODE_FIFO_KHR, const std::vector &present_mode_priority_list = {VK_PRESENT_MODE_FIFO_KHR, VK_PRESENT_MODE_MAILBOX_KHR}, - const std::vector &surface_format_priority_list = { - {VK_FORMAT_R8G8B8A8_SRGB, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR}, - {VK_FORMAT_B8G8R8A8_SRGB, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR}}); + const std::vector &surface_format_priority_list = {{VK_FORMAT_R8G8B8A8_SRGB, VK_COLORSPACE_SRGB_NONLINEAR_KHR}, + {VK_FORMAT_B8G8R8A8_SRGB, VK_COLORSPACE_SRGB_NONLINEAR_KHR}}); RenderContext(const RenderContext &) = delete; - - RenderContext(RenderContext &&) = delete; + RenderContext(RenderContext &&) = delete; virtual ~RenderContext() = default; RenderContext &operator=(const RenderContext &) = delete; + RenderContext &operator=(RenderContext &&) = delete; - RenderContext &operator=(RenderContext &&) = delete; + public: + /** + * @brief Prepares the next available frame for rendering + * @param reset_mode How to reset the command buffer + * @returns A valid command buffer to record commands to be submitted + * Also ensures that there is an active frame if there is no existing active frame already + */ + std::shared_ptr> begin(vkb::CommandBufferResetMode reset_mode = vkb::CommandBufferResetMode::ResetPool); /** - * @brief Prepares the RenderFrames for rendering - * @param thread_count The number of threads in the application, necessary to allocate this many resource pools for each RenderFrame - * @param create_render_target_func A function delegate, used to create a RenderTarget + * @brief begin_frame */ - void prepare(size_t thread_count = 1, RenderTarget::CreateFunc create_render_target_func = RenderTarget::DEFAULT_CREATE_FUNC); + void begin_frame(); /** - * @brief Updates the swapchains extent, if a swapchain exists - * @param extent The width and height of the new swapchain images + * @brief Returns the WSI acquire semaphore. Only to be used in very special circumstances. + * @return The WSI acquire semaphore. */ - void update_swapchain(const VkExtent2D &extent); + SemaphoreType consume_acquired_semaphore(); + + void end_frame(SemaphoreType semaphore); /** - * @brief Updates the swapchains image count, if a swapchain exists - * @param image_count The amount of images in the new swapchain + * @brief An error should be raised if the frame is not active. + * A frame is active after @ref begin_frame has been called. + * @return The current active frame */ - void update_swapchain(const uint32_t image_count); + vkb::rendering::RenderFrame &get_active_frame(); /** - * @brief Updates the swapchains image usage, if a swapchain exists - * @param image_usage_flags The usage flags the new swapchain images will have + * @brief An error should be raised if the frame is not active. + * A frame is active after @ref begin_frame has been called. + * @return The current active frame index */ - void update_swapchain(const std::set &image_usage_flags); + uint32_t get_active_frame_index() const; + + vkb::core::Device &get_device(); /** - * @brief Updates the swapchains extent and surface transform, if a swapchain exists - * @param extent The width and height of the new swapchain images - * @param transform The surface transform flags + * @brief Returns the format that the RenderTargets are created with within the RenderContext */ - void update_swapchain(const VkExtent2D &extent, const VkSurfaceTransformFlagBitsKHR transform); + FormatType get_format() const; /** - * @brief Updates the swapchain's compression settings, if a swapchain exists - * @param compression The compression to use for swapchain images (default, fixed-rate, none) - * @param compression_fixed_rate The rate to use, if compression is fixed-rate + * @brief An error should be raised if a frame is active. + * A frame is active after @ref begin_frame has been called. + * @return The previous frame */ - void update_swapchain(const VkImageCompressionFlagsEXT compression, const VkImageCompressionFixedRateFlagsEXT compression_fixed_rate); + vkb::rendering::RenderFrame &get_last_rendered_frame(); + + std::vector>> &get_render_frames(); + + Extent2DType const &get_surface_extent() const; + + SwapchainType const &get_swapchain() const; + + /** + * @brief Handles surface changes, only applicable if the render_context makes use of a swapchain + */ + virtual bool handle_surface_changes(bool force_update = false); /** * @returns True if a valid swapchain exists in the RenderContext */ bool has_swapchain(); + /** + * @brief Prepares the RenderFrames for rendering + * @param thread_count The number of threads in the application, necessary to allocate this many resource pools for each RenderFrame + * @param create_render_target_func A function delegate, used to create a RenderTarget + */ + void prepare(size_t thread_count = 1, typename RenderTargetType::CreateFunc create_render_target_func = RenderTargetType::DEFAULT_CREATE_FUNC); + /** * @brief Recreates the RenderFrames, called after every update */ @@ -142,128 +199,811 @@ class RenderContext */ void recreate_swapchain(); - /** - * @brief Prepares the next available frame for rendering - * @param reset_mode How to reset the command buffer - * @returns A valid command buffer to record commands to be submitted - * Also ensures that there is an active frame if there is no existing active frame already - */ - CommandBuffer &begin(CommandBuffer::ResetMode reset_mode = CommandBuffer::ResetMode::ResetPool); + void release_owned_semaphore(SemaphoreType semaphore); + SemaphoreType request_semaphore(); + SemaphoreType request_semaphore_with_ownership(); /** * @brief Submits the command buffer to the right queue * @param command_buffer A command buffer containing recorded commands */ - void submit(CommandBuffer &command_buffer); + void submit(std::shared_ptr> command_buffer); /** * @brief Submits multiple command buffers to the right queue * @param command_buffers Command buffers containing recorded commands */ - void submit(const std::vector &command_buffers); + void submit(const std::vector>> &command_buffers); + + SemaphoreType submit(const QueueType &queue, + const std::vector>> &command_buffers, + SemaphoreType wait_semaphore, + PipelineStageFlagsType wait_pipeline_stage); /** - * @brief begin_frame + * @brief Submits a command buffer related to a frame to a queue */ - void begin_frame(); - - VkSemaphore submit(const Queue &queue, const std::vector &command_buffers, VkSemaphore wait_semaphore, VkPipelineStageFlags wait_pipeline_stage); + void submit(const QueueType &queue, const std::vector>> &command_buffers); /** - * @brief Submits a command buffer related to a frame to a queue + * @brief Updates the swapchains extent, if a swapchain exists + * @param extent The width and height of the new swapchain images */ - void submit(const Queue &queue, const std::vector &command_buffers); + void update_swapchain(const Extent2DType &extent); /** - * @brief Waits a frame to finish its rendering + * @brief Updates the swapchains image count, if a swapchain exists + * @param image_count The amount of images in the new swapchain */ - virtual void wait_frame(); + void update_swapchain(const uint32_t image_count); - void end_frame(VkSemaphore semaphore); + /** + * @brief Updates the swapchains image usage, if a swapchain exists + * @param image_usage_flags The usage flags the new swapchain images will have + */ + void update_swapchain(const std::set &image_usage_flags); /** - * @brief An error should be raised if the frame is not active. - * A frame is active after @ref begin_frame has been called. - * @return The current active frame + * @brief Updates the swapchains extent and surface transform, if a swapchain exists + * @param extent The width and height of the new swapchain images + * @param transform The surface transform flags */ - RenderFrame &get_active_frame(); + void update_swapchain(const Extent2DType &extent, const SurfaceTransformFlagBitsType transform); /** - * @brief An error should be raised if the frame is not active. - * A frame is active after @ref begin_frame has been called. - * @return The current active frame index + * @brief Updates the swapchain's compression settings, if a swapchain exists + * @param compression The compression to use for swapchain images (default, fixed-rate, none) + * @param compression_fixed_rate The rate to use, if compression is fixed-rate */ - uint32_t get_active_frame_index(); + void update_swapchain(const ImageCompressionFlagsType compression, const ImageCompressionFixedRateFlagsType compression_fixed_rate); /** - * @brief An error should be raised if a frame is active. - * A frame is active after @ref begin_frame has been called. - * @return The previous frame + * @brief Waits a frame to finish its rendering */ - RenderFrame &get_last_rendered_frame(); + virtual void wait_frame(); - VkSemaphore request_semaphore(); - VkSemaphore request_semaphore_with_ownership(); - void release_owned_semaphore(VkSemaphore semaphore); + private: + void initialize_swapchain(vk::SurfaceKHR surface, vk::PresentModeKHR present_movde, std::vector const &present_mode_priority_list, std::vector const &surface_format_priority_list); + void submit_impl(const std::vector> &command_buffers); + vk::Semaphore submit_impl(vkb::core::HPPQueue const &queue, + std::vector> const &command_buffers, + vk::Semaphore wait_semaphore, + vk::PipelineStageFlags wait_pipeline_stage); + void submit_impl(vkb::core::HPPQueue const &queue, std::vector> const &command_buffers); + void update_swapchain_impl(vk::Extent2D const &extent, vk::SurfaceTransformFlagBitsKHR transform); - Device &get_device(); + private: + vk::Semaphore acquired_semaphore; + uint32_t active_frame_index = 0; // Current active frame index + HPPRenderTarget::CreateFunc create_render_target_func = HPPRenderTarget::DEFAULT_CREATE_FUNC; + vkb::core::DeviceCpp &device; + bool frame_active = false; // Whether a frame is active or not + std::vector> frames; + vk::SurfaceTransformFlagBitsKHR pre_transform = vk::SurfaceTransformFlagBitsKHR::eIdentity; + bool prepared = false; + const vkb::core::HPPQueue &queue; // If swapchain exists, then this will be a present supported queue, else a graphics queue + vk::Extent2D surface_extent; + std::unique_ptr swapchain; + vkb::core::HPPSwapchainProperties swapchain_properties; + size_t thread_count = 1; + const vkb::Window &window; +}; - /** - * @brief Returns the format that the RenderTargets are created with within the RenderContext - */ - VkFormat get_format() const; +using RenderContextC = RenderContext; +using RenderContextCpp = RenderContext; + +// Member function definitions + +template <> +inline RenderContextCpp::RenderContext(vkb::core::DeviceCpp &device, + vk::SurfaceKHR surface, + const vkb::Window &window, + vk::PresentModeKHR present_mode, + std::vector const &present_mode_priority_list, + std::vector const &surface_format_priority_list) : + device(device), + window(window), + queue(device.get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0)), + surface_extent{window.get_extent().width, window.get_extent().height} +{ + initialize_swapchain(surface, present_mode, present_mode_priority_list, surface_format_priority_list); +} + +template <> +inline RenderContextC::RenderContext(vkb::core::DeviceC &device, + VkSurfaceKHR surface, + const Window &window, + VkPresentModeKHR present_mode, + const std::vector &present_mode_priority_list, + const std::vector &surface_format_priority_list) : + device(reinterpret_cast(device)), + window(window), + queue(reinterpret_cast(device.get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0))), + surface_extent{window.get_extent().width, window.get_extent().height} +{ + initialize_swapchain(static_cast(surface), + static_cast(present_mode), + reinterpret_cast const &>(present_mode_priority_list), + reinterpret_cast const &>(surface_format_priority_list)); +} + +template +inline void RenderContext::initialize_swapchain(vk::SurfaceKHR surface, + vk::PresentModeKHR present_mode, + std::vector const &present_mode_priority_list, + std::vector const &surface_format_priority_list) +{ + if (surface) + { + vk::SurfaceCapabilitiesKHR surface_properties = device.get_gpu().get_handle().getSurfaceCapabilitiesKHR(surface); + + if (surface_properties.currentExtent.width == 0xFFFFFFFF) + { + swapchain = + std::make_unique(device, surface, present_mode, present_mode_priority_list, surface_format_priority_list, surface_extent); + } + else + { + swapchain = std::make_unique(device, surface, present_mode, present_mode_priority_list, surface_format_priority_list); + } + } +} + +template +inline std::shared_ptr> RenderContext::begin(vkb::CommandBufferResetMode reset_mode) +{ + assert(prepared && "HPPRenderContext not prepared for rendering, call prepare()"); + + if (!frame_active) + { + begin_frame(); + } + + if (!acquired_semaphore) + { + throw std::runtime_error("Couldn't begin frame"); + } + + const auto &queue = device.get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return get_active_frame().get_command_pool(queue, reset_mode).request_command_buffer(); + } + else + { + return get_active_frame().get_command_pool(reinterpret_cast(queue), reset_mode).request_command_buffer(); + } +} + +template +inline void RenderContext::begin_frame() +{ + // Only handle surface changes if a swapchain exists + if (swapchain) + { + handle_surface_changes(); + } + + assert(!frame_active && "Frame is still active, please call end_frame"); + + auto &prev_frame = *frames[active_frame_index]; + + // We will use the acquired semaphore in a different frame context, + // so we need to hold ownership. + acquired_semaphore = prev_frame.get_semaphore_pool().request_semaphore_with_ownership(); + + if (swapchain) + { + vk::Result result; + try + { + std::tie(result, active_frame_index) = swapchain->acquire_next_image(acquired_semaphore); + } + catch (vk::OutOfDateKHRError & /*err*/) + { + result = vk::Result::eErrorOutOfDateKHR; + } + + if (result == vk::Result::eSuboptimalKHR || result == vk::Result::eErrorOutOfDateKHR) + { +#if defined(PLATFORM__MACOS) + // On Apple platforms, force swapchain update on both eSuboptimalKHR and eErrorOutOfDateKHR + // eSuboptimalKHR may occur on macOS/iOS following changes to swapchain other than extent/size + bool swapchain_updated = handle_surface_changes(true); +#else + bool swapchain_updated = handle_surface_changes(result == vk::Result::eErrorOutOfDateKHR); +#endif + + if (swapchain_updated) + { + // Need to destroy and reallocate acquired_semaphore since it may have already been signaled + device.get_handle().destroySemaphore(acquired_semaphore); + acquired_semaphore = prev_frame.get_semaphore_pool().request_semaphore_with_ownership(); + std::tie(result, active_frame_index) = swapchain->acquire_next_image(acquired_semaphore); + } + } + + if (result != vk::Result::eSuccess) + { + prev_frame.reset(); + return; + } + } + + // Now the frame is active again + frame_active = true; + + // Wait on all resource to be freed from the previous render to this frame + wait_frame(); +} + +template +inline typename RenderContext::SemaphoreType RenderContext::consume_acquired_semaphore() +{ + assert(frame_active && "Frame is not active, please call begin_frame"); + return std::exchange(acquired_semaphore, nullptr); +} + +template +inline void RenderContext::end_frame(SemaphoreType semaphore) +{ + assert(frame_active && "Frame is not active, please call begin_frame"); + + if (swapchain) + { + vk::SwapchainKHR vk_swapchain = swapchain->get_handle(); + vk::PresentInfoKHR present_info{.waitSemaphoreCount = 1, .swapchainCount = 1, .pSwapchains = &vk_swapchain, .pImageIndices = &active_frame_index}; + if constexpr (bindingType == BindingType::Cpp) + { + present_info.pWaitSemaphores = &semaphore; + } + else + { + present_info.pWaitSemaphores = reinterpret_cast(&semaphore); + } + + vk::DisplayPresentInfoKHR disp_present_info; + if (device.get_gpu().is_extension_supported(VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) && + window.get_display_present_info(reinterpret_cast(&disp_present_info), surface_extent.width, surface_extent.height)) + { + // Add display present info if supported and wanted + present_info.pNext = &disp_present_info; + } + + vk::Result result; + try + { + result = queue.present(present_info); + } + catch (vk::OutOfDateKHRError & /*err*/) + { + result = vk::Result::eErrorOutOfDateKHR; + } + + if (result == vk::Result::eSuboptimalKHR || result == vk::Result::eErrorOutOfDateKHR) + { + handle_surface_changes(); + } + } + + // Frame is not active anymore + if (acquired_semaphore) + { + release_owned_semaphore(acquired_semaphore); + acquired_semaphore = nullptr; + } + frame_active = false; +} + +template +inline vkb::rendering::RenderFrame &RenderContext::get_active_frame() +{ + assert(frame_active && "Frame is not active, please call begin_frame"); + if constexpr (bindingType == BindingType::Cpp) + { + return *frames[active_frame_index]; + } + else + { + return reinterpret_cast(*frames[active_frame_index]); + } +} + +template +inline uint32_t RenderContext::get_active_frame_index() const +{ + assert(frame_active && "Frame is not active, please call begin_frame"); + return active_frame_index; +} + +template +inline vkb::core::Device &RenderContext::get_device() +{ + if constexpr (bindingType == BindingType::Cpp) + { + return device; + } + else + { + return reinterpret_cast(device); + } +} + +template +inline typename RenderContext::FormatType RenderContext::get_format() const +{ + vk::Format format = swapchain ? swapchain->get_format() : DEFAULT_VK_FORMAT; + if constexpr (bindingType == BindingType::Cpp) + { + return format; + } + else + { + return static_cast(format); + } +} + +template +inline vkb::rendering::RenderFrame &RenderContext::get_last_rendered_frame() +{ + assert(!frame_active && "Frame is still active, please call end_frame"); + if constexpr (bindingType == BindingType::Cpp) + { + return *frames[active_frame_index]; + } + else + { + return reinterpret_cast(*frames[active_frame_index]); + } +} + +template +inline std::vector>> &RenderContext::get_render_frames() +{ + if constexpr (bindingType == BindingType::Cpp) + { + return frames; + } + else + { + return reinterpret_cast> &>(frames); + } +} + +template +inline typename RenderContext::Extent2DType const &RenderContext::get_surface_extent() const +{ + if constexpr (bindingType == BindingType::Cpp) + { + return surface_extent; + } + else + { + return *reinterpret_cast(&surface_extent); + } +} + +template +inline typename RenderContext::SwapchainType const &RenderContext::get_swapchain() const +{ + assert(swapchain && "Swapchain is not valid"); + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return *swapchain; + } + else + { + return reinterpret_cast(*swapchain); + } +} + +template +inline bool RenderContext::handle_surface_changes(bool force_update) +{ + if (!swapchain) + { + LOGW("Can't handle surface changes. No swapchain, offscreen rendering detected, skipping."); + return false; + } - Swapchain const &get_swapchain() const; + vk::SurfaceCapabilitiesKHR surface_properties = device.get_gpu().get_handle().getSurfaceCapabilitiesKHR(swapchain->get_surface()); - VkExtent2D const &get_surface_extent() const; + if (surface_properties.currentExtent.width == 0xFFFFFFFF) + { + return false; + } - uint32_t get_active_frame_index() const; + // Only recreate the swapchain if the dimensions have changed; + // handle_surface_changes() is called on VK_SUBOPTIMAL_KHR, + // which might not be due to a surface resize + if (surface_properties.currentExtent.width != surface_extent.width || surface_properties.currentExtent.height != surface_extent.height || force_update) + { + // Recreate swapchain + device.get_handle().waitIdle(); - std::vector> &get_render_frames(); + update_swapchain_impl(surface_properties.currentExtent, pre_transform); - /** - * @brief Handles surface changes, only applicable if the render_context makes use of a swapchain - */ - virtual bool handle_surface_changes(bool force_update = false); + surface_extent = surface_properties.currentExtent; - /** - * @brief Returns the WSI acquire semaphore. Only to be used in very special circumstances. - * @return The WSI acquire semaphore. - */ - VkSemaphore consume_acquired_semaphore(); + return true; + } - protected: - VkExtent2D surface_extent; + return false; +} - private: - Device &device; +template +inline bool RenderContext::has_swapchain() +{ + return swapchain != nullptr; +} + +template +inline void RenderContext::prepare(size_t thread_count, typename RenderTargetType::CreateFunc create_render_target_func_) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + create_render_target_func = create_render_target_func_; + } + else + { + create_render_target_func = *reinterpret_cast(&create_render_target_func_); + } + + device.get_handle().waitIdle(); + + if (swapchain) + { + surface_extent = swapchain->get_extent(); + + vk::Extent3D extent{surface_extent.width, surface_extent.height, 1}; + + for (auto &image_handle : swapchain->get_images()) + { + vkb::core::HPPImage swapchain_image{device, image_handle, extent, swapchain->get_format(), swapchain->get_usage()}; + auto render_target = create_render_target_func(std::move(swapchain_image)); + frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); + } + } + else + { + // Otherwise, create a single RenderFrame + swapchain = nullptr; + + auto color_image = vkb::core::HPPImage{device, + vk::Extent3D{surface_extent.width, surface_extent.height, 1}, + DEFAULT_VK_FORMAT, // We can use any format here that we like + vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc, + VMA_MEMORY_USAGE_GPU_ONLY}; + + std::unique_ptr render_target = create_render_target_func(std::move(color_image)); + frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); + } + + this->thread_count = thread_count; + this->prepared = true; +} + +template +inline void RenderContext::recreate() +{ + LOGI("Recreated swapchain"); + + vk::Extent2D swapchain_extent = swapchain->get_extent(); + vk::Extent3D extent{swapchain_extent.width, swapchain_extent.height, 1}; - const Window &window; + auto frame_it = frames.begin(); - /// If swapchain exists, then this will be a present supported queue, else a graphics queue - const Queue &queue; + for (auto &image_handle : swapchain->get_images()) + { + vkb::core::HPPImage swapchain_image{device, image_handle, extent, swapchain->get_format(), swapchain->get_usage()}; - std::unique_ptr swapchain; + auto render_target = create_render_target_func(std::move(swapchain_image)); - SwapchainProperties swapchain_properties; + if (frame_it != frames.end()) + { + (*frame_it)->update_render_target(std::move(render_target)); + } + else + { + // Create a new frame if the new swapchain has more images than current frames + frames.emplace_back(std::make_unique(device, std::move(render_target), thread_count)); + } - std::vector> frames; + ++frame_it; + } - VkSemaphore acquired_semaphore; + device.get_resource_cache().clear_framebuffers(); +} - bool prepared{false}; +template +inline void RenderContext::recreate_swapchain() +{ + device.get_handle().waitIdle(); + device.get_resource_cache().clear_framebuffers(); - /// Current active frame index - uint32_t active_frame_index{0}; + vk::Extent2D swapchain_extent = swapchain->get_extent(); + vk::Extent3D extent{swapchain_extent.width, swapchain_extent.height, 1}; - /// Whether a frame is active or not - bool frame_active{false}; + auto frame_it = frames.begin(); - RenderTarget::CreateFunc create_render_target_func = RenderTarget::DEFAULT_CREATE_FUNC; + for (auto &image_handle : swapchain->get_images()) + { + vkb::core::HPPImage swapchain_image{device, image_handle, extent, swapchain->get_format(), swapchain->get_usage()}; + auto render_target = create_render_target_func(std::move(swapchain_image)); + (*frame_it)->update_render_target(std::move(render_target)); - VkSurfaceTransformFlagBitsKHR pre_transform{VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR}; + ++frame_it; + } +} - size_t thread_count{1}; -}; +template +inline void RenderContext::release_owned_semaphore(SemaphoreType semaphore) +{ + get_active_frame().get_semaphore_pool().release_owned_semaphore(semaphore); +} + +template +inline typename RenderContext::SemaphoreType RenderContext::request_semaphore() +{ + return get_active_frame().get_semaphore_pool().request_semaphore(); +} + +template +inline typename RenderContext::SemaphoreType RenderContext::request_semaphore_with_ownership() +{ + return get_active_frame().get_semaphore_pool().request_semaphore_with_ownership(); +} + +template +inline void RenderContext::submit(std::shared_ptr> command_buffer) +{ + std::vector>> command_buffers(1, command_buffer); + submit(command_buffers); +} + +template +inline void RenderContext::submit(const std::vector>> &command_buffers) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + submit_impl(command_buffers); + } + else + { + submit_impl(reinterpret_cast> const &>(command_buffers)); + } +} + +template +inline void RenderContext::submit_impl(std::vector> const &command_buffers) +{ + assert(frame_active && "RenderContext is inactive, cannot submit command buffer. Please call begin()"); + + vk::Semaphore render_semaphore = nullptr; + + if (swapchain) + { + assert(acquired_semaphore && "We do not have acquired_semaphore, it was probably consumed?\n"); + render_semaphore = submit_impl(queue, command_buffers, acquired_semaphore, vk::PipelineStageFlagBits::eColorAttachmentOutput); + } + else + { + submit_impl(queue, command_buffers); + } + + end_frame(render_semaphore); +} + +template +inline typename RenderContext::SemaphoreType + RenderContext::submit(const QueueType &queue, + const std::vector>> &command_buffers, + SemaphoreType wait_semaphore, + PipelineStageFlagsType wait_pipeline_stage) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return submit_impl(queue, command_buffers, wait_semaphore, wait_pipeline_stage); + } + else + { + return static_cast(submit_impl(reinterpret_cast(queue), + reinterpret_cast> const &>(command_buffers), + static_cast(wait_semaphore), + static_cast(wait_pipeline_stage))); + } +} + +template +inline vk::Semaphore RenderContext::submit_impl(const vkb::core::HPPQueue &queue, + const std::vector> &command_buffers, + vk::Semaphore wait_semaphore, + vk::PipelineStageFlags wait_pipeline_stage) +{ + std::vector cmd_buf_handles(command_buffers.size(), nullptr); + std::ranges::transform(command_buffers, cmd_buf_handles.begin(), [](auto const &cmd_buf) { return cmd_buf->get_handle(); }); + + vkb::rendering::RenderFrameCpp &frame = *frames[active_frame_index]; + + vk::Semaphore signal_semaphore = frame.get_semaphore_pool().request_semaphore(); + + vk::SubmitInfo submit_info{.commandBufferCount = to_u32(cmd_buf_handles.size()), + .pCommandBuffers = cmd_buf_handles.data(), + .signalSemaphoreCount = 1, + .pSignalSemaphores = &signal_semaphore}; + + if (wait_semaphore != nullptr) + { + submit_info.waitSemaphoreCount = 1; + submit_info.pWaitSemaphores = &wait_semaphore; + submit_info.pWaitDstStageMask = &wait_pipeline_stage; + } + + vk::Fence fence = frame.get_fence_pool().request_fence(); + + queue.get_handle().submit(submit_info, fence); + + return signal_semaphore; +} + +template +inline void RenderContext::submit(const QueueType &queue, + const std::vector>> &command_buffers) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + submit_impl(queue, command_buffers); + } + else + { + submit_impl(reinterpret_cast(queue), + reinterpret_cast> const &>(command_buffers)); + } +} + +template +inline void RenderContext::submit_impl(vkb::core::HPPQueue const &queue, + const std::vector> &command_buffers) +{ + std::vector cmd_buf_handles(command_buffers.size(), nullptr); + std::ranges::transform(command_buffers, cmd_buf_handles.begin(), [](auto const &cmd_buf) { return cmd_buf->get_handle(); }); + + vk::SubmitInfo submit_info{.commandBufferCount = to_u32(cmd_buf_handles.size()), .pCommandBuffers = cmd_buf_handles.data()}; + + vk::Fence fence = frames[active_frame_index]->get_fence_pool().request_fence(); + + queue.get_handle().submit(submit_info, fence); +} + +template +inline void RenderContext::update_swapchain(const Extent2DType &extent) +{ + if (!swapchain) + { + LOGW("Can't update the swapchains extent. No swapchain, offscreen rendering detected, skipping."); + return; + } + + device.get_resource_cache().clear_framebuffers(); + + swapchain = std::make_unique(*swapchain, extent); + + recreate(); +} + +template +inline void RenderContext::update_swapchain(const uint32_t image_count) +{ + if (!swapchain) + { + LOGW("Can't update the swapchains image count. No swapchain, offscreen rendering detected, skipping."); + return; + } + + device.get_resource_cache().clear_framebuffers(); + + device.get_handle().waitIdle(); + + swapchain = std::make_unique(*swapchain, image_count); + + recreate(); +} + +template +inline void RenderContext::update_swapchain(const std::set &image_usage_flags) +{ + if (!swapchain) + { + LOGW("Can't update the swapchains image usage. No swapchain, offscreen rendering detected, skipping."); + return; + } + + device.get_resource_cache().clear_framebuffers(); + + if constexpr (bindingType == vkb::BindingType::Cpp) + { + swapchain = std::make_unique(*swapchain, image_usage_flags); + } + else + { + swapchain = std::make_unique(reinterpret_cast(*swapchain), + reinterpret_cast const &>(image_usage_flags)); + } + + recreate(); +} + +template +inline void RenderContext::update_swapchain(const Extent2DType &extent, const SurfaceTransformFlagBitsType transform) +{ + if constexpr (bindingType == BindingType::Cpp) + { + update_swapchain_impl(extent, transform); + } + else + { + update_swapchain_impl(reinterpret_cast(extent), static_cast(transform)); + } +} + +template +inline void RenderContext::update_swapchain_impl(vk::Extent2D const &extent, vk::SurfaceTransformFlagBitsKHR transform) +{ + if (!swapchain) + { + LOGW("Can't update the swapchains extent and surface transform. No swapchain, offscreen rendering detected, skipping."); + return; + } + + device.get_resource_cache().clear_framebuffers(); + + auto width = extent.width; + auto height = extent.height; + if (transform == vk::SurfaceTransformFlagBitsKHR::eRotate90 || transform == vk::SurfaceTransformFlagBitsKHR::eRotate270) + { + // Pre-rotation: always use native orientation i.e. if rotated, use width and height of identity transform + std::swap(width, height); + } + + swapchain = std::make_unique(*swapchain, vk::Extent2D{width, height}, transform); + + // Save the preTransform attribute for future rotations + pre_transform = transform; + + recreate(); +} + +template +inline void RenderContext::update_swapchain(const ImageCompressionFlagsType compression, + const ImageCompressionFixedRateFlagsType compression_fixed_rate) +{ + if (!swapchain) + { + LOGW("Can't update the swapchains compression. No swapchain, offscreen rendering detected, skipping."); + return; + } + + device.get_resource_cache().clear_framebuffers(); + + if constexpr (bindingType == vkb::BindingType::Cpp) + { + swapchain = std::make_unique(*swapchain, compression, compression_fixed_rate); + } + else + { + swapchain = std::make_unique(reinterpret_cast(*swapchain), + static_cast(compression), + static_cast(compression_fixed_rate)); + } + + recreate(); +} + +template +inline void RenderContext::wait_frame() +{ + get_active_frame().reset(); +} +} // namespace rendering } // namespace vkb diff --git a/framework/rendering/render_frame.cpp b/framework/rendering/render_frame.cpp deleted file mode 100644 index cd1523bfc1..0000000000 --- a/framework/rendering/render_frame.cpp +++ /dev/null @@ -1,301 +0,0 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "render_frame.h" - -#include "common/utils.h" -#include "core/util/logging.hpp" - -namespace vkb -{ -RenderFrame::RenderFrame(Device &device, std::unique_ptr &&render_target, size_t thread_count) : - device{device}, - fence_pool{device}, - semaphore_pool{device}, - swapchain_render_target{std::move(render_target)}, - thread_count{thread_count} -{ - for (auto &usage_it : supported_usage_map) - { - std::vector> usage_buffer_pools; - for (size_t i = 0; i < thread_count; ++i) - { - usage_buffer_pools.push_back(std::make_pair(BufferPoolC{device, BUFFER_POOL_BLOCK_SIZE * 1024 * usage_it.second, usage_it.first}, nullptr)); - } - - auto res_ins_it = buffer_pools.emplace(usage_it.first, std::move(usage_buffer_pools)); - - if (!res_ins_it.second) - { - throw std::runtime_error("Failed to insert buffer pool"); - } - } - - for (size_t i = 0; i < thread_count; ++i) - { - descriptor_pools.push_back(std::make_unique>()); - descriptor_sets.push_back(std::make_unique>()); - } -} - -Device &RenderFrame::get_device() -{ - return device; -} - -void RenderFrame::update_render_target(std::unique_ptr &&render_target) -{ - swapchain_render_target = std::move(render_target); -} - -void RenderFrame::reset() -{ - VK_CHECK(fence_pool.wait()); - - fence_pool.reset(); - - for (auto &command_pools_per_queue : command_pools) - { - for (auto &command_pool : command_pools_per_queue.second) - { - command_pool->reset_pool(); - } - } - - for (auto &buffer_pools_per_usage : buffer_pools) - { - for (auto &buffer_pool : buffer_pools_per_usage.second) - { - buffer_pool.first.reset(); - buffer_pool.second = nullptr; - } - } - - semaphore_pool.reset(); - - if (descriptor_management_strategy == vkb::DescriptorManagementStrategy::CreateDirectly) - { - clear_descriptors(); - } -} - -std::vector> &RenderFrame::get_command_pools(const Queue &queue, CommandBuffer::ResetMode reset_mode) -{ - auto command_pool_it = command_pools.find(queue.get_family_index()); - - if (command_pool_it != command_pools.end()) - { - assert(!command_pool_it->second.empty()); - if (command_pool_it->second[0]->get_reset_mode() != reset_mode) - { - device.wait_idle(); - - // Delete pools - command_pools.erase(command_pool_it); - } - else - { - return command_pool_it->second; - } - } - - std::vector> queue_command_pools; - for (size_t i = 0; i < thread_count; i++) - { - queue_command_pools.push_back(std::make_unique(device, queue.get_family_index(), this, i, reset_mode)); - } - - auto res_ins_it = command_pools.emplace(queue.get_family_index(), std::move(queue_command_pools)); - - if (!res_ins_it.second) - { - throw std::runtime_error("Failed to insert command pool"); - } - - command_pool_it = res_ins_it.first; - - return command_pool_it->second; -} - -std::vector RenderFrame::collect_bindings_to_update(const DescriptorSetLayout &descriptor_set_layout, const BindingMap &buffer_infos, const BindingMap &image_infos) -{ - std::vector bindings_to_update; - - bindings_to_update.reserve(buffer_infos.size() + image_infos.size()); - auto aggregate_binding_to_update = [&bindings_to_update, &descriptor_set_layout](const auto &infos_map) { - for (const auto &pair : infos_map) - { - uint32_t binding_index = pair.first; - if (!(descriptor_set_layout.get_layout_binding_flag(binding_index) & VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT) && - std::find(bindings_to_update.begin(), bindings_to_update.end(), binding_index) == bindings_to_update.end()) - { - bindings_to_update.push_back(binding_index); - } - } - }; - aggregate_binding_to_update(buffer_infos); - aggregate_binding_to_update(image_infos); - - return bindings_to_update; -} - -const FencePool &RenderFrame::get_fence_pool() const -{ - return fence_pool; -} - -VkFence RenderFrame::request_fence() -{ - return fence_pool.request_fence(); -} - -const SemaphorePool &RenderFrame::get_semaphore_pool() const -{ - return semaphore_pool; -} - -VkSemaphore RenderFrame::request_semaphore() -{ - return semaphore_pool.request_semaphore(); -} - -VkSemaphore RenderFrame::request_semaphore_with_ownership() -{ - return semaphore_pool.request_semaphore_with_ownership(); -} - -void RenderFrame::release_owned_semaphore(VkSemaphore semaphore) -{ - semaphore_pool.release_owned_semaphore(semaphore); -} - -RenderTarget &RenderFrame::get_render_target() -{ - return *swapchain_render_target; -} - -const RenderTarget &RenderFrame::get_render_target_const() const -{ - return *swapchain_render_target; -} - -CommandBuffer &RenderFrame::request_command_buffer(const Queue &queue, CommandBuffer::ResetMode reset_mode, VkCommandBufferLevel level, size_t thread_index) -{ - assert(thread_index < thread_count && "Thread index is out of bounds"); - - auto &command_pools = get_command_pools(queue, reset_mode); - - auto command_pool_it = std::find_if(command_pools.begin(), command_pools.end(), [&thread_index](std::unique_ptr &cmd_pool) { return cmd_pool->get_thread_index() == thread_index; }); - - return (*command_pool_it)->request_command_buffer(level); -} - -VkDescriptorSet RenderFrame::request_descriptor_set(const DescriptorSetLayout &descriptor_set_layout, const BindingMap &buffer_infos, const BindingMap &image_infos, bool update_after_bind, size_t thread_index) -{ - assert(thread_index < thread_count && "Thread index is out of bounds"); - - assert(thread_index < descriptor_pools.size()); - auto &descriptor_pool = request_resource(device, nullptr, *descriptor_pools[thread_index], descriptor_set_layout); - if (descriptor_management_strategy == DescriptorManagementStrategy::StoreInCache) - { - // The bindings we want to update before binding, if empty we update all bindings - std::vector bindings_to_update; - // If update after bind is enabled, we store the binding index of each binding that need to be updated before being bound - if (update_after_bind) - { - bindings_to_update = collect_bindings_to_update(descriptor_set_layout, buffer_infos, image_infos); - } - - // Request a descriptor set from the render frame, and write the buffer infos and image infos of all the specified bindings - assert(thread_index < descriptor_sets.size()); - auto &descriptor_set = request_resource(device, nullptr, *descriptor_sets[thread_index], descriptor_set_layout, descriptor_pool, buffer_infos, image_infos); - descriptor_set.update(bindings_to_update); - return descriptor_set.get_handle(); - } - else - { - // Request a descriptor pool, allocate a descriptor set, write buffer and image data to it - DescriptorSet descriptor_set{device, descriptor_set_layout, descriptor_pool, buffer_infos, image_infos}; - descriptor_set.apply_writes(); - return descriptor_set.get_handle(); - } -} - -void RenderFrame::update_descriptor_sets(size_t thread_index) -{ - assert(thread_index < descriptor_sets.size()); - auto &thread_descriptor_sets = *descriptor_sets[thread_index]; - for (auto &descriptor_set_it : thread_descriptor_sets) - { - descriptor_set_it.second.update(); - } -} - -void RenderFrame::clear_descriptors() -{ - for (auto &desc_sets_per_thread : descriptor_sets) - { - desc_sets_per_thread->clear(); - } - - for (auto &desc_pools_per_thread : descriptor_pools) - { - for (auto &desc_pool : *desc_pools_per_thread) - { - desc_pool.second.reset(); - } - } -} - -void RenderFrame::set_buffer_allocation_strategy(BufferAllocationStrategy new_strategy) -{ - buffer_allocation_strategy = new_strategy; -} - -void RenderFrame::set_descriptor_management_strategy(DescriptorManagementStrategy new_strategy) -{ - descriptor_management_strategy = new_strategy; -} - -BufferAllocationC RenderFrame::allocate_buffer(const VkBufferUsageFlags usage, const VkDeviceSize size, size_t thread_index) -{ - assert(thread_index < thread_count && "Thread index is out of bounds"); - - // Find a pool for this usage - auto buffer_pool_it = buffer_pools.find(usage); - if (buffer_pool_it == buffer_pools.end()) - { - LOGE("No buffer pool for buffer usage {}", usage); - return BufferAllocationC{}; - } - - assert(thread_index < buffer_pool_it->second.size()); - auto &buffer_pool = buffer_pool_it->second[thread_index].first; - auto &buffer_block = buffer_pool_it->second[thread_index].second; - - bool want_minimal_block = buffer_allocation_strategy == BufferAllocationStrategy::OneAllocationPerBuffer; - - if (want_minimal_block || !buffer_block || !buffer_block->can_allocate(size)) - { - // If we are creating a buffer for each allocation of there is no block associated with the pool or the current block is too small - // for this allocation, request a new buffer block - buffer_block = &buffer_pool.request_buffer_block(size, want_minimal_block); - } - - return buffer_block->allocate(to_u32(size)); -} -} // namespace vkb diff --git a/framework/rendering/render_frame.h b/framework/rendering/render_frame.h index 31ecf5966f..06264238fb 100644 --- a/framework/rendering/render_frame.h +++ b/framework/rendering/render_frame.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,22 +18,16 @@ #pragma once #include "buffer_pool.h" -#include "common/helpers.h" -#include "common/resource_caching.h" -#include "common/vk_common.h" -#include "core/buffer.h" -#include "core/command_buffer.h" +#include "common/hpp_resource_caching.h" #include "core/command_pool.h" -#include "core/device.h" -#include "core/image.h" -#include "core/query_pool.h" +#include "core/hpp_queue.h" #include "core/queue.h" -#include "fence_pool.h" -#include "rendering/render_target.h" -#include "semaphore_pool.h" +#include "hpp_semaphore_pool.h" namespace vkb { +namespace rendering +{ enum BufferAllocationStrategy { OneAllocationPerBuffer, @@ -59,77 +53,66 @@ enum DescriptorManagementStrategy * the whole context must be destroyed. This is because each RenderFrame holds Vulkan objects * such as the swapchain image. */ +template class RenderFrame { public: - /** - * @brief Block size of a buffer pool in kilobytes - */ - static constexpr uint32_t BUFFER_POOL_BLOCK_SIZE = 256; - - // A map of the supported usages to a multiplier for the BUFFER_POOL_BLOCK_SIZE - const std::unordered_map supported_usage_map = { - {VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, 1}, - {VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, 2}, // x2 the size of BUFFER_POOL_BLOCK_SIZE since SSBOs are normally much larger than other types of buffers - {VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, 1}, - {VK_BUFFER_USAGE_INDEX_BUFFER_BIT, 1}}; - - RenderFrame(Device &device, std::unique_ptr &&render_target, size_t thread_count = 1); - - RenderFrame(const RenderFrame &) = delete; - - RenderFrame(RenderFrame &&) = delete; + using BufferUsageFlagsType = typename std::conditional::type; + using CommandBufferLevelType = typename std::conditional::type; + using DescriptorBufferInfoType = typename std::conditional::type; + using DescriptorImageInfoType = typename std::conditional::type; + using DescriptorSetType = typename std::conditional::type; + using DeviceSizeType = typename std::conditional::type; + using FenceType = typename std::conditional::type; + using SemaphoreType = typename std::conditional::type; + + using DescriptorSetLayoutType = typename std::conditional::type; + using FencePoolType = typename std::conditional::type; + using QueueType = typename std::conditional::type; + using RenderTargetType = typename std::conditional::type; + using SemaphorePoolType = typename std::conditional::type; - RenderFrame &operator=(const RenderFrame &) = delete; - - RenderFrame &operator=(RenderFrame &&) = delete; - - void reset(); - - Device &get_device(); - - const FencePool &get_fence_pool() const; - - VkFence request_fence(); - - const SemaphorePool &get_semaphore_pool() const; - - VkSemaphore request_semaphore(); - VkSemaphore request_semaphore_with_ownership(); - void release_owned_semaphore(VkSemaphore semaphore); + public: + RenderFrame(vkb::core::Device &device, std::unique_ptr &&render_target, size_t thread_count = 1); + RenderFrame(RenderFrame const &) = delete; + RenderFrame(RenderFrame &&) = default; + RenderFrame &operator=(RenderFrame const &) = delete; + RenderFrame &operator=(RenderFrame &&) = default; /** - * @brief Called when the swapchain changes - * @param render_target A new render target with updated images + * @param usage Usage of the buffer + * @param size Amount of memory required + * @param thread_index Index of the buffer pool to be used by the current thread + * @return The requested allocation, it may be empty */ - void update_render_target(std::unique_ptr &&render_target); + vkb::BufferAllocation allocate_buffer(BufferUsageFlagsType usage, DeviceSizeType size, size_t thread_index = 0); - RenderTarget &get_render_target(); - - const RenderTarget &get_render_target_const() const; + void clear_descriptors(); /** - * @brief Requests a command buffer to the command pool of the active frame + * @brief Get the command pool of the active frame * A frame should be active at the moment of requesting it * @param queue The queue command buffers will be submitted on - * @param reset_mode Indicate how the command buffer will be used, may trigger a - * pool re-creation to set necessary flags - * @param level Command buffer level, either primary or secondary + * @param reset_mode Indicate how the command buffer will be used, may trigger a pool re-creation to set necessary flags * @param thread_index Selects the thread's command pool used to manage the buffer - * @return A command buffer related to the current active frame + * @return The command pool related to the current active frame */ - CommandBuffer &request_command_buffer(const Queue & queue, - CommandBuffer::ResetMode reset_mode = CommandBuffer::ResetMode::ResetPool, - VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - size_t thread_index = 0); - - VkDescriptorSet request_descriptor_set(const DescriptorSetLayout & descriptor_set_layout, - const BindingMap &buffer_infos, - const BindingMap & image_infos, - bool update_after_bind, - size_t thread_index = 0); - - void clear_descriptors(); + vkb::core::CommandPool &get_command_pool( + QueueType const &queue, vkb::CommandBufferResetMode reset_mode = vkb::CommandBufferResetMode::ResetPool, size_t thread_index = 0); + + vkb::core::Device &get_device(); + FencePoolType &get_fence_pool(); + FencePoolType const &get_fence_pool() const; + RenderTargetType &get_render_target(); + RenderTargetType const &get_render_target() const; + SemaphorePoolType &get_semaphore_pool(); + SemaphorePoolType const &get_semaphore_pool() const; + DescriptorSetType request_descriptor_set(DescriptorSetLayoutType const &descriptor_set_layout, + BindingMap const &buffer_infos, + BindingMap const &image_infos, + bool update_after_bind, + size_t thread_index = 0); + void reset(); /** * @brief Sets a new buffer allocation strategy @@ -144,20 +127,19 @@ class RenderFrame void set_descriptor_management_strategy(DescriptorManagementStrategy new_strategy); /** - * @param usage Usage of the buffer - * @param size Amount of memory required - * @param thread_index Index of the buffer pool to be used by the current thread - * @return The requested allocation, it may be empty + * @brief Updates all the descriptor sets in the current frame at a specific thread index */ - BufferAllocationC allocate_buffer(VkBufferUsageFlags usage, VkDeviceSize size, size_t thread_index = 0); + void update_descriptor_sets(size_t thread_index = 0); /** - * @brief Updates all the descriptor sets in the current frame at a specific thread index + * @brief Called when the swapchain changes + * @param render_target A new render target with updated images */ - void update_descriptor_sets(size_t thread_index = 0); + void update_render_target(std::unique_ptr &&render_target); private: - Device &device; + vkb::BufferAllocationCpp allocate_buffer_impl(vk::BufferUsageFlags usage, vk::DeviceSize size, size_t thread_index); + vkb::core::CommandPoolCpp &get_command_pool_impl(vkb::core::HPPQueue const &queue, vkb::CommandBufferResetMode reset_mode, size_t thread_index); /** * @brief Retrieve the frame's command pool(s) @@ -166,30 +148,416 @@ class RenderFrame * may trigger a pool re-creation to set necessary flags * @return The frame's command pool(s) */ - std::vector> &get_command_pools(const Queue &queue, CommandBuffer::ResetMode reset_mode); + std::vector &get_command_pools(const vkb::core::HPPQueue &queue, vkb::CommandBufferResetMode reset_mode); - /// Commands pools associated to the frame - std::map>> command_pools; + vk::DescriptorSet request_descriptor_set_impl(vkb::core::HPPDescriptorSetLayout const &descriptor_set_layout, + BindingMap const &buffer_infos, + BindingMap const &image_infos, + bool update_after_bind, + size_t thread_index = 0); - /// Descriptor pools for the frame - std::vector>> descriptor_pools; + private: + vkb::core::DeviceCpp &device; + std::map>> buffer_pools; + std::map> command_pools; // Commands pools per queue family index + std::vector> descriptor_pools; // Descriptor pools per thread + std::vector> descriptor_sets; // Descriptor sets per thread + vkb::HPPFencePool fence_pool; + vkb::HPPSemaphorePool semaphore_pool; + std::unique_ptr swapchain_render_target; + size_t thread_count; + BufferAllocationStrategy buffer_allocation_strategy = BufferAllocationStrategy::MultipleAllocationsPerBuffer; + DescriptorManagementStrategy descriptor_management_strategy = DescriptorManagementStrategy::StoreInCache; +}; - /// Descriptor sets for the frame - std::vector>> descriptor_sets; +using RenderFrameC = RenderFrame; +using RenderFrameCpp = RenderFrame; - FencePool fence_pool; +template +inline RenderFrame::RenderFrame(vkb::core::Device &device_, + std::unique_ptr &&render_target, + size_t thread_count) : + device(reinterpret_cast(device_)), fence_pool{device}, semaphore_pool{device}, thread_count{thread_count}, descriptor_pools(thread_count), descriptor_sets(thread_count) +{ + static constexpr uint32_t BUFFER_POOL_BLOCK_SIZE = 256; // Block size of a buffer pool in kilobytes - SemaphorePool semaphore_pool; + // A map of the supported usages to a multiplier for the BUFFER_POOL_BLOCK_SIZE + static const std::unordered_map supported_usage_map = { + {vk::BufferUsageFlagBits::eUniformBuffer, 1}, + {vk::BufferUsageFlagBits::eStorageBuffer, 2}, // x2 the size of BUFFER_POOL_BLOCK_SIZE since SSBOs are normally much larger than other types of buffers + {vk::BufferUsageFlagBits::eVertexBuffer, 1}, + {vk::BufferUsageFlagBits::eIndexBuffer, 1}}; + + update_render_target(std::move(render_target)); + for (auto &usage_it : supported_usage_map) + { + auto [buffer_pools_it, inserted] = buffer_pools.emplace(usage_it.first, std::vector>{}); + if (!inserted) + { + throw std::runtime_error("Failed to insert buffer pool"); + } + + for (size_t i = 0; i < thread_count; ++i) + { + buffer_pools_it->second.push_back( + std::make_pair(vkb::BufferPoolCpp{device, BUFFER_POOL_BLOCK_SIZE * 1024 * usage_it.second, usage_it.first}, nullptr)); + } + } +} + +template +inline BufferAllocation RenderFrame::allocate_buffer(BufferUsageFlagsType usage, DeviceSizeType size, size_t thread_index) +{ + assert(thread_index < thread_count && "Thread index is out of bounds"); + + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return allocate_buffer_impl(usage, size, thread_index); + } + else + { + vkb::BufferAllocationCpp buffer_allocation = + allocate_buffer_impl(static_cast(usage), static_cast(size), thread_index); + return *reinterpret_cast(&buffer_allocation); + } +} + +template +inline vkb::BufferAllocationCpp RenderFrame::allocate_buffer_impl(vk::BufferUsageFlags usage, vk::DeviceSize size, size_t thread_index) +{ + // Find a pool for this usage + auto buffer_pool_it = buffer_pools.find(usage); + if (buffer_pool_it == buffer_pools.end()) + { + LOGE("No buffer pool for buffer usage {} ", vk::to_string(usage)); + return vkb::BufferAllocationCpp{}; + } + + assert(thread_index < buffer_pool_it->second.size()); + auto &buffer_pool = buffer_pool_it->second[thread_index].first; + auto &buffer_block = buffer_pool_it->second[thread_index].second; + + bool want_minimal_block = (buffer_allocation_strategy == BufferAllocationStrategy::OneAllocationPerBuffer); + + if (want_minimal_block || !buffer_block || !buffer_block->can_allocate(size)) + { + // If we are creating a buffer for each allocation of there is no block associated with the pool or the current block is too small + // for this allocation, request a new buffer block + buffer_block = &buffer_pool.request_buffer_block(size, want_minimal_block); + } + + return buffer_block->allocate(to_u32(size)); +} + +template +inline void RenderFrame::clear_descriptors() +{ + for (auto &desc_sets_per_thread : descriptor_sets) + { + desc_sets_per_thread.clear(); + } + + for (auto &desc_pools_per_thread : descriptor_pools) + { + for (auto &desc_pool : desc_pools_per_thread) + { + desc_pool.second.reset(); + } + } +} + +template +inline std::vector &RenderFrame::get_command_pools(const vkb::core::HPPQueue &queue, + vkb::CommandBufferResetMode reset_mode) +{ + auto command_pool_it = command_pools.find(queue.get_family_index()); + + if (command_pool_it != command_pools.end()) + { + assert(!command_pool_it->second.empty()); + if (command_pool_it->second[0].get_reset_mode() != reset_mode) + { + device.get_handle().waitIdle(); + + // Delete pools + command_pools.erase(command_pool_it); + } + else + { + return command_pool_it->second; + } + } + + bool inserted = false; + std::tie(command_pool_it, inserted) = command_pools.emplace(queue.get_family_index(), std::vector{}); + if (!inserted) + { + throw std::runtime_error("Failed to insert command pool"); + } + + for (size_t i = 0; i < thread_count; i++) + { + command_pool_it->second.emplace_back(device, queue.get_family_index(), reinterpret_cast(this), i, reset_mode); + } + + return command_pool_it->second; +} + +template +inline vkb::core::CommandPool & + RenderFrame::get_command_pool(QueueType const &queue, vkb::CommandBufferResetMode reset_mode, size_t thread_index) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return get_command_pool_impl(queue, reset_mode, thread_index); + } + else + { + return reinterpret_cast( + get_command_pool_impl(reinterpret_cast(queue), reset_mode, thread_index)); + } +} + +template +inline vkb::core::CommandPoolCpp & + RenderFrame::get_command_pool_impl(vkb::core::HPPQueue const &queue, vkb::CommandBufferResetMode reset_mode, size_t thread_index) +{ + assert(thread_index < thread_count && "Thread index is out of bounds"); - size_t thread_count; + auto &command_pools = get_command_pools(queue, reset_mode); - std::unique_ptr swapchain_render_target; + auto command_pool_it = std::ranges::find_if( + command_pools, [&thread_index](vkb::core::CommandPoolCpp &cmd_pool) { return cmd_pool.get_thread_index() == thread_index; }); + assert(command_pool_it != command_pools.end()); - BufferAllocationStrategy buffer_allocation_strategy{BufferAllocationStrategy::MultipleAllocationsPerBuffer}; - DescriptorManagementStrategy descriptor_management_strategy{DescriptorManagementStrategy::StoreInCache}; + return *command_pool_it; +} - std::map>> buffer_pools; +template +inline typename vkb::core::Device &RenderFrame::get_device() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return device; + } + else + { + return reinterpret_cast(device); + } +} + +template +inline typename RenderFrame::FencePoolType &RenderFrame::get_fence_pool() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return fence_pool; + } + else + { + return reinterpret_cast(fence_pool); + } +} + +template +inline typename RenderFrame::FencePoolType const &RenderFrame::get_fence_pool() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return fence_pool; + } + else + { + return reinterpret_cast(fence_pool); + } +} + +template +inline typename RenderFrame::RenderTargetType &RenderFrame::get_render_target() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return *swapchain_render_target; + } + else + { + return reinterpret_cast(*swapchain_render_target); + } +} + +template +inline typename RenderFrame::RenderTargetType const &RenderFrame::get_render_target() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return *swapchain_render_target; + } + else + { + return reinterpret_cast(*swapchain_render_target); + } +} + +template +inline typename RenderFrame::SemaphorePoolType &RenderFrame::get_semaphore_pool() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return semaphore_pool; + } + else + { + return reinterpret_cast(semaphore_pool); + } +} + +template +inline typename RenderFrame::SemaphorePoolType const &RenderFrame::get_semaphore_pool() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return semaphore_pool; + } + else + { + return reinterpret_cast(semaphore_pool); + } +} + +template +inline typename RenderFrame::DescriptorSetType RenderFrame::request_descriptor_set(DescriptorSetLayoutType const &descriptor_set_layout, + BindingMap const &buffer_infos, + BindingMap const &image_infos, + bool update_after_bind, + size_t thread_index) +{ + assert(thread_index < thread_count && "Thread index is out of bounds"); + assert(thread_index < descriptor_pools.size()); + + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return request_descriptor_set_impl(descriptor_set_layout, buffer_infos, image_infos, update_after_bind, thread_index); + } + else + { + return static_cast(request_descriptor_set_impl(reinterpret_cast(descriptor_set_layout), + reinterpret_cast const &>(buffer_infos), + reinterpret_cast const &>(image_infos), + update_after_bind, + thread_index)); + } +} + +template +inline vk::DescriptorSet RenderFrame::request_descriptor_set_impl(vkb::core::HPPDescriptorSetLayout const &descriptor_set_layout, + BindingMap const &buffer_infos, + BindingMap const &image_infos, + bool update_after_bind, + size_t thread_index) +{ + auto &descriptor_pool = vkb::common::request_resource(device, nullptr, descriptor_pools[thread_index], descriptor_set_layout); + if (descriptor_management_strategy == DescriptorManagementStrategy::StoreInCache) + { + // The bindings we want to update before binding, if empty we update all bindings + std::set bindings_to_update; + // If update after bind is enabled, we store the binding index of each binding that need to be updated before being bound + if (update_after_bind) + { + auto aggregate_binding_to_update = [&bindings_to_update, &descriptor_set_layout](const auto &infos_map) { + for (const auto &[binding_index, ignored] : infos_map) + { + if (!(descriptor_set_layout.get_layout_binding_flag(binding_index) & vk::DescriptorBindingFlagBits::eUpdateAfterBind)) + { + bindings_to_update.insert(binding_index); + } + } + }; + aggregate_binding_to_update(buffer_infos); + aggregate_binding_to_update(image_infos); + } + + // Request a descriptor set from the render frame, and write the buffer infos and image infos of all the specified bindings + assert(thread_index < descriptor_sets.size()); + auto &descriptor_set = + vkb::common::request_resource(device, nullptr, descriptor_sets[thread_index], descriptor_set_layout, descriptor_pool, buffer_infos, image_infos); + descriptor_set.update({bindings_to_update.begin(), bindings_to_update.end()}); + return descriptor_set.get_handle(); + } + else + { + // Request a descriptor pool, allocate a descriptor set, write buffer and image data to it + vkb::core::HPPDescriptorSet descriptor_set{device, descriptor_set_layout, descriptor_pool, buffer_infos, image_infos}; + descriptor_set.apply_writes(); + return descriptor_set.get_handle(); + } +} + +template +inline void RenderFrame::reset() +{ + VK_CHECK(fence_pool.wait()); + + fence_pool.reset(); + + for (auto &command_pools_per_queue : command_pools) + { + for (auto &command_pool : command_pools_per_queue.second) + { + command_pool.reset_pool(); + } + } + + for (auto &buffer_pools_per_usage : buffer_pools) + { + for (auto &buffer_pool : buffer_pools_per_usage.second) + { + buffer_pool.first.reset(); + buffer_pool.second = nullptr; + } + } + + semaphore_pool.reset(); + + if (descriptor_management_strategy == DescriptorManagementStrategy::CreateDirectly) + { + clear_descriptors(); + } +} + +template +inline void RenderFrame::set_buffer_allocation_strategy(BufferAllocationStrategy new_strategy) +{ + buffer_allocation_strategy = new_strategy; +} - static std::vector collect_bindings_to_update(const DescriptorSetLayout &descriptor_set_layout, const BindingMap &buffer_infos, const BindingMap &image_infos); -}; -} // namespace vkb +template +inline void RenderFrame::set_descriptor_management_strategy(DescriptorManagementStrategy new_strategy) +{ + descriptor_management_strategy = new_strategy; +} + +template +inline void RenderFrame::update_descriptor_sets(size_t thread_index) +{ + assert(thread_index < descriptor_sets.size()); + auto &thread_descriptor_sets = descriptor_sets[thread_index]; + for (auto &descriptor_set_it : thread_descriptor_sets) + { + descriptor_set_it.second.update(); + } +} + +template +inline void RenderFrame::update_render_target(std::unique_ptr &&render_target) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + swapchain_render_target = std::move(render_target); + } + else + { + swapchain_render_target.reset(reinterpret_cast(render_target.release())); + } +} +} // namespace rendering +} // namespace vkb \ No newline at end of file diff --git a/framework/rendering/render_pipeline.cpp b/framework/rendering/render_pipeline.cpp index 95cba5fcbf..661f81c944 100644 --- a/framework/rendering/render_pipeline.cpp +++ b/framework/rendering/render_pipeline.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,7 +16,7 @@ */ #include "render_pipeline.h" - +#include "core/command_buffer.h" #include "scene_graph/components/camera.h" #include "scene_graph/components/image.h" #include "scene_graph/components/material.h" @@ -86,7 +86,7 @@ void RenderPipeline::set_clear_value(const std::vector &cv) clear_value = cv; } -void RenderPipeline::draw(CommandBuffer &command_buffer, RenderTarget &render_target, VkSubpassContents contents) +void RenderPipeline::draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &render_target, VkSubpassContents contents) { assert(!subpasses.empty() && "Render pipeline should contain at least one sub-pass"); @@ -113,11 +113,14 @@ void RenderPipeline::draw(CommandBuffer &command_buffer, RenderTarget &render_ta command_buffer.next_subpass(); } - if (subpass->get_debug_name().empty()) + if (contents != VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS) { - subpass->set_debug_name(fmt::format("RP subpass #{}", i)); + if (subpass->get_debug_name().empty()) + { + subpass->set_debug_name(fmt::format("RP subpass #{}", i)); + } + ScopedDebugLabel subpass_debug_label{command_buffer, subpass->get_debug_name().c_str()}; } - ScopedDebugLabel subpass_debug_label{command_buffer, subpass->get_debug_name().c_str()}; subpass->draw(command_buffer); } diff --git a/framework/rendering/render_pipeline.h b/framework/rendering/render_pipeline.h index 991988d161..300ed793e7 100644 --- a/framework/rendering/render_pipeline.h +++ b/framework/rendering/render_pipeline.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -87,7 +87,7 @@ class RenderPipeline /** * @brief Record draw commands for each Subpass */ - void draw(CommandBuffer &command_buffer, RenderTarget &render_target, VkSubpassContents contents = VK_SUBPASS_CONTENTS_INLINE); + void draw(vkb::core::CommandBufferC &command_buffer, RenderTarget &render_target, VkSubpassContents contents = VK_SUBPASS_CONTENTS_INLINE); /** * @return Subpass currently being recorded, or the first one diff --git a/framework/rendering/render_target.cpp b/framework/rendering/render_target.cpp index c5283bc011..7ba79a644d 100644 --- a/framework/rendering/render_target.cpp +++ b/framework/rendering/render_target.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,8 +16,8 @@ */ #include "rendering/render_target.h" - #include "core/device.h" +#include "core/image.h" namespace vkb { diff --git a/framework/rendering/render_target.h b/framework/rendering/render_target.h index 3de35497fc..c65fbd68be 100644 --- a/framework/rendering/render_target.h +++ b/framework/rendering/render_target.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -19,13 +19,10 @@ #include "common/helpers.h" #include "common/vk_common.h" -#include "core/image.h" #include "core/image_view.h" namespace vkb { -class Device; - /** * @brief Description of render pass attachments. * Attachment descriptions can be used to automatically create render target images. @@ -45,6 +42,13 @@ struct Attachment Attachment(VkFormat format, VkSampleCountFlagBits samples, VkImageUsageFlags usage); }; +namespace core +{ +template +class Device; +using DeviceC = Device; +} // namespace core + /** * @brief RenderTarget contains three vectors for: core::Image, core::ImageView and Attachment. * The first two are Vulkan images and corresponding image views respectively. @@ -102,7 +106,7 @@ class RenderTarget VkImageLayout get_layout(uint32_t attachment) const; private: - Device const &device; + vkb::core::DeviceC const &device; VkExtent2D extent{}; diff --git a/framework/rendering/subpass.h b/framework/rendering/subpass.h index 01c869b83c..3aae1d01d0 100644 --- a/framework/rendering/subpass.h +++ b/framework/rendering/subpass.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -22,25 +22,24 @@ #include "rendering/hpp_pipeline_state.h" #include "rendering/hpp_render_target.h" #include "rendering/pipeline_state.h" +#include "rendering/render_context.h" +#include "rendering/render_frame.h" #include "scene_graph/components/light.h" #include "scene_graph/node.h" namespace vkb { -class CommandBuffer; -class RenderContext; class RenderTarget; class ShaderSource; namespace core { -class HPPCommandBuffer; +template +class CommandBuffer; } namespace rendering { -class HPPRenderContext; - struct alignas(16) Light { glm::vec4 position; // position.w represents type of light @@ -84,14 +83,12 @@ class Subpass using ResolveModeFlagBitsType = typename std::conditional::type; using SampleCountflagBitsType = typename std::conditional::type; - using CommandBufferType = typename std::conditional::type; using DepthStencilStateType = typename std::conditional::type; - using RenderContextType = typename std::conditional::type; - using RenderTargetType = typename std::conditional::type; + using RenderTargetType = typename std::conditional::type; public: - Subpass(RenderContextType &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader); + Subpass(vkb::rendering::RenderContext &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader); Subpass(const Subpass &) = delete; Subpass(Subpass &&) = default; @@ -103,7 +100,7 @@ class Subpass * @brief Draw virtual function * @param command_buffer Command buffer to use to record draw commands */ - virtual void draw(CommandBufferType &command_buffer) = 0; + virtual void draw(vkb::core::CommandBuffer &command_buffer) = 0; /** * @brief Prepares the shaders and shader variants for a subpass @@ -131,7 +128,7 @@ class Subpass const std::vector &get_input_attachments() const; LightingState &get_lighting_state(); const std::vector &get_output_attachments() const; - RenderContextType &get_render_context(); + RenderContext &get_render_context(); std::unordered_map const &get_resource_mode_map() const; SampleCountflagBitsType get_sample_count() const; const ShaderSource &get_vertex_shader() const; @@ -186,7 +183,7 @@ class Subpass /// Default to swapchain output attachment std::vector output_attachments = {0}; - vkb::rendering::HPPRenderContext &render_context; + vkb::rendering::RenderContextCpp &render_context; // A map of shader resource names and the mode of constant data std::unordered_map resource_mode_map; @@ -197,15 +194,7 @@ class Subpass using SubpassC = Subpass; using SubpassCpp = Subpass; -} // namespace rendering -} // namespace vkb -#include "rendering/hpp_render_context.h" - -namespace vkb -{ -namespace rendering -{ inline glm::mat4 vulkan_style_projection(const glm::mat4 &proj) { // Flip Y in clipspace. X = -1, Y = -1 is topLeft in Vulkan. @@ -216,8 +205,10 @@ inline glm::mat4 vulkan_style_projection(const glm::mat4 &proj) } template -inline Subpass::Subpass(RenderContextType &render_context, ShaderSource &&vertex_source, ShaderSource &&fragment_source) : - render_context{reinterpret_cast(render_context)}, +inline Subpass::Subpass(vkb::rendering::RenderContext &render_context, + ShaderSource &&vertex_source, + ShaderSource &&fragment_source) : + render_context{reinterpret_cast(render_context)}, vertex_shader{std::move(vertex_source)}, fragment_shader{std::move(fragment_source)} { @@ -249,7 +240,7 @@ inline const std::vector &Subpass::get_output_attachments } template -inline typename vkb::rendering::Subpass::RenderContextType &Subpass::get_render_context() +inline typename vkb::rendering::RenderContext &Subpass::get_render_context() { if constexpr (bindingType == vkb::BindingType::Cpp) { @@ -257,7 +248,7 @@ inline typename vkb::rendering::Subpass::RenderContextType &Subpass } else { - return reinterpret_cast(render_context); + return reinterpret_cast(render_context); } } diff --git a/framework/rendering/subpasses/forward_subpass.cpp b/framework/rendering/subpasses/forward_subpass.cpp index 0bde126a42..6c3848e7e8 100644 --- a/framework/rendering/subpasses/forward_subpass.cpp +++ b/framework/rendering/subpasses/forward_subpass.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -19,7 +19,9 @@ #include "common/utils.h" #include "common/vk_common.h" +#include "core/command_buffer.h" #include "rendering/render_context.h" +#include "resource_cache.h" #include "scene_graph/components/camera.h" #include "scene_graph/components/image.h" #include "scene_graph/components/material.h" @@ -32,7 +34,8 @@ namespace vkb { -ForwardSubpass::ForwardSubpass(RenderContext &render_context, ShaderSource &&vertex_source, ShaderSource &&fragment_source, sg::Scene &scene_, sg::Camera &camera) : +ForwardSubpass::ForwardSubpass( + vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_source, ShaderSource &&fragment_source, sg::Scene &scene_, sg::Camera &camera) : GeometrySubpass{render_context, std::move(vertex_source), std::move(fragment_source), scene_, camera} { } @@ -44,20 +47,14 @@ void ForwardSubpass::prepare() { for (auto &sub_mesh : mesh->get_submeshes()) { - auto &variant = sub_mesh->get_mut_shader_variant(); - - // Same as Geometry except adds lighting definitions to sub mesh variants. - variant.add_definitions({"MAX_LIGHT_COUNT " + std::to_string(MAX_FORWARD_LIGHT_COUNT)}); - - variant.add_definitions(vkb::rendering::light_type_definitions); - + auto &variant = sub_mesh->get_mut_shader_variant(); auto &vert_module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, get_vertex_shader(), variant); auto &frag_module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, get_fragment_shader(), variant); } } } -void ForwardSubpass::draw(CommandBuffer &command_buffer) +void ForwardSubpass::draw(vkb::core::CommandBufferC &command_buffer) { allocate_lights(scene.get_components(), MAX_FORWARD_LIGHT_COUNT); command_buffer.bind_lighting(get_lighting_state(), 0, 4); diff --git a/framework/rendering/subpasses/forward_subpass.h b/framework/rendering/subpasses/forward_subpass.h index 1815372893..c41a55a1dd 100644 --- a/framework/rendering/subpasses/forward_subpass.h +++ b/framework/rendering/subpasses/forward_subpass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -55,7 +55,8 @@ class ForwardSubpass : public GeometrySubpass * @param scene Scene to render on this subpass * @param camera Camera used to look at the scene */ - ForwardSubpass(RenderContext &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Scene &scene, sg::Camera &camera); + ForwardSubpass( + vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Scene &scene, sg::Camera &camera); virtual ~ForwardSubpass() = default; @@ -64,7 +65,7 @@ class ForwardSubpass : public GeometrySubpass /** * @brief Record draw commands */ - virtual void draw(CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; }; } // namespace vkb diff --git a/framework/rendering/subpasses/geometry_subpass.cpp b/framework/rendering/subpasses/geometry_subpass.cpp index 6fbea434f4..89e4331bb4 100644 --- a/framework/rendering/subpasses/geometry_subpass.cpp +++ b/framework/rendering/subpasses/geometry_subpass.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,9 @@ #include "rendering/subpasses/geometry_subpass.h" #include "common/utils.h" #include "common/vk_common.h" +#include "core/command_buffer.h" #include "rendering/render_context.h" +#include "resource_cache.h" #include "scene_graph/components/camera.h" #include "scene_graph/components/image.h" #include "scene_graph/components/material.h" @@ -30,7 +32,8 @@ namespace vkb { -GeometrySubpass::GeometrySubpass(RenderContext &render_context, ShaderSource &&vertex_source, ShaderSource &&fragment_source, sg::Scene &scene_, sg::Camera &camera) : +GeometrySubpass::GeometrySubpass( + vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_source, ShaderSource &&fragment_source, sg::Scene &scene_, sg::Camera &camera) : Subpass{render_context, std::move(vertex_source), std::move(fragment_source)}, meshes{scene_.get_components()}, camera{camera}, @@ -53,7 +56,8 @@ void GeometrySubpass::prepare() } } -void GeometrySubpass::get_sorted_nodes(std::multimap> &opaque_nodes, std::multimap> &transparent_nodes) +void GeometrySubpass::get_sorted_nodes(std::multimap> &opaque_nodes, + std::multimap> &transparent_nodes) { auto camera_transform = camera.get_node()->get_transform().get_world_matrix(); @@ -85,10 +89,10 @@ void GeometrySubpass::get_sorted_nodes(std::multimap> opaque_nodes; - std::multimap> transparent_nodes; + std::multimap> opaque_nodes; + std::multimap> transparent_nodes; get_sorted_nodes(opaque_nodes, transparent_nodes); @@ -139,7 +143,7 @@ void GeometrySubpass::draw(CommandBuffer &command_buffer) } } -void GeometrySubpass::update_uniform(CommandBuffer &command_buffer, sg::Node &node, size_t thread_index) +void GeometrySubpass::update_uniform(vkb::core::CommandBufferC &command_buffer, vkb::scene_graph::NodeC &node, size_t thread_index) { GlobalUniform global_uniform; @@ -160,7 +164,7 @@ void GeometrySubpass::update_uniform(CommandBuffer &command_buffer, sg::Node &no command_buffer.bind_buffer(allocation.get_buffer(), allocation.get_offset(), allocation.get_size(), 0, 1, 0); } -void GeometrySubpass::draw_submesh(CommandBuffer &command_buffer, sg::SubMesh &sub_mesh, VkFrontFace front_face) +void GeometrySubpass::draw_submesh(vkb::core::CommandBufferC &command_buffer, sg::SubMesh &sub_mesh, VkFrontFace front_face) { auto &device = command_buffer.get_device(); @@ -193,7 +197,7 @@ void GeometrySubpass::draw_submesh(CommandBuffer &command_buffer, sg::SubMesh &s if (auto layout_binding = descriptor_set_layout.get_layout_binding(texture.first)) { command_buffer.bind_image(texture.second->get_image()->get_vk_image_view(), - texture.second->get_sampler()->vk_sampler, + texture.second->get_sampler()->get_core_sampler(), 0, layout_binding->binding, 0); } } @@ -246,7 +250,9 @@ void GeometrySubpass::draw_submesh(CommandBuffer &command_buffer, sg::SubMesh &s draw_submesh_command(command_buffer, sub_mesh); } -void GeometrySubpass::prepare_pipeline_state(CommandBuffer &command_buffer, VkFrontFace front_face, bool double_sided_material) +void GeometrySubpass::prepare_pipeline_state(vkb::core::CommandBufferC &command_buffer, + VkFrontFace front_face, + bool double_sided_material) { RasterizationState rasterization_state = base_rasterization_state; rasterization_state.front_face = front_face; @@ -263,7 +269,8 @@ void GeometrySubpass::prepare_pipeline_state(CommandBuffer &command_buffer, VkFr command_buffer.set_multisample_state(multisample_state); } -PipelineLayout &GeometrySubpass::prepare_pipeline_layout(CommandBuffer &command_buffer, const std::vector &shader_modules) +PipelineLayout &GeometrySubpass::prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) { // Sets any specified resource modes for (auto &shader_module : shader_modules) @@ -277,7 +284,7 @@ PipelineLayout &GeometrySubpass::prepare_pipeline_layout(CommandBuffer &command_ return command_buffer.get_device().get_resource_cache().request_pipeline_layout(shader_modules); } -void GeometrySubpass::prepare_push_constants(CommandBuffer &command_buffer, sg::SubMesh &sub_mesh) +void GeometrySubpass::prepare_push_constants(vkb::core::CommandBufferC &command_buffer, sg::SubMesh &sub_mesh) { auto pbr_material = dynamic_cast(sub_mesh.get_material()); @@ -294,7 +301,7 @@ void GeometrySubpass::prepare_push_constants(CommandBuffer &command_buffer, sg:: } } -void GeometrySubpass::draw_submesh_command(CommandBuffer &command_buffer, sg::SubMesh &sub_mesh) +void GeometrySubpass::draw_submesh_command(vkb::core::CommandBufferC &command_buffer, sg::SubMesh &sub_mesh) { // Draw submesh indexed if indices exists if (sub_mesh.vertex_indices != 0) diff --git a/framework/rendering/subpasses/geometry_subpass.h b/framework/rendering/subpasses/geometry_subpass.h index c4463e0b60..9e4706ada1 100644 --- a/framework/rendering/subpasses/geometry_subpass.h +++ b/framework/rendering/subpasses/geometry_subpass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -25,10 +25,16 @@ namespace vkb { +namespace core +{ +template +class CommandBuffer; +using CommandBufferC = CommandBuffer; +} // namespace core + namespace sg { class Scene; -class Node; class Mesh; class SubMesh; class Camera; @@ -72,7 +78,8 @@ class GeometrySubpass : public vkb::rendering::SubpassC * @param scene Scene to render on this subpass * @param camera Camera used to look at the scene */ - GeometrySubpass(RenderContext &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Scene &scene, sg::Camera &camera); + GeometrySubpass( + vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Scene &scene, sg::Camera &camera); virtual ~GeometrySubpass() = default; @@ -81,7 +88,7 @@ class GeometrySubpass : public vkb::rendering::SubpassC /** * @brief Record draw commands */ - virtual void draw(CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; /** * @brief Thread index to use for allocating resources @@ -89,24 +96,25 @@ class GeometrySubpass : public vkb::rendering::SubpassC void set_thread_index(uint32_t index); protected: - virtual void update_uniform(CommandBuffer &command_buffer, sg::Node &node, size_t thread_index); + virtual void update_uniform(vkb::core::CommandBufferC &command_buffer, vkb::scene_graph::NodeC &node, size_t thread_index); - void draw_submesh(CommandBuffer &command_buffer, sg::SubMesh &sub_mesh, VkFrontFace front_face = VK_FRONT_FACE_COUNTER_CLOCKWISE); + void draw_submesh(vkb::core::CommandBufferC &command_buffer, sg::SubMesh &sub_mesh, VkFrontFace front_face = VK_FRONT_FACE_COUNTER_CLOCKWISE); - virtual void prepare_pipeline_state(CommandBuffer &command_buffer, VkFrontFace front_face, bool double_sided_material); + virtual void prepare_pipeline_state(vkb::core::CommandBufferC &command_buffer, VkFrontFace front_face, bool double_sided_material); - virtual PipelineLayout &prepare_pipeline_layout(CommandBuffer &command_buffer, const std::vector &shader_modules); + virtual PipelineLayout &prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules); - virtual void prepare_push_constants(CommandBuffer &command_buffer, sg::SubMesh &sub_mesh); + virtual void prepare_push_constants(vkb::core::CommandBufferC &command_buffer, sg::SubMesh &sub_mesh); - virtual void draw_submesh_command(CommandBuffer &command_buffer, sg::SubMesh &sub_mesh); + virtual void draw_submesh_command(vkb::core::CommandBufferC &command_buffer, sg::SubMesh &sub_mesh); /** * @brief Sorts objects based on distance from camera and classifies them * into opaque and transparent in the arrays provided */ - void get_sorted_nodes(std::multimap> &opaque_nodes, - std::multimap> &transparent_nodes); + void get_sorted_nodes(std::multimap> &opaque_nodes, + std::multimap> &transparent_nodes); sg::Camera &camera; diff --git a/framework/rendering/subpasses/hpp_forward_subpass.h b/framework/rendering/subpasses/hpp_forward_subpass.h index 99ce75fc3a..94c6ef2dc1 100644 --- a/framework/rendering/subpasses/hpp_forward_subpass.h +++ b/framework/rendering/subpasses/hpp_forward_subpass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,8 +19,6 @@ #include "rendering/subpasses/forward_subpass.h" -#include - namespace vkb { namespace rendering @@ -35,12 +33,12 @@ namespace subpasses class HPPForwardSubpass : public vkb::ForwardSubpass { public: - HPPForwardSubpass(vkb::rendering::HPPRenderContext &render_context, + HPPForwardSubpass(vkb::rendering::RenderContextCpp &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::scene_graph::HPPScene &scene, vkb::sg::Camera &camera) : - vkb::ForwardSubpass(reinterpret_cast(render_context), + vkb::ForwardSubpass(reinterpret_cast(render_context), std::forward(vertex_shader), std::forward(fragment_shader), reinterpret_cast(scene), diff --git a/framework/rendering/subpasses/lighting_subpass.cpp b/framework/rendering/subpasses/lighting_subpass.cpp index d46736a83d..8f008f34f2 100644 --- a/framework/rendering/subpasses/lighting_subpass.cpp +++ b/framework/rendering/subpasses/lighting_subpass.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,31 +18,29 @@ #include "lighting_subpass.h" #include "buffer_pool.h" +#include "core/command_buffer.h" #include "rendering/render_context.h" +#include "resource_cache.h" #include "scene_graph/components/camera.h" #include "scene_graph/scene.h" namespace vkb { -LightingSubpass::LightingSubpass(RenderContext &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Camera &cam, sg::Scene &scene_) : - Subpass{render_context, std::move(vertex_shader), std::move(fragment_shader)}, - camera{cam}, - scene{scene_} +LightingSubpass::LightingSubpass( + vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Camera &cam, sg::Scene &scene_) : + Subpass{render_context, std::move(vertex_shader), std::move(fragment_shader)}, camera{cam}, scene{scene_} { } void LightingSubpass::prepare() { - lighting_variant.add_definitions({"MAX_LIGHT_COUNT " + std::to_string(MAX_DEFERRED_LIGHT_COUNT)}); - - lighting_variant.add_definitions(vkb::rendering::light_type_definitions); // Build all shaders upfront auto &resource_cache = get_render_context().get_device().get_resource_cache(); resource_cache.request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, get_vertex_shader(), lighting_variant); resource_cache.request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, get_fragment_shader(), lighting_variant); } -void LightingSubpass::draw(CommandBuffer &command_buffer) +void LightingSubpass::draw(vkb::core::CommandBufferC &command_buffer) { allocate_lights(scene.get_components(), MAX_DEFERRED_LIGHT_COUNT); command_buffer.bind_lighting(get_lighting_state(), 0, 4); diff --git a/framework/rendering/subpasses/lighting_subpass.h b/framework/rendering/subpasses/lighting_subpass.h index e2b6659345..1f55c890af 100644 --- a/framework/rendering/subpasses/lighting_subpass.h +++ b/framework/rendering/subpasses/lighting_subpass.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -27,6 +27,13 @@ namespace vkb { +namespace core +{ +template +class CommandBuffer; +using CommandBufferC = CommandBuffer; +} // namespace core + namespace sg { class Camera; @@ -58,11 +65,12 @@ struct alignas(16) DeferredLights class LightingSubpass : public vkb::rendering::SubpassC { public: - LightingSubpass(RenderContext &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Camera &camera, sg::Scene &scene); + LightingSubpass( + vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Camera &camera, sg::Scene &scene); virtual void prepare() override; - void draw(CommandBuffer &command_buffer) override; + void draw(vkb::core::CommandBufferC &command_buffer) override; private: sg::Camera &camera; diff --git a/framework/resource_binding_state.h b/framework/resource_binding_state.h index b4904e41af..977f91c21c 100644 --- a/framework/resource_binding_state.h +++ b/framework/resource_binding_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -19,11 +19,19 @@ #include "common/vk_common.h" #include "core/buffer.h" -#include "core/image_view.h" -#include "core/sampler.h" namespace vkb { +namespace core +{ +template +class Buffer; +using BufferC = Buffer; + +class ImageView; +class Sampler; +} // namespace core + /** * @brief A resource info is a struct containing the actual resource data. * diff --git a/framework/resource_cache.cpp b/framework/resource_cache.cpp index c8fb99b752..a4cf7f6fbe 100644 --- a/framework/resource_cache.cpp +++ b/framework/resource_cache.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -25,7 +25,7 @@ namespace vkb namespace { template -T &request_resource(Device &device, ResourceRecord &recorder, std::mutex &resource_mutex, std::unordered_map &resources, A &... args) +T &request_resource(vkb::core::DeviceC &device, ResourceRecord &recorder, std::mutex &resource_mutex, std::unordered_map &resources, A &...args) { std::lock_guard guard(resource_mutex); @@ -35,7 +35,7 @@ T &request_resource(Device &device, ResourceRecord &recorder, std::mutex &resour } } // namespace -ResourceCache::ResourceCache(Device &device) : +ResourceCache::ResourceCache(vkb::core::DeviceC &device) : device{device} { } diff --git a/framework/resource_cache.h b/framework/resource_cache.h index 3f9b90a63f..b3da7f97d3 100644 --- a/framework/resource_cache.h +++ b/framework/resource_cache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -32,8 +32,6 @@ namespace vkb { -class Device; - namespace core { class ImageView; @@ -79,7 +77,7 @@ struct ResourceCacheState class ResourceCache { public: - ResourceCache(Device &device); + ResourceCache(vkb::core::DeviceC &device); ResourceCache(const ResourceCache &) = delete; @@ -107,16 +105,16 @@ class ResourceCache ComputePipeline &request_compute_pipeline(PipelineState &pipeline_state); - DescriptorSet &request_descriptor_set(DescriptorSetLayout & descriptor_set_layout, + DescriptorSet &request_descriptor_set(DescriptorSetLayout &descriptor_set_layout, const BindingMap &buffer_infos, - const BindingMap & image_infos); + const BindingMap &image_infos); - RenderPass &request_render_pass(const std::vector & attachments, + RenderPass &request_render_pass(const std::vector &attachments, const std::vector &load_store_infos, - const std::vector & subpasses); + const std::vector &subpasses); Framebuffer &request_framebuffer(const RenderTarget &render_target, - const RenderPass & render_pass); + const RenderPass &render_pass); void clear_pipelines(); @@ -132,7 +130,7 @@ class ResourceCache const ResourceCacheState &get_internal_state() const; private: - Device &device; + vkb::core::DeviceC &device; ResourceRecord recorder; diff --git a/framework/resource_record.cpp b/framework/resource_record.cpp index 313de612c2..eddf691488 100644 --- a/framework/resource_record.cpp +++ b/framework/resource_record.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -36,15 +36,6 @@ inline void write_subpass_info(std::ostringstream &os, const std::vector &value) -{ - write(os, value.size()); - for (const std::string &item : value) - { - write(os, item); - } -} } // namespace void ResourceRecord::set_data(const std::vector &data) @@ -68,9 +59,7 @@ size_t ResourceRecord::register_shader_module(VkShaderStageFlagBits stage, const { shader_module_indices.push_back(shader_module_indices.size()); - write(stream, ResourceType::ShaderModule, stage, glsl_source.get_source(), entry_point, shader_variant.get_preamble()); - - write_processes(stream, shader_variant.get_processes()); + write(stream, ResourceType::ShaderModule, stage, glsl_source.get_source(), entry_point); return shader_module_indices.back(); } diff --git a/framework/resource_record.h b/framework/resource_record.h index 8faf4d4b69..3426198470 100644 --- a/framework/resource_record.h +++ b/framework/resource_record.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,9 +17,10 @@ #pragma once -#include - +#include "core/render_pass.h" #include "rendering/pipeline_state.h" +#include "rendering/render_target.h" +#include namespace vkb { @@ -49,18 +50,18 @@ class ResourceRecord const std::ostringstream &get_stream(); size_t register_shader_module(VkShaderStageFlagBits stage, - const ShaderSource & glsl_source, - const std::string & entry_point, - const ShaderVariant & shader_variant); + const ShaderSource &glsl_source, + const std::string &entry_point, + const ShaderVariant &shader_variant); size_t register_pipeline_layout(const std::vector &shader_modules); - size_t register_render_pass(const std::vector & attachments, + size_t register_render_pass(const std::vector &attachments, const std::vector &load_store_infos, - const std::vector & subpasses); + const std::vector &subpasses); size_t register_graphics_pipeline(VkPipelineCache pipeline_cache, - PipelineState & pipeline_state); + PipelineState &pipeline_state); void set_shader_module(size_t index, const ShaderModule &shader_module); diff --git a/framework/resource_replay.cpp b/framework/resource_replay.cpp index 5d13fffede..d21099ea4a 100644 --- a/framework/resource_replay.cpp +++ b/framework/resource_replay.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -38,16 +38,6 @@ inline void read_subpass_info(std::istringstream &is, std::vector & } } -inline void read_processes(std::istringstream &is, std::vector &value) -{ - std::size_t size; - read(is, size); - value.resize(size); - for (std::string &item : value) - { - read(is, item); - } -} } // namespace ResourceReplay::ResourceReplay() @@ -94,20 +84,15 @@ void ResourceReplay::create_shader_module(ResourceCache &resource_cache, std::is VkShaderStageFlagBits stage{}; std::string glsl_source; std::string entry_point; - std::string preamble; - std::vector processes; read(stream, stage, glsl_source, - entry_point, - preamble); - - read_processes(stream, processes); + entry_point); ShaderSource shader_source{}; shader_source.set_source(std::move(glsl_source)); - ShaderVariant shader_variant(std::move(preamble), std::move(processes)); + ShaderVariant shader_variant; auto &shader_module = resource_cache.request_shader_module(stage, shader_source, shader_variant); diff --git a/framework/scene_graph/components/camera.cpp b/framework/scene_graph/components/camera.cpp index 7b1e055190..e7c1710e22 100644 --- a/framework/scene_graph/components/camera.cpp +++ b/framework/scene_graph/components/camera.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -44,12 +44,12 @@ glm::mat4 Camera::get_view() return glm::inverse(transform.get_world_matrix()); } -void Camera::set_node(Node &n) +void Camera::set_node(vkb::scene_graph::NodeC &n) { node = &n; } -Node *Camera::get_node() +vkb::scene_graph::NodeC *Camera::get_node() { return node; } diff --git a/framework/scene_graph/components/camera.h b/framework/scene_graph/components/camera.h index d6271a55ad..8b0096ef05 100644 --- a/framework/scene_graph/components/camera.h +++ b/framework/scene_graph/components/camera.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -28,6 +28,7 @@ #include "common/helpers.h" #include "scene_graph/component.h" +#include "scene_graph/node.h" namespace vkb { @@ -46,16 +47,16 @@ class Camera : public Component glm::mat4 get_view(); - void set_node(Node &node); + void set_node(vkb::scene_graph::NodeC &node); - Node *get_node(); + vkb::scene_graph::NodeC *get_node(); const glm::mat4 get_pre_rotation(); void set_pre_rotation(const glm::mat4 &pre_rotation); private: - Node *node{nullptr}; + vkb::scene_graph::NodeC *node{nullptr}; glm::mat4 pre_rotation{1.0f}; }; diff --git a/framework/scene_graph/components/hpp_image.cpp b/framework/scene_graph/components/hpp_image.cpp index e010a80afd..e93348040b 100644 --- a/framework/scene_graph/components/hpp_image.cpp +++ b/framework/scene_graph/components/hpp_image.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -42,7 +42,9 @@ HPPImage::HPPImage(const std::string &name, std::vector &&d, std::vecto data{std::move(d)}, format{vk::Format::eR8G8B8A8Unorm}, mipmaps{std::move(m)} -{} +{ + update_hash(); +} std::unique_ptr HPPImage::load(const std::string &name, const std::string &uri, ContentType content_type) @@ -198,7 +200,7 @@ void HPPImage::coerce_format_to_srgb() } } -void HPPImage::create_vk_image(vkb::core::HPPDevice &device, vk::ImageViewType image_view_type, vk::ImageCreateFlags flags) +void HPPImage::create_vk_image(vkb::core::DeviceCpp &device, vk::ImageViewType image_view_type, vk::ImageCreateFlags flags) { assert(!vk_image && !vk_image_view && "Vulkan HPPImage already constructed"); @@ -244,7 +246,7 @@ void HPPImage::generate_mipmaps() vkb::scene_graph::components::HPPMipmap next_mipmap{}; next_mipmap.level = prev_mipmap.level + 1; next_mipmap.offset = old_size; - next_mipmap.extent = vk::Extent3D(next_width, next_height, 1u); + next_mipmap.extent = vk::Extent3D{next_width, next_height, 1u}; // Fill next mipmap memory stbir_resize_uint8(data.data() + prev_mipmap.offset, prev_mipmap.extent.width, prev_mipmap.extent.height, 0, @@ -264,6 +266,15 @@ void HPPImage::generate_mipmaps() } } +void HPPImage::update_hash() +{ + data_hash = vkb::calculate_hash(data); +} + +void HPPImage::update_hash(size_t hash) +{ + data_hash = hash; +} const std::vector &HPPImage::get_data() const { return data; @@ -327,6 +338,7 @@ void HPPImage::set_data(const uint8_t *raw_data, size_t size) { assert(data.empty() && "HPPImage data already set"); data = {raw_data, raw_data + size}; + update_hash(); } void HPPImage::set_depth(const uint32_t depth) @@ -364,4 +376,4 @@ void HPPImage::set_width(const uint32_t width) } // namespace components } // namespace scene_graph -} // namespace vkb \ No newline at end of file +} // namespace vkb diff --git a/framework/scene_graph/components/hpp_image.h b/framework/scene_graph/components/hpp_image.h index ea347568d6..86c59bd560 100644 --- a/framework/scene_graph/components/hpp_image.h +++ b/framework/scene_graph/components/hpp_image.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,11 +17,21 @@ #pragma once -#include "core/hpp_device.h" +#include "common/vk_common.h" +#include "core/hpp_image.h" #include "scene_graph/component.h" #include -namespace vkb::scene_graph::components +namespace vkb +{ +namespace core +{ +template +class Device; +using DeviceCpp = Device; +} // namespace core + +namespace scene_graph::components { /** * @param format Vulkan format @@ -67,7 +77,7 @@ class HPPImage : public vkb::sg::Component void clear_data(); void coerce_format_to_srgb(); - void create_vk_image(vkb::core::HPPDevice &device, vk::ImageViewType image_view_type = vk::ImageViewType::e2D, vk::ImageCreateFlags flags = {}); + void create_vk_image(vkb::core::DeviceCpp &device, vk::ImageViewType image_view_type = vk::ImageViewType::e2D, vk::ImageCreateFlags flags = {}); void generate_mipmaps(); const std::vector &get_data() const; const vk::Extent3D &get_extent() const; @@ -77,6 +87,8 @@ class HPPImage : public vkb::sg::Component const std::vector> &get_offsets() const; const vkb::core::HPPImage &get_vk_image() const; const vkb::core::HPPImageView &get_vk_image_view() const; + void update_hash(size_t data_hash); + void update_hash(); protected: vkb::scene_graph::components::HPPMipmap &get_mipmap(size_t index); @@ -92,6 +104,7 @@ class HPPImage : public vkb::sg::Component private: std::vector data; + size_t data_hash{0}; vk::Format format = vk::Format::eUndefined; uint32_t layers = 1; std::vector mipmaps{{}}; @@ -100,4 +113,5 @@ class HPPImage : public vkb::sg::Component std::unique_ptr vk_image_view; }; -} // namespace vkb::scene_graph::components +} // namespace scene_graph::components +} // namespace vkb diff --git a/framework/scene_graph/components/image.cpp b/framework/scene_graph/components/image.cpp index d50cd938dd..c67704855e 100644 --- a/framework/scene_graph/components/image.cpp +++ b/framework/scene_graph/components/image.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,6 +17,7 @@ #include "image.h" +#include #include #include "common/error.h" @@ -152,6 +153,7 @@ Image::Image(const std::string &name, std::vector &&d, std::vector &Image::get_data() const return data; } +size_t Image::get_data_hash() const +{ + return data_hash; +} + void Image::clear_data() { data.clear(); @@ -196,7 +203,7 @@ const std::vector> &Image::get_offsets() const return offsets; } -void Image::create_vk_image(Device &device, VkImageViewType image_view_type, VkImageCreateFlags flags) +void Image::create_vk_image(vkb::core::DeviceC &device, VkImageViewType image_view_type, VkImageCreateFlags flags) { assert(!vk_image && !vk_image_view && "Vulkan image already constructed"); @@ -312,10 +319,21 @@ std::vector &Image::get_mut_data() return data; } +void Image::update_hash() +{ + data_hash = vkb::calculate_hash(data); +} + +void Image::update_hash(size_t hash) +{ + data_hash = hash; +} + void Image::set_data(const uint8_t *raw_data, size_t size) { assert(data.empty() && "Image data already set"); data = {raw_data, raw_data + size}; + update_hash(); } void Image::set_format(const VkFormat f) diff --git a/framework/scene_graph/components/image.h b/framework/scene_graph/components/image.h index 8db3d203e9..661db68b6a 100644 --- a/framework/scene_graph/components/image.h +++ b/framework/scene_graph/components/image.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -80,6 +80,8 @@ class Image : public Component const std::vector &get_data() const; + size_t get_data_hash() const; + void clear_data(); VkFormat get_format() const; @@ -94,7 +96,7 @@ class Image : public Component void generate_mipmaps(); - void create_vk_image(Device &device, VkImageViewType image_view_type = VK_IMAGE_VIEW_TYPE_2D, VkImageCreateFlags flags = 0); + void create_vk_image(vkb::core::DeviceC &device, VkImageViewType image_view_type = VK_IMAGE_VIEW_TYPE_2D, VkImageCreateFlags flags = 0); const core::Image &get_vk_image() const; @@ -123,9 +125,15 @@ class Image : public Component std::vector &get_mut_mipmaps(); + void update_hash(); + + void update_hash(size_t data_hash); + private: std::vector data; + size_t data_hash{0}; + VkFormat format{VK_FORMAT_UNDEFINED}; uint32_t layers{1}; diff --git a/framework/scene_graph/components/image/astc.cpp b/framework/scene_graph/components/image/astc.cpp index 26ad11b7e0..5395f5ccc2 100644 --- a/framework/scene_graph/components/image/astc.cpp +++ b/framework/scene_graph/components/image/astc.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,6 +17,7 @@ #include "scene_graph/components/image/astc.h" +#include #include #include "common/error.h" @@ -29,12 +30,21 @@ #endif #include +#include + #define MAGIC_FILE_CONSTANT 0x5CA1AB13 +#define ASTC_CACHE_DIRECTORY "cache/astc_to_bin" + +constexpr uint32_t ASTC_CACHE_HEADER_SIZE = 64; +constexpr uint32_t ASTC_CACHE_SEED = 1619; namespace vkb { namespace sg { + +using Path = std::filesystem::path; + BlockDim to_blockdim(const VkFormat format) { switch (format) @@ -86,6 +96,45 @@ BlockDim to_blockdim(const VkFormat format) } } +inline astcenc_profile to_profile(const VkFormat format) +{ + switch (format) + { + case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: + case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: + case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: + case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: + case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: + case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: + case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: + case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: + case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: + case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: + case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: + case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: + case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: + case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: + return ASTCENC_PRF_LDR; + case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: + case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: + case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: + case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: + case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: + case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: + case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: + case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: + case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: + case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: + case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: + case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: + case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: + case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: + return ASTCENC_PRF_LDR_SRGB; + default: + throw std::runtime_error{"Invalid astc format"}; + } +} + struct AstcHeader { uint8_t magic[4]; @@ -164,18 +213,135 @@ Astc::Astc(const Image &image) : { init(); + auto fs = vkb::filesystem::get(); + + size_t key = ASTC_CACHE_SEED; + glm::detail::hash_combine(key, image.get_data_hash()); + + constexpr bool use_cache = true; + constexpr uint32_t bytes_per_pixel = 4; + constexpr const char file_cache_header[ASTC_CACHE_HEADER_SIZE] = "ASTCConvertedDataV01"; + const auto profile = to_profile(image.get_format()); + + auto can_load_from_file = [this, profile, fs, file_cache_header, bytes_per_pixel, use_cache](const Path &path, std::vector &dst_data, uint32_t width, uint32_t height, uint32_t depth) { + if (!use_cache) + { + LOGD("Device does not support ASTC format and cache is disabled. ASTC image {} will be decoded.", get_name()) + return false; + } + try + { + if (!fs->exists(path)) + { + LOGW("Device does not support ASTC format and cache file {} does not exist. ASTC image {} will be decoded.", path.string(), get_name()) + return false; + } + else + { + LOGD("Loading ASTC image {} from cache file {}", get_name(), path.string()) + } + size_t offset = 0; + + auto copy_from_file = [fs, path](void *dst, size_t *offset, size_t content_size) { + const auto bin_content = fs->read_chunk(path, *offset, content_size); + std::memcpy(dst, &bin_content[0], content_size); + *offset += content_size; + }; + + char header[ASTC_CACHE_HEADER_SIZE]; + copy_from_file(&header, &offset, ASTC_CACHE_HEADER_SIZE); + if (std::strcmp(header, file_cache_header) != 0) + { + return false; + } + + uint32_t file_width, file_height, file_depth; + copy_from_file(&file_width, &offset, sizeof(std::uint32_t)); + copy_from_file(&file_height, &offset, sizeof(std::uint32_t)); + copy_from_file(&file_depth, &offset, sizeof(std::uint32_t)); + + if (file_width != width || width == 0 || + file_height != height || height == 0 || + file_depth != depth || depth == 0) + { + return false; + } + else + { + set_width(width); + set_height(height); + set_depth(depth); + set_format(profile == ASTCENC_PRF_LDR_SRGB ? VK_FORMAT_R8G8B8A8_SRGB : VK_FORMAT_R8G8B8A8_UNORM); + } + + auto image_size = width * height * depth * bytes_per_pixel; + dst_data.resize(image_size); + copy_from_file(dst_data.data(), &offset, image_size); + + return true; + } + catch (const std::runtime_error &e) + { + LOGE("ERROR loading file {} from cache. Error: <{}>", path.string(), e.what()) + // file is truncated + return false; + } + }; + + auto save_to_file = [fs, file_cache_header, bytes_per_pixel, use_cache](const Path &path, uint8_t *dst_data, uint32_t width, uint32_t height, uint32_t depth) { + if (!use_cache) + { + return; + } + try + { + LOGI("Saving ASTC cache data to file: {}", path.string()); + + auto image_size = width * height * depth * bytes_per_pixel; + + std::vector astc_file_content; + astc_file_content.reserve(sizeof(file_cache_header) + (3 * sizeof(std::uint32_t)) + image_size); + + auto append_to_file = [](std::vector &dst_file, const std::uint8_t *content, size_t content_size) { + dst_file.insert(dst_file.end(), content, content + content_size); + }; + + append_to_file(astc_file_content, (uint8_t *) &file_cache_header, sizeof(file_cache_header)); + append_to_file(astc_file_content, (uint8_t *) &width, sizeof(uint32_t)); + append_to_file(astc_file_content, (uint8_t *) &height, sizeof(uint32_t)); + append_to_file(astc_file_content, (uint8_t *) &depth, sizeof(uint32_t)); + append_to_file(astc_file_content, (uint8_t *) dst_data, image_size); + + fs->write_file(path, astc_file_content); + } + catch (const std::runtime_error &e) + { + LOGE("ERROR: saving to file: {}\nError<{}>", path.string(), e.what()) + } + }; + // Locate mip #0 in the KTX. This is the first one in the data array for KTX1s, but the last one in KTX2s! - auto mip_it = std::find_if(image.get_mipmaps().begin(), image.get_mipmaps().end(), - [](auto &mip) { return mip.level == 0; }); + auto mip_it = std::ranges::find_if(image.get_mipmaps(), + [](auto &mip) { return mip.level == 0; }); assert(mip_it != image.get_mipmaps().end() && "Mip #0 not found"); - // When decoding ASTC on CPU (as it is the case in here), we don't decode all mips in the mip chain. - // Instead, we just decode mip #0 and re-generate the other LODs later (via image->generate_mipmaps()). - const auto blockdim = to_blockdim(image.get_format()); - const auto &extent = mip_it->extent; - auto size = extent.width * extent.height * extent.depth * 4; - const uint8_t *data_ptr = image.get_data().data() + mip_it->offset; - decode(blockdim, mip_it->extent, data_ptr, size); + const std::string path = fmt::format("{}/{}.bin", ASTC_CACHE_DIRECTORY, uint64_t(key)); + + if (!can_load_from_file(path, get_mut_data(), mip_it->extent.width, mip_it->extent.height, mip_it->extent.depth)) + { + // When decoding ASTC on CPU (as it is the case in here), we don't decode all mips in the mip chain. + // Instead, we just decode mip #0 and re-generate the other LODs later (via image->generate_mipmaps()). + const auto blockdim = to_blockdim(image.get_format()); + const auto &extent = mip_it->extent; + auto size = extent.width * extent.height * extent.depth * 4; + const uint8_t *data_ptr = image.get_data().data() + mip_it->offset; + + decode(blockdim, mip_it->extent, data_ptr, size); + + save_to_file(path, get_mut_data().data(), mip_it->extent.width, mip_it->extent.height, mip_it->extent.depth); + } + + update_hash(image.get_data_hash()); } Astc::Astc(const std::string &name, const std::vector &data) : @@ -207,6 +373,8 @@ Astc::Astc(const std::string &name, const std::vector &data) : /* depth = */ static_cast(header.zsize[0] + 256 * header.zsize[1] + 65536 * header.zsize[2])}; decode(blockdim, extent, data.data() + sizeof(AstcHeader), to_u32(data.size() - sizeof(AstcHeader))); + + update_hash(get_data_hash()); } } // namespace sg diff --git a/framework/scene_graph/components/image/ktx.cpp b/framework/scene_graph/components/image/ktx.cpp index e0563a014f..2420c6c5b2 100644 --- a/framework/scene_graph/components/image/ktx.cpp +++ b/framework/scene_graph/components/image/ktx.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -103,6 +103,7 @@ Ktx::Ktx(const std::string &name, const std::vector &data, ContentType set_height(texture->baseHeight); set_depth(texture->baseDepth); set_layers(texture->numLayers); + update_hash(); bool cubemap = false; diff --git a/framework/scene_graph/components/light.cpp b/framework/scene_graph/components/light.cpp index db74c1b0da..28fb97c76b 100644 --- a/framework/scene_graph/components/light.cpp +++ b/framework/scene_graph/components/light.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,6 +16,7 @@ */ #include "light.h" +#include "scene_graph/node.h" namespace vkb { @@ -30,12 +31,12 @@ std::type_index Light::get_type() return typeid(Light); } -void Light::set_node(Node &n) +void Light::set_node(vkb::scene_graph::NodeC &n) { node = &n; } -Node *Light::get_node() +vkb::scene_graph::NodeC *Light::get_node() { return node; } diff --git a/framework/scene_graph/components/light.h b/framework/scene_graph/components/light.h index a6ed3f411c..fd72512a6a 100644 --- a/framework/scene_graph/components/light.h +++ b/framework/scene_graph/components/light.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -28,6 +28,7 @@ #include "core/shader_module.h" #include "scene_graph/component.h" +#include "scene_graph/node.h" namespace vkb { @@ -68,9 +69,9 @@ class Light : public Component virtual std::type_index get_type() override; - void set_node(Node &node); + void set_node(vkb::scene_graph::NodeC &node); - Node *get_node(); + vkb::scene_graph::NodeC *get_node(); void set_light_type(const LightType &type); @@ -81,7 +82,7 @@ class Light : public Component const LightProperties &get_properties(); private: - Node *node{nullptr}; + vkb::scene_graph::NodeC *node = nullptr; LightType light_type; diff --git a/framework/scene_graph/components/mesh.cpp b/framework/scene_graph/components/mesh.cpp index b29966ba6d..79430d9b91 100644 --- a/framework/scene_graph/components/mesh.cpp +++ b/framework/scene_graph/components/mesh.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -50,12 +50,12 @@ const std::vector &Mesh::get_submeshes() const return submeshes; } -void Mesh::add_node(Node &node) +void Mesh::add_node(vkb::scene_graph::NodeC &node) { nodes.push_back(&node); } -const std::vector &Mesh::get_nodes() const +const std::vector &Mesh::get_nodes() const { return nodes; } diff --git a/framework/scene_graph/components/mesh.h b/framework/scene_graph/components/mesh.h index 400b4ce136..10a959435b 100644 --- a/framework/scene_graph/components/mesh.h +++ b/framework/scene_graph/components/mesh.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,6 +24,7 @@ #include "scene_graph/component.h" #include "scene_graph/components/aabb.h" +#include "scene_graph/node.h" namespace vkb { @@ -48,16 +49,16 @@ class Mesh : public Component const std::vector &get_submeshes() const; - void add_node(Node &node); + void add_node(vkb::scene_graph::NodeC &node); - const std::vector &get_nodes() const; + const std::vector &get_nodes() const; private: AABB bounds; std::vector submeshes; - std::vector nodes; + std::vector nodes; }; } // namespace sg } // namespace vkb diff --git a/framework/scene_graph/components/sampler.h b/framework/scene_graph/components/sampler.h index 585ea42bc1..411c41848a 100644 --- a/framework/scene_graph/components/sampler.h +++ b/framework/scene_graph/components/sampler.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,30 +18,73 @@ #pragma once -#include -#include -#include -#include - +#include "core/hpp_sampler.h" #include "core/sampler.h" #include "scene_graph/component.h" namespace vkb { -namespace sg +namespace scene_graph +{ +namespace components { -class Sampler : public Component +template +class Sampler : public vkb::sg::Component { public: - Sampler(const std::string &name, core::Sampler &&vk_sampler); + using CoreSamplerType = typename std::conditional::type; + + public: + Sampler(std::string const &name, CoreSamplerType &&core_sampler); Sampler(Sampler &&other) = default; + virtual ~Sampler() = default; - virtual ~Sampler() = default; + CoreSamplerType const &get_core_sampler() const; virtual std::type_index get_type() override; - core::Sampler vk_sampler; + private: + vkb::core::HPPSampler core_sampler; }; -} // namespace sg + +using SamplerC = Sampler; +using SamplerCpp = Sampler; + +// Member function definitions + +template <> +inline Sampler::Sampler(std::string const &name, vkb::core::HPPSampler &&core_sampler_) : + Component{name}, + core_sampler{std::move(core_sampler_)} +{ +} + +template <> +inline Sampler::Sampler(std::string const &name, vkb::core::Sampler &&core_sampler_) : + Component{name}, + core_sampler{std::move(reinterpret_cast(core_sampler_))} +{ +} + +template +inline typename Sampler::CoreSamplerType const &Sampler::get_core_sampler() const +{ + if constexpr (bindingType == BindingType::Cpp) + { + return core_sampler; + } + else + { + return reinterpret_cast(core_sampler); + } +} + +template +inline std::type_index Sampler::get_type() +{ + return typeid(Sampler); +} +} // namespace components +} // namespace scene_graph } // namespace vkb diff --git a/framework/scene_graph/components/sub_mesh.cpp b/framework/scene_graph/components/sub_mesh.cpp index d1e7f56a3e..cc10aa5acc 100644 --- a/framework/scene_graph/components/sub_mesh.cpp +++ b/framework/scene_graph/components/sub_mesh.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2021, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -36,8 +36,6 @@ std::type_index SubMesh::get_type() void SubMesh::set_attribute(const std::string &attribute_name, const VertexAttribute &attribute) { vertex_attributes[attribute_name] = attribute; - - compute_shader_variant(); } bool SubMesh::get_attribute(const std::string &attribute_name, VertexAttribute &attribute) const @@ -57,8 +55,6 @@ bool SubMesh::get_attribute(const std::string &attribute_name, VertexAttribute & void SubMesh::set_material(const Material &new_material) { material = &new_material; - - compute_shader_variant(); } const Material *SubMesh::get_material() const @@ -71,29 +67,6 @@ const ShaderVariant &SubMesh::get_shader_variant() const return shader_variant; } -void SubMesh::compute_shader_variant() -{ - shader_variant.clear(); - - if (material != nullptr) - { - for (auto &texture : material->textures) - { - std::string tex_name = texture.first; - std::transform(tex_name.begin(), tex_name.end(), tex_name.begin(), ::toupper); - - shader_variant.add_define("HAS_" + tex_name); - } - } - - for (auto &attribute : vertex_attributes) - { - std::string attrib_name = attribute.first; - std::transform(attrib_name.begin(), attrib_name.end(), attrib_name.begin(), ::toupper); - shader_variant.add_define("HAS_" + attrib_name); - } -} - ShaderVariant &SubMesh::get_mut_shader_variant() { return shader_variant; diff --git a/framework/scene_graph/components/sub_mesh.h b/framework/scene_graph/components/sub_mesh.h index d767469ae4..828583bfcb 100644 --- a/framework/scene_graph/components/sub_mesh.h +++ b/framework/scene_graph/components/sub_mesh.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -82,8 +82,6 @@ class SubMesh : public Component const Material *material{nullptr}; ShaderVariant shader_variant; - - void compute_shader_variant(); }; } // namespace sg } // namespace vkb diff --git a/framework/scene_graph/components/texture.cpp b/framework/scene_graph/components/texture.cpp index 0f26959364..ec64ff351e 100644 --- a/framework/scene_graph/components/texture.cpp +++ b/framework/scene_graph/components/texture.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -43,12 +43,12 @@ Image *Texture::get_image() return image; } -void Texture::set_sampler(Sampler &s) +void Texture::set_sampler(vkb::scene_graph::components::SamplerC &s) { sampler = &s; } -Sampler *Texture::get_sampler() +vkb::scene_graph::components::SamplerC *Texture::get_sampler() { assert(sampler && "Texture has no sampler"); return sampler; diff --git a/framework/scene_graph/components/texture.h b/framework/scene_graph/components/texture.h index bb6117710f..835c76ae1a 100644 --- a/framework/scene_graph/components/texture.h +++ b/framework/scene_graph/components/texture.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -47,14 +47,14 @@ class Texture : public Component Image *get_image(); - void set_sampler(Sampler &sampler); + void set_sampler(vkb::scene_graph::components::SamplerC &sampler); - Sampler *get_sampler(); + vkb::scene_graph::components::SamplerC *get_sampler(); private: Image *image{nullptr}; - Sampler *sampler{nullptr}; + vkb::scene_graph::components::SamplerC *sampler = nullptr; }; } // namespace sg } // namespace vkb diff --git a/framework/scene_graph/components/transform.cpp b/framework/scene_graph/components/transform.cpp index 8b58e6bb1b..beb0eff2e9 100644 --- a/framework/scene_graph/components/transform.cpp +++ b/framework/scene_graph/components/transform.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -26,12 +26,12 @@ namespace vkb { namespace sg { -Transform::Transform(Node &n) : +Transform::Transform(vkb::scene_graph::NodeC &n) : node{n} { } -Node &Transform::get_node() +vkb::scene_graph::NodeC &Transform::get_node() { return node; } diff --git a/framework/scene_graph/components/transform.h b/framework/scene_graph/components/transform.h index ff9b4b84d9..1a4b485d84 100644 --- a/framework/scene_graph/components/transform.h +++ b/framework/scene_graph/components/transform.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -31,18 +31,23 @@ namespace vkb { -namespace sg +namespace scene_graph { +template class Node; +using NodeC = Node; +} // namespace scene_graph +namespace sg +{ class Transform : public Component { public: - Transform(Node &node); + Transform(vkb::scene_graph::NodeC &node); virtual ~Transform() = default; - Node &get_node(); + vkb::scene_graph::NodeC &get_node(); virtual std::type_index get_type() override; @@ -72,7 +77,7 @@ class Transform : public Component void invalidate_world_matrix(); private: - Node &node; + vkb::scene_graph::NodeC &node; glm::vec3 translation = glm::vec3(0.0, 0.0, 0.0); diff --git a/framework/scene_graph/node.cpp b/framework/scene_graph/node.cpp deleted file mode 100644 index 8253a84c5e..0000000000 --- a/framework/scene_graph/node.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "node.h" - -#include "component.h" -#include "components/transform.h" - -namespace vkb -{ -namespace sg -{ -Node::Node(const size_t id, const std::string &name) : - id{id}, - name{name}, - transform{*this} -{ - set_component(transform); -} - -const size_t Node::get_id() const -{ - return id; -} - -const std::string &Node::get_name() const -{ - return name; -} - -void Node::set_parent(Node &p) -{ - parent = &p; - - transform.invalidate_world_matrix(); -} - -Node *Node::get_parent() const -{ - return parent; -} - -void Node::add_child(Node &child) -{ - children.push_back(&child); -} - -const std::vector &Node::get_children() const -{ - return children; -} - -void Node::set_component(Component &component) -{ - auto it = components.find(component.get_type()); - - if (it != components.end()) - { - it->second = &component; - } - else - { - components.insert(std::make_pair(component.get_type(), &component)); - } -} - -Component &Node::get_component(const std::type_index index) -{ - return *components.at(index); -} - -bool Node::has_component(const std::type_index index) -{ - return components.count(index) > 0; -} - -} // namespace sg -} // namespace vkb diff --git a/framework/scene_graph/node.h b/framework/scene_graph/node.h index 8a06bd8835..c25ef98eed 100644 --- a/framework/scene_graph/node.h +++ b/framework/scene_graph/node.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,75 +18,160 @@ #pragma once -#include -#include -#include -#include -#include - +#include "scene_graph/component.h" #include "scene_graph/components/transform.h" namespace vkb { -namespace sg +namespace scene_graph { -class Component; - /// @brief A leaf of the tree structure which can have children and a single parent. +template class Node { public: - Node(const size_t id, const std::string &name); + Node(size_t id, std::string const &name); virtual ~Node() = default; - const size_t get_id() const; + void add_child(Node &child); + std::vector *> const &get_children() const; + template + T &get_component(); + vkb::sg::Component &get_component(std::type_index index); + size_t get_id() const; + std::string const &get_name() const; + Node *get_parent(); + vkb::sg::Transform &get_transform(); + template + bool has_component() const; + bool has_component(std::type_index index) const; + void set_component(vkb::sg::Component &component); + void set_parent(Node &parent); + + private: + size_t id; + std::vector *> children; + std::unordered_map components; + std::string name; + Node *parent = nullptr; + vkb::sg::Transform transform; +}; + +using NodeC = Node; +using NodeCpp = Node; - const std::string &get_name() const; +// Member function definitions + +template +inline Node::Node(size_t id_, std::string const &name_) : + id{id_}, name{name_}, transform{*this} +{ + set_component(transform); +} - Transform &get_transform() +template +inline void Node::add_child(Node &child) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + children.push_back(&child); + } + else { - return transform; + children.push_back(reinterpret_cast(&child)); } +} - void set_parent(Node &parent); +template +std::vector *> const &Node::get_children() const +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + return children; + } + else + { + return reinterpret_cast const &>(children); + } +} - Node *get_parent() const; +template +template +inline T &Node::get_component() +{ + return dynamic_cast(get_component(typeid(T))); +} - void add_child(Node &child); +template +inline vkb::sg::Component &Node::get_component(std::type_index index) +{ + return *components.at(index); +} - const std::vector &get_children() const; +template +inline size_t Node::get_id() const +{ + return id; +} - void set_component(Component &component); +template +inline std::string const &Node::get_name() const +{ + return name; +} - template - inline T &get_component() +template +inline Node *Node::get_parent() +{ + if constexpr (bindingType == vkb::BindingType::Cpp) { - return dynamic_cast(get_component(typeid(T))); + return parent; } - - Component &get_component(const std::type_index index); - - template - bool has_component() + else { - return has_component(typeid(T)); + return reinterpret_cast(parent); } +} - bool has_component(const std::type_index index); - - private: - size_t id; +template +inline vkb::sg::Transform &Node::get_transform() +{ + return transform; +} - std::string name; +template +template +inline bool Node::has_component() const +{ + return has_component(typeid(T)); +} - Transform transform; +template +inline bool Node::has_component(std::type_index index) const +{ + return components.contains(index); +} - Node *parent{nullptr}; +template +inline void Node::set_component(vkb::sg::Component &component) +{ + components[component.get_type()] = &component; +} - std::vector children; +template +inline void Node::set_parent(Node &p) +{ + if constexpr (bindingType == vkb::BindingType::Cpp) + { + parent = &p; + } + else + { + parent = reinterpret_cast(&p); + } - std::unordered_map components; -}; -} // namespace sg + transform.invalidate_world_matrix(); +} +} // namespace scene_graph } // namespace vkb diff --git a/framework/scene_graph/scene.cpp b/framework/scene_graph/scene.cpp index 4c76d5352f..4705ef78c3 100644 --- a/framework/scene_graph/scene.cpp +++ b/framework/scene_graph/scene.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2023, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -41,18 +41,18 @@ const std::string &Scene::get_name() const return name; } -void Scene::set_nodes(std::vector> &&n) +void Scene::set_nodes(std::vector> &&n) { assert(nodes.empty() && "Scene nodes were already set"); nodes = std::move(n); } -void Scene::add_node(std::unique_ptr &&n) +void Scene::add_node(std::unique_ptr &&n) { nodes.emplace_back(std::move(n)); } -void Scene::add_child(Node &child) +void Scene::add_child(vkb::scene_graph::NodeC &child) { root->add_child(child); } @@ -65,7 +65,7 @@ std::unique_ptr Scene::get_model(uint32_t index) return std::move(meshes[index]); } -void Scene::add_component(std::unique_ptr &&component, Node &node) +void Scene::add_component(std::unique_ptr &&component, vkb::scene_graph::NodeC &node) { node.set_component(*component); @@ -99,11 +99,11 @@ bool Scene::has_component(const std::type_index &type_info) const return (component != components.end() && !component->second.empty()); } -Node *Scene::find_node(const std::string &node_name) +vkb::scene_graph::NodeC *Scene::find_node(const std::string &node_name) { for (auto root_node : root->get_children()) { - std::queue traverse_nodes{}; + std::queue traverse_nodes{}; traverse_nodes.push(root_node); while (!traverse_nodes.empty()) @@ -126,12 +126,12 @@ Node *Scene::find_node(const std::string &node_name) return nullptr; } -void Scene::set_root_node(Node &node) +void Scene::set_root_node(vkb::scene_graph::NodeC &node) { root = &node; } -Node &Scene::get_root_node() +vkb::scene_graph::NodeC &Scene::get_root_node() { return *root; } diff --git a/framework/scene_graph/scene.h b/framework/scene_graph/scene.h index e572994cf1..0a1e4caad5 100644 --- a/framework/scene_graph/scene.h +++ b/framework/scene_graph/scene.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2020, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -26,12 +26,12 @@ #include "scene_graph/components/light.h" #include "scene_graph/components/texture.h" +#include "scene_graph/node.h" namespace vkb { namespace sg { -class Node; class Component; class SubMesh; @@ -48,17 +48,17 @@ class Scene const std::string &get_name() const; - void set_nodes(std::vector> &&nodes); + void set_nodes(std::vector> &&nodes); - void add_node(std::unique_ptr &&node); + void add_node(std::unique_ptr &&node); - void add_child(Node &child); + void add_child(vkb::scene_graph::NodeC &child); std::unique_ptr get_model(uint32_t index = 0); void add_component(std::unique_ptr &&component); - void add_component(std::unique_ptr &&component, Node &node); + void add_component(std::unique_ptr &&component, vkb::scene_graph::NodeC &node); /** * @brief Set list of components for the given type @@ -124,19 +124,19 @@ class Scene bool has_component(const std::type_index &type_info) const; - Node *find_node(const std::string &name); + vkb::scene_graph::NodeC *find_node(const std::string &name); - void set_root_node(Node &node); + void set_root_node(vkb::scene_graph::NodeC &node); - Node &get_root_node(); + vkb::scene_graph::NodeC &get_root_node(); private: std::string name; /// List of all the nodes - std::vector> nodes; + std::vector> nodes; - Node *root{nullptr}; + vkb::scene_graph::NodeC *root{nullptr}; std::unordered_map>> components; }; diff --git a/framework/scene_graph/script.cpp b/framework/scene_graph/script.cpp index a7338783c7..3ffbb50f9a 100644 --- a/framework/scene_graph/script.cpp +++ b/framework/scene_graph/script.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -38,13 +38,13 @@ void Script::resize(uint32_t /*width*/, uint32_t /*height*/) { } -NodeScript::NodeScript(Node &node, const std::string &name) : +NodeScript::NodeScript(vkb::scene_graph::NodeC &node, const std::string &name) : Script{name}, node{node} { } -Node &NodeScript::get_node() +vkb::scene_graph::NodeC &NodeScript::get_node() { return node; } diff --git a/framework/scene_graph/script.h b/framework/scene_graph/script.h index 32234f3c1f..cf5c661714 100644 --- a/framework/scene_graph/script.h +++ b/framework/scene_graph/script.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,6 +24,7 @@ #include "platform/input_events.h" #include "scene_graph/component.h" +#include "scene_graph/node.h" namespace vkb { @@ -55,14 +56,14 @@ class Script : public Component class NodeScript : public Script { public: - NodeScript(Node &node, const std::string &name = ""); + NodeScript(vkb::scene_graph::NodeC &node, const std::string &name = ""); virtual ~NodeScript() = default; - Node &get_node(); + vkb::scene_graph::NodeC &get_node(); private: - Node &node; + vkb::scene_graph::NodeC &node; }; } // namespace sg } // namespace vkb diff --git a/framework/scene_graph/scripts/animation.cpp b/framework/scene_graph/scripts/animation.cpp index 38494d3e00..7b1e8b0a1b 100644 --- a/framework/scene_graph/scripts/animation.cpp +++ b/framework/scene_graph/scripts/animation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2023, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -33,7 +33,7 @@ Animation::Animation(const Animation &other) : { } -void Animation::add_channel(Node &node, const AnimationTarget &target, const AnimationSampler &sampler) +void Animation::add_channel(vkb::scene_graph::NodeC &node, const AnimationTarget &target, const AnimationSampler &sampler) { channels.push_back({node, target, sampler}); } diff --git a/framework/scene_graph/scripts/animation.h b/framework/scene_graph/scripts/animation.h index e268db8179..bec7c063ca 100644 --- a/framework/scene_graph/scripts/animation.h +++ b/framework/scene_graph/scripts/animation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -55,7 +55,7 @@ struct AnimationSampler struct AnimationChannel { - Node &node; + vkb::scene_graph::NodeC &node; AnimationTarget target; @@ -73,7 +73,7 @@ class Animation : public Script void update_times(float start_time, float end_time); - void add_channel(Node &node, const AnimationTarget &target, const AnimationSampler &sampler); + void add_channel(vkb::scene_graph::NodeC &node, const AnimationTarget &target, const AnimationSampler &sampler); private: std::vector channels; diff --git a/framework/scene_graph/scripts/free_camera.cpp b/framework/scene_graph/scripts/free_camera.cpp index d77d901e98..e2ff16a424 100644 --- a/framework/scene_graph/scripts/free_camera.cpp +++ b/framework/scene_graph/scripts/free_camera.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2020-2024, Andrew Cox, Huawei Technologies Research & Development (UK) Limited +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2020-2025, Andrew Cox, Huawei Technologies Research & Development (UK) Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -44,7 +44,7 @@ const float FreeCamera::TRANSLATION_MOVE_STEP = 50.0f; const uint32_t FreeCamera::TRANSLATION_MOVE_SPEED = 4; -FreeCamera::FreeCamera(Node &node) : +FreeCamera::FreeCamera(vkb::scene_graph::NodeC &node) : NodeScript{node, "FreeCamera"} {} diff --git a/framework/scene_graph/scripts/free_camera.h b/framework/scene_graph/scripts/free_camera.h index 49ab2e39e2..c5c06c5809 100644 --- a/framework/scene_graph/scripts/free_camera.h +++ b/framework/scene_graph/scripts/free_camera.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -48,7 +48,7 @@ class FreeCamera : public NodeScript static const uint32_t TRANSLATION_MOVE_SPEED; - FreeCamera(Node &node); + FreeCamera(vkb::scene_graph::NodeC &node); virtual ~FreeCamera() = default; diff --git a/framework/scene_graph/scripts/node_animation.cpp b/framework/scene_graph/scripts/node_animation.cpp index 908703fde8..ee1944de71 100644 --- a/framework/scene_graph/scripts/node_animation.cpp +++ b/framework/scene_graph/scripts/node_animation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ namespace vkb { namespace sg { -NodeAnimation::NodeAnimation(Node &node, TransformAnimFn animation_fn) : +NodeAnimation::NodeAnimation(vkb::scene_graph::NodeC &node, TransformAnimFn animation_fn) : NodeScript{node, ""}, animation_fn{animation_fn} { diff --git a/framework/scene_graph/scripts/node_animation.h b/framework/scene_graph/scripts/node_animation.h index 5ee902fc23..3768636ab7 100644 --- a/framework/scene_graph/scripts/node_animation.h +++ b/framework/scene_graph/scripts/node_animation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -39,7 +39,7 @@ namespace sg class NodeAnimation : public NodeScript { public: - NodeAnimation(Node &node, TransformAnimFn animation_fn); + NodeAnimation(vkb::scene_graph::NodeC &node, TransformAnimFn animation_fn); virtual ~NodeAnimation() = default; diff --git a/framework/semaphore_pool.cpp b/framework/semaphore_pool.cpp index 9fd3e9704c..1157fdd037 100644 --- a/framework/semaphore_pool.cpp +++ b/framework/semaphore_pool.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2023, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,7 @@ namespace vkb { -SemaphorePool::SemaphorePool(Device &device) : +SemaphorePool::SemaphorePool(vkb::core::DeviceC &device) : device{device} { } diff --git a/framework/semaphore_pool.h b/framework/semaphore_pool.h index 3a6314adb4..0271f30489 100644 --- a/framework/semaphore_pool.h +++ b/framework/semaphore_pool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,12 +22,17 @@ namespace vkb { +namespace core +{ +template class Device; +using DeviceC = Device; +} // namespace core class SemaphorePool { public: - SemaphorePool(Device &device); + SemaphorePool(vkb::core::DeviceC &device); SemaphorePool(const SemaphorePool &) = delete; @@ -48,7 +53,7 @@ class SemaphorePool uint32_t get_active_semaphore_count() const; private: - Device &device; + vkb::core::DeviceC &device; std::vector semaphores; std::vector released_semaphores; diff --git a/framework/spirv_reflection.h b/framework/spirv_reflection.h index 4709bf24ae..3e04977a68 100644 --- a/framework/spirv_reflection.h +++ b/framework/spirv_reflection.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -23,7 +23,10 @@ #include "common/error.h" +#pragma warning(push) +#pragma warning(disable : 4065) #include +#pragma warning(pop) #include "common/vk_common.h" #include "core/shader_module.h" diff --git a/framework/stats/frame_time_stats_provider.h b/framework/stats/frame_time_stats_provider.h index f62f2aa4ca..7e04a077dc 100644 --- a/framework/stats/frame_time_stats_provider.h +++ b/framework/stats/frame_time_stats_provider.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Broadcom Inc. and Contributors +/* Copyright (c) 2020-2025, Broadcom Inc. and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +18,7 @@ #pragma once #include "stats_provider.h" +#include namespace vkb { diff --git a/framework/stats/hpp_stats.h b/framework/stats/hpp_stats.h index 02630c901c..c46050991a 100644 --- a/framework/stats/hpp_stats.h +++ b/framework/stats/hpp_stats.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,12 +17,17 @@ #pragma once -#include - -#include +#include "stats/stats.h" namespace vkb { +namespace rendering +{ +template +class RenderContext; +using RenderContextCpp = RenderContext; +} // namespace rendering + namespace stats { /** @@ -41,18 +46,18 @@ class HPPStats : private vkb::Stats using vkb::Stats::resize; using vkb::Stats::update; - explicit HPPStats(vkb::rendering::HPPRenderContext &render_context, size_t buffer_size = 16) : - vkb::Stats(reinterpret_cast(render_context), buffer_size) + explicit HPPStats(vkb::rendering::RenderContextCpp &render_context, size_t buffer_size = 16) : + vkb::Stats(reinterpret_cast(render_context), buffer_size) {} - void begin_sampling(vkb::core::HPPCommandBuffer &cb) + void begin_sampling(vkb::core::CommandBufferCpp &cb) { - vkb::Stats::begin_sampling(reinterpret_cast(cb)); + vkb::Stats::begin_sampling(reinterpret_cast(cb)); } - void end_sampling(vkb::core::HPPCommandBuffer &cb) + void end_sampling(vkb::core::CommandBufferCpp &cb) { - vkb::Stats::end_sampling(reinterpret_cast(cb)); + vkb::Stats::end_sampling(reinterpret_cast(cb)); } }; diff --git a/framework/stats/hwcpipe_stats_provider.cpp b/framework/stats/hwcpipe_stats_provider.cpp index 0d0775a6d2..58928aa277 100644 --- a/framework/stats/hwcpipe_stats_provider.cpp +++ b/framework/stats/hwcpipe_stats_provider.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2020-2024, Broadcom Inc. +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2020-2025, Broadcom Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,9 +20,9 @@ namespace { -const char *get_product_family_name(hwcpipe::device::product_id::gpu_family f) +const char *get_product_family_name(hwcpipe::device::gpu_family f) { - using gpu_family = hwcpipe::device::product_id::gpu_family; + using gpu_family = hwcpipe::device::gpu_family; switch (f) { @@ -46,12 +46,12 @@ HWCPipeStatsProvider::HWCPipeStatsProvider(std::set &requested_stats) // clang-format off StatDataMap hwcpipe_stats = { {StatIndex::gpu_cycles, {hwcpipe_counter::MaliGPUActiveCy}}, - {StatIndex::gpu_vertex_cycles, {hwcpipe_counter::MaliNonFragQueueActiveCy, {MaliNonFragActiveCy, MaliBinningIterActiveCy} }}, + {StatIndex::gpu_vertex_cycles, {hwcpipe_counter::MaliNonFragQueueActiveCy, {MaliNonFragActiveCy, MaliBinningQueueActiveCy} }}, {StatIndex::gpu_load_store_cycles, {hwcpipe_counter::MaliLSIssueCy}}, {StatIndex::gpu_tiles, {hwcpipe_counter::MaliFragTile}}, {StatIndex::gpu_killed_tiles, {hwcpipe_counter::MaliFragTileKill}}, - {StatIndex::gpu_fragment_cycles, {hwcpipe_counter::MaliFragQueueActiveCy, {MaliFragActiveCy, MaliMainIterActiveCy}}}, - {StatIndex::gpu_fragment_jobs, {hwcpipe_counter::MaliFragQueueJob, {MaliFragIterJob, MaliMainIterJob}}}, + {StatIndex::gpu_fragment_cycles, {hwcpipe_counter::MaliFragQueueActiveCy, {MaliFragActiveCy, MaliMainQueueActiveCy}}}, + {StatIndex::gpu_fragment_jobs, {hwcpipe_counter::MaliFragQueueJob, {MaliMainQueueJob}}}, {StatIndex::gpu_ext_reads, {hwcpipe_counter::MaliExtBusRdBt}}, {StatIndex::gpu_ext_writes, {hwcpipe_counter::MaliExtBusWrBt}}, {StatIndex::gpu_ext_read_stalls, {hwcpipe_counter::MaliExtBusRdStallCy}}, @@ -67,7 +67,7 @@ HWCPipeStatsProvider::HWCPipeStatsProvider(std::set &requested_stats) LOGI("HWCPipe: ------------------------------------------------------------"); LOGI("HWCPipe: GPU Device {}:", gpu.get_device_number()); LOGI("HWCPipe: ------------------------------------------------------------"); - LOGI("HWCPipe: Product Family: {}", get_product_family_name(gpu.get_product_id().get_gpu_family())); + LOGI("HWCPipe: Product Family: {}", get_product_family_name(gpu.get_gpu_family())); LOGI("HWCPipe: Number of Cores: {}", gpu.num_shader_cores()); LOGI("HWCPipe: Bus Width: {}", gpu.bus_width()); } diff --git a/framework/stats/hwcpipe_stats_provider.h b/framework/stats/hwcpipe_stats_provider.h index 7767b2ab0c..ab44c890a2 100644 --- a/framework/stats/hwcpipe_stats_provider.h +++ b/framework/stats/hwcpipe_stats_provider.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2020-2024, Broadcom Inc. +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2020-2025, Broadcom Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -46,7 +46,9 @@ class HWCPipeStatsProvider : public StatsProvider StatScaling scaling; hwcpipe_counter divisor; - StatData() = default; + StatData(hwcpipe_counter _counter = {}, std::vector _fb_list = {}, StatScaling _sc = {}, hwcpipe_counter div = {}) : + counter(_counter), fallback_list(std::move(_fb_list)), scaling(_sc), divisor(div) + {} }; using StatDataMap = std::unordered_map; diff --git a/framework/stats/stats.cpp b/framework/stats/stats.cpp index 1bcd70e6e5..088e9f5973 100644 --- a/framework/stats/stats.cpp +++ b/framework/stats/stats.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2020-2024, Broadcom Inc. +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2020-2025, Broadcom Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -33,7 +33,7 @@ namespace vkb { -Stats::Stats(RenderContext &render_context, size_t buffer_size) : +Stats::Stats(vkb::rendering::RenderContextC &render_context, size_t buffer_size) : render_context(render_context), buffer_size(buffer_size) { @@ -430,7 +430,7 @@ void Stats::profile_counters() const #endif } -void Stats::begin_sampling(CommandBuffer &cb) +void Stats::begin_sampling(vkb::core::CommandBufferC &cb) { // Inform the providers for (auto &p : providers) @@ -439,7 +439,7 @@ void Stats::begin_sampling(CommandBuffer &cb) } } -void Stats::end_sampling(CommandBuffer &cb) +void Stats::end_sampling(vkb::core::CommandBufferC &cb) { // Inform the providers for (auto &p : providers) diff --git a/framework/stats/stats.h b/framework/stats/stats.h index 5db9f337c2..5ecb75ae8f 100644 --- a/framework/stats/stats.h +++ b/framework/stats/stats.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors - * Copyright (c) 2020-2024, Broadcom Inc. +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2020-2025, Broadcom Inc. * * SPDX-License-Identifier: Apache-2.0 * @@ -31,9 +31,20 @@ namespace vkb { -class Device; + +namespace core +{ +template class CommandBuffer; +using CommandBufferC = CommandBuffer; +} // namespace core + +namespace rendering +{ +template class RenderContext; +using RenderContextC = RenderContext; +} // namespace rendering /* * @brief Helper class for querying statistics about the CPU and the GPU @@ -46,7 +57,7 @@ class Stats * @param render_context The RenderContext for this sample * @param buffer_size Size of the circular buffers */ - explicit Stats(RenderContext &render_context, size_t buffer_size = 16); + explicit Stats(vkb::rendering::RenderContextC &render_context, size_t buffer_size = 16); /** * @brief Destroys the Stats object @@ -117,7 +128,7 @@ class Stats * when this method is called. * @param cb The command buffer */ - void begin_sampling(CommandBuffer &cb); + void begin_sampling(vkb::core::CommandBufferC &cb); /** * @brief A command buffer that we want to collect stats about is about to be ended @@ -131,11 +142,11 @@ class Stats * state when this method is called. * @param cb The command buffer */ - void end_sampling(CommandBuffer &cb); + void end_sampling(vkb::core::CommandBufferC &cb); private: /// The render context - RenderContext &render_context; + vkb::rendering::RenderContextC &render_context; /// Stats that were requested - they may not all be available std::set requested_stats; diff --git a/framework/stats/stats_provider.h b/framework/stats/stats_provider.h index a5aa92013a..c6d33073c6 100644 --- a/framework/stats/stats_provider.h +++ b/framework/stats/stats_provider.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Broadcom Inc. and Contributors +/* Copyright (c) 2020-2025, Broadcom Inc. and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,15 +17,17 @@ #pragma once +#include "common/vk_common.h" #include "stats_common.h" -#include -#include -#include - namespace vkb { +namespace core +{ +template class CommandBuffer; +using CommandBufferC = CommandBuffer; +} // namespace core /** * @brief Abstract interface for all StatsProvider classes @@ -87,14 +89,14 @@ class StatsProvider * @brief A command buffer that we want stats about has just begun * @param cb The command buffer */ - virtual void begin_sampling(CommandBuffer &cb) + virtual void begin_sampling(vkb::core::CommandBufferC &cb) {} /** * @brief A command buffer that we want stats about is about to be ended * @param cb The command buffer */ - virtual void end_sampling(CommandBuffer &cb) + virtual void end_sampling(vkb::core::CommandBufferC &cb) {} protected: diff --git a/framework/stats/vulkan_stats_provider.cpp b/framework/stats/vulkan_stats_provider.cpp index 65fee117cd..2094bb9b7f 100644 --- a/framework/stats/vulkan_stats_provider.cpp +++ b/framework/stats/vulkan_stats_provider.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Broadcom Inc. and Contributors +/* Copyright (c) 2020-2025, Broadcom Inc. and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -15,19 +15,18 @@ * limitations under the License. */ -#include "core/device.h" - +#include "stats/vulkan_stats_provider.h" #include "core/command_buffer.h" +#include "core/device.h" #include "rendering/render_context.h" -#include "vulkan_stats_provider.h" #include namespace vkb { -VulkanStatsProvider::VulkanStatsProvider(std::set &requested_stats, - const CounterSamplingConfig &sampling_config, - RenderContext &render_context) : +VulkanStatsProvider::VulkanStatsProvider(std::set &requested_stats, + const CounterSamplingConfig &sampling_config, + vkb::rendering::RenderContextC &render_context) : render_context(render_context) { // Check all the Vulkan capabilities we require are present @@ -36,40 +35,24 @@ VulkanStatsProvider::VulkanStatsProvider(std::set &requested_ return; } - Device &device = render_context.get_device(); - const PhysicalDevice &gpu = device.get_gpu(); + vkb::core::DeviceC &device = render_context.get_device(); + vkb::core::PhysicalDeviceC const &gpu = device.get_gpu(); has_timestamps = gpu.get_properties().limits.timestampComputeAndGraphics; timestamp_period = gpu.get_properties().limits.timestampPeriod; // Interrogate device for supported stats - uint32_t queue_family_index = device.get_queue_family_index(VK_QUEUE_GRAPHICS_BIT); + uint32_t queue_family_index = vkb::get_queue_family_index(gpu.get_queue_family_properties(), VK_QUEUE_GRAPHICS_BIT); - // Query number of available counters - uint32_t count = 0; - gpu.enumerate_queue_family_performance_query_counters(queue_family_index, &count, - nullptr, nullptr); - - if (count == 0) + std::vector counters; + std::vector descs; + std::tie(counters, descs) = gpu.enumerate_queue_family_performance_query_counters(queue_family_index); + assert(counters.size() == descs.size()); + if (counters.size() == 0 || descs.size() == 0) { return; // No counters available } - std::vector counters(count); - std::vector descs(count); - - for (uint32_t i = 0; i < count; i++) - { - counters[i].sType = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR; - counters[i].pNext = nullptr; - descs[i].sType = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR; - descs[i].pNext = nullptr; - } - - // Now get the list of counters and their descriptions - gpu.enumerate_queue_family_performance_query_counters(queue_family_index, &count, - counters.data(), descs.data()); - // Every vendor has a different set of performance counters each // with different names. Match them to the stats we want, where available. if (!fill_vendor_data()) @@ -225,9 +208,9 @@ bool VulkanStatsProvider::fill_vendor_data() bool VulkanStatsProvider::create_query_pools(uint32_t queue_family_index) { - Device &device = render_context.get_device(); - const PhysicalDevice &gpu = device.get_gpu(); - uint32_t num_framebuffers = static_cast(render_context.get_render_frames().size()); + vkb::core::DeviceC &device = render_context.get_device(); + vkb::core::PhysicalDeviceC const &gpu = device.get_gpu(); + uint32_t num_framebuffers = static_cast(render_context.get_render_frames().size()); // Now we know the available counters, we can build a query pool that will collect them. // We will check that the counters can be collected in a single pass. Multi-pass would @@ -290,10 +273,10 @@ bool VulkanStatsProvider::is_supported(const CounterSamplingConfig &sampling_con return false; } - Device &device = render_context.get_device(); + vkb::core::DeviceC &device = render_context.get_device(); // The VK_KHR_performance_query must be available and enabled - if (!(device.is_enabled("VK_KHR_performance_query") && device.is_enabled("VK_EXT_host_query_reset"))) + if (!(device.is_extension_enabled("VK_KHR_performance_query") && device.is_extension_enabled("VK_EXT_host_query_reset"))) { return false; } @@ -335,7 +318,7 @@ const StatGraphData &VulkanStatsProvider::get_graph_data(StatIndex index) const return default_graph_map[index]; } -void VulkanStatsProvider::begin_sampling(CommandBuffer &cb) +void VulkanStatsProvider::begin_sampling(vkb::core::CommandBufferC &cb) { uint32_t active_frame_idx = render_context.get_active_frame_index(); if (timestamp_pool) @@ -355,7 +338,7 @@ void VulkanStatsProvider::begin_sampling(CommandBuffer &cb) } } -void VulkanStatsProvider::end_sampling(CommandBuffer &cb) +void VulkanStatsProvider::end_sampling(vkb::core::CommandBufferC &cb) { uint32_t active_frame_idx = render_context.get_active_frame_index(); diff --git a/framework/stats/vulkan_stats_provider.h b/framework/stats/vulkan_stats_provider.h index fdd51722e4..f18888b167 100644 --- a/framework/stats/vulkan_stats_provider.h +++ b/framework/stats/vulkan_stats_provider.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Broadcom Inc. and Contributors +/* Copyright (c) 2020-2025, Broadcom Inc. and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,12 @@ namespace vkb { +namespace rendering +{ +template class RenderContext; +using RenderContextC = RenderContext; +} // namespace rendering class VulkanStatsProvider : public StatsProvider { @@ -83,8 +88,7 @@ class VulkanStatsProvider : public StatsProvider * @param sampling_config Sampling mode configuration (polling or continuous) * @param render_context The render context */ - VulkanStatsProvider(std::set &requested_stats, const CounterSamplingConfig &sampling_config, - RenderContext &render_context); + VulkanStatsProvider(std::set &requested_stats, const CounterSamplingConfig &sampling_config, vkb::rendering::RenderContextC &render_context); /** * @brief Destructs a VulkanStatsProvider @@ -114,13 +118,13 @@ class VulkanStatsProvider : public StatsProvider * @brief A command buffer that we want stats about has just begun * @param cb The command buffer */ - void begin_sampling(CommandBuffer &cb) override; + void begin_sampling(vkb::core::CommandBufferC &cb) override; /** * @brief A command buffer that we want stats about is about to be ended * @param cb The command buffer */ - void end_sampling(CommandBuffer &cb) override; + void end_sampling(vkb::core::CommandBufferC &cb) override; private: bool is_supported(const CounterSamplingConfig &sampling_config) const; @@ -133,7 +137,7 @@ class VulkanStatsProvider : public StatsProvider private: // The render context - RenderContext &render_context; + vkb::rendering::RenderContextC &render_context; // The query pool for the performance queries std::unique_ptr query_pool; diff --git a/framework/vulkan_sample.h b/framework/vulkan_sample.h index 4f9b7f9dd5..ec7106ac62 100644 --- a/framework/vulkan_sample.h +++ b/framework/vulkan_sample.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors - * Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -19,13 +19,13 @@ #pragma once #include "common/hpp_utils.h" +#include "core/debug.h" +#include "gui.h" #include "hpp_gltf_loader.h" -#include "hpp_gui.h" #include "platform/application.h" +#include "platform/window.h" #include "rendering/hpp_render_pipeline.h" -#include "scene_graph/components/camera.h" -#include "scene_graph/hpp_scene.h" -#include "scene_graph/scripts/animation.h" +#include "stats/hpp_stats.h" #if defined(PLATFORM__MACOS) # include @@ -79,11 +79,11 @@ namespace vkb * - updating Stats and Gui * - getting an active RenderTarget constructed by the factory function of the RenderFrame * - setting up barriers for color and depth, note that these are only for the default RenderTarget - * - calling VulkanSample::draw_swapchain_renderpass (see below) + * - calling VulkanSample::draw_renderpass (see below) * - setting up a barrier for the Swapchain transition to present * - submitting the CommandBuffer and end the Frame (present) * - * @subsection draw_swapchain Draw swapchain renderpass + * @subsection draw_renderpass Draw renderpass * The function starts and ends a RenderPass which includes setting up viewport, scissors, * blend state (etc.) and calling draw_scene. * Note that RenderPipeline::draw is not virtual in RenderPipeline, but internally it calls @@ -101,13 +101,11 @@ namespace vkb * - Core classes: Classes in vkb::core wrap Vulkan objects for indexing and hashing. */ -class Gui; class RenderPipeline; +class Stats; namespace core { -class HPPCommandBuffer; -class HPPDebugUtils; class HPPDevice; class HPPInstance; class HPPPhysicalDevice; @@ -115,7 +113,9 @@ class HPPPhysicalDevice; namespace rendering { -class HPPRenderContext; +template +class RenderContext; + class HPPRenderTarget; } // namespace rendering @@ -136,12 +136,6 @@ class VulkanSample : public vkb::Application VulkanSample() = default; ~VulkanSample() override; - using CommandBufferType = typename std::conditional::type; - using DeviceType = typename std::conditional::type; - using GuiType = typename std::conditional::type; - using InstanceType = typename std::conditional::type; - using PhysicalDeviceType = typename std::conditional::type; - using RenderContextType = typename std::conditional::type; using RenderPipelineType = typename std::conditional::type; using RenderTargetType = typename std::conditional::type; using SceneType = typename std::conditional::type; @@ -151,10 +145,10 @@ class VulkanSample : public vkb::Application using SurfaceFormatType = typename std::conditional::type; using SurfaceType = typename std::conditional::type; - Configuration &get_configuration(); - RenderContextType &get_render_context(); - RenderContextType const &get_render_context() const; - bool has_render_context() const; + Configuration &get_configuration(); + vkb::rendering::RenderContext &get_render_context(); + vkb::rendering::RenderContext const &get_render_context() const; + bool has_render_context() const; /// /// PROTECTED VIRTUAL INTERFACE @@ -169,13 +163,13 @@ class VulkanSample : public vkb::Application * @brief Create the Vulkan device used by this sample * @note Can be overridden to implement custom device creation */ - virtual std::unique_ptr create_device(PhysicalDeviceType &gpu); + virtual std::unique_ptr> create_device(vkb::core::PhysicalDevice &gpu); /** * @brief Create the Vulkan instance used by this sample * @note Can be overridden to implement custom instance creation */ - virtual std::unique_ptr create_instance(); + virtual std::unique_ptr> create_instance(); /** * @brief Override this to customise the creation of the render_context @@ -187,7 +181,7 @@ class VulkanSample : public vkb::Application * @param command_buffer The command buffer to record the commands to * @param render_target The render target that is being drawn to */ - virtual void draw(CommandBufferType &command_buffer, RenderTargetType &render_target); + virtual void draw(vkb::core::CommandBuffer &command_buffer, RenderTargetType &render_target); /** * @brief Samples should override this function to draw their interface @@ -199,14 +193,7 @@ class VulkanSample : public vkb::Application * @param command_buffer The command buffer to record the commands to * @param render_target The render target that is being drawn to */ - virtual void draw_renderpass(CommandBufferType &command_buffer, RenderTargetType &render_target); - - /** - * @brief Get additional sample-specific instance layers. - * - * @return Vector of additional instance layers. Default is empty vector. - */ - virtual const std::vector get_validation_layers(); + virtual void draw_renderpass(vkb::core::CommandBuffer &command_buffer, RenderTargetType &render_target); /** * @brief Override this to customise the creation of the swapchain and render_context @@ -217,12 +204,12 @@ class VulkanSample : public vkb::Application * @brief Triggers the render pipeline, it can be overridden by samples to specialize their rendering logic * @param command_buffer The command buffer to record the commands to */ - virtual void render(CommandBufferType &command_buffer); + virtual void render(vkb::core::CommandBuffer &command_buffer); /** * @brief Request features from the gpu based on what is supported */ - virtual void request_gpu_features(PhysicalDeviceType &gpu); + virtual void request_gpu_features(vkb::core::PhysicalDevice &gpu); /** * @brief Resets the stats view max values for high demanding configs @@ -253,6 +240,13 @@ class VulkanSample : public vkb::Application */ void add_instance_extension(const char *extension, bool optional = false); + /** + * @brief Add a sample-specific instance layer + * @param layer The layer name + * @param optional (Optional) Whether the extension is optional + */ + void add_instance_layer(const char *layer, bool optional = false); + /** * @brief Add a sample-specific layer setting * @param layerSetting The layer setting @@ -266,24 +260,24 @@ class VulkanSample : public vkb::Application */ void create_render_context(const std::vector &surface_priority_list); - DeviceType &get_device(); - DeviceType const &get_device() const; - GuiType &get_gui(); - GuiType const &get_gui() const; - InstanceType &get_instance(); - InstanceType const &get_instance() const; - RenderPipelineType &get_render_pipeline(); - RenderPipelineType const &get_render_pipeline() const; - SceneType &get_scene(); - StatsType &get_stats(); - SurfaceType get_surface() const; - std::vector &get_surface_priority_list(); - std::vector const &get_surface_priority_list() const; - bool has_device() const; - bool has_instance() const; - bool has_gui() const; - bool has_render_pipeline() const; - bool has_scene(); + vkb::core::Device &get_device(); + vkb::core::Device const &get_device() const; + vkb::Gui &get_gui(); + vkb::Gui const &get_gui() const; + vkb::core::Instance &get_instance(); + vkb::core::Instance const &get_instance() const; + RenderPipelineType &get_render_pipeline(); + RenderPipelineType const &get_render_pipeline() const; + SceneType &get_scene(); + StatsType &get_stats(); + SurfaceType get_surface() const; + std::vector &get_surface_priority_list(); + std::vector const &get_surface_priority_list() const; + bool has_device() const; + bool has_instance() const; + bool has_gui() const; + bool has_render_pipeline() const; + bool has_scene(); /** * @brief Loads the scene @@ -311,7 +305,7 @@ class VulkanSample : public vkb::Application */ void set_high_priority_graphics_queue_enable(bool enable); - void set_render_context(std::unique_ptr &&render_context); + void set_render_context(std::unique_ptr> &&render_context); void set_render_pipeline(std::unique_ptr &&render_pipeline); @@ -341,17 +335,17 @@ class VulkanSample : public vkb::Application /** * @brief Set viewport and scissor state in command buffer for a given extent */ - static void set_viewport_and_scissor(CommandBufferType const &command_buffer, Extent2DType const &extent); + static void set_viewport_and_scissor(vkb::core::CommandBuffer const &command_buffer, Extent2DType const &extent); /// /// PRIVATE INTERFACE /// private: void create_render_context_impl(const std::vector &surface_priority_list); - void draw_impl(vkb::core::HPPCommandBuffer &command_buffer, vkb::rendering::HPPRenderTarget &render_target); - void draw_renderpass_impl(vkb::core::HPPCommandBuffer &command_buffer, vkb::rendering::HPPRenderTarget &render_target); - void render_impl(vkb::core::HPPCommandBuffer &command_buffer); - static void set_viewport_and_scissor_impl(vkb::core::HPPCommandBuffer const &command_buffer, vk::Extent2D const &extent); + void draw_impl(vkb::core::CommandBufferCpp &command_buffer, vkb::rendering::HPPRenderTarget &render_target); + void draw_renderpass_impl(vkb::core::CommandBufferCpp &command_buffer, vkb::rendering::HPPRenderTarget &render_target); + void render_impl(vkb::core::CommandBufferCpp &command_buffer); + static void set_viewport_and_scissor_impl(vkb::core::CommandBufferCpp const &command_buffer, vk::Extent2D const &extent); /** * @brief Get sample-specific device extensions. @@ -367,6 +361,13 @@ class VulkanSample : public vkb::Application */ std::unordered_map const &get_instance_extensions() const; + /** + * @brief Get sample-specific instance layers. + * + * @return Map of instance layers and whether or not they are optional. Default is empty map. + */ + std::unordered_map const &get_instance_layers() const; + /** * @brief Get sample-specific layer settings. * @@ -381,17 +382,17 @@ class VulkanSample : public vkb::Application /** * @brief The Vulkan instance */ - std::unique_ptr instance; + std::unique_ptr instance; /** * @brief The Vulkan device */ - std::unique_ptr device; + std::unique_ptr device; /** * @brief Context used for rendering, it is responsible for managing the frames and their underlying images */ - std::unique_ptr render_context; + std::unique_ptr render_context; /** * @brief Pipeline used for rendering, it should be set up by the concrete sample @@ -403,7 +404,7 @@ class VulkanSample : public vkb::Application */ std::unique_ptr scene; - std::unique_ptr gui; + std::unique_ptr gui; std::unique_ptr stats; @@ -432,11 +433,14 @@ class VulkanSample : public vkb::Application /** @brief Set of instance extensions to be enabled for this example and whether they are optional (must be set in the derived constructor) */ std::unordered_map instance_extensions; + /** @brief Set of instance layers to be enabled for this example and whether they are optional (must be set in the derived constructor) */ + std::unordered_map instance_layers; + /** @brief Vector of layer settings to be enabled for this example (must be set in the derived constructor) */ std::vector layer_settings; /** @brief The Vulkan API version to request for this sample at instance creation time */ - uint32_t api_version = VK_API_VERSION_1_0; + uint32_t api_version = VK_API_VERSION_1_1; /** @brief Whether or not we want a high priority graphics queue. */ bool high_priority_graphics_queue{false}; @@ -444,6 +448,11 @@ class VulkanSample : public vkb::Application std::unique_ptr debug_utils; }; +using VulkanSampleC = VulkanSample; +using VulkanSampleCpp = VulkanSample; + +// Member function definitions + template inline VulkanSample::~VulkanSample() { @@ -487,30 +496,33 @@ inline void VulkanSample::add_layer_setting(LayerSettingType const } else { - layer_settings.push_back(reinterpret_cast(layerSetting)); + layer_settings.push_back(reinterpret_cast(layerSetting)); } } template -inline std::unique_ptr::DeviceType> VulkanSample::create_device(PhysicalDeviceType &gpu) +inline std::unique_ptr> + VulkanSample::create_device(vkb::core::PhysicalDevice &gpu) { if constexpr (bindingType == BindingType::Cpp) { - return std::make_unique(gpu, surface, std::move(debug_utils), get_device_extensions()); + return std::make_unique( + gpu, surface, std::move(debug_utils), get_device_extensions(), [this](vkb::core::PhysicalDeviceCpp &gpu) { request_gpu_features(gpu); }); } else { - return std::make_unique(gpu, - static_cast(surface), - std::unique_ptr(reinterpret_cast(debug_utils.release())), - get_device_extensions()); + return std::make_unique(gpu, + static_cast(surface), + std::unique_ptr(reinterpret_cast(debug_utils.release())), + get_device_extensions(), + [this](vkb::core::PhysicalDeviceC &gpu) { request_gpu_features(gpu); }); } } template -inline std::unique_ptr::InstanceType> VulkanSample::create_instance() +inline std::unique_ptr> VulkanSample::create_instance() { - return std::make_unique(get_name(), get_instance_extensions(), get_validation_layers(), get_layer_settings(), api_version); + return std::make_unique>(get_name(), get_instance_extensions(), get_instance_layers(), get_layer_settings(), api_version); } template @@ -539,16 +551,16 @@ void VulkanSample::create_render_context_impl(const std::vectorget_properties().vsync == Window::Vsync::OFF) ? vk::PresentModeKHR::eMailbox : vk::PresentModeKHR::eFifo; std::vector present_mode_priority_list{vk::PresentModeKHR::eFifo, vk::PresentModeKHR::eMailbox, vk::PresentModeKHR::eImmediate}; #else - vk::PresentModeKHR present_mode = (window->get_properties().vsync == Window::Vsync::ON) ? vk::PresentModeKHR::eFifo : vk::PresentModeKHR::eMailbox; - std::vector present_mode_priority_list{vk::PresentModeKHR::eMailbox, vk::PresentModeKHR::eImmediate, vk::PresentModeKHR::eFifo}; + vk::PresentModeKHR present_mode = (window->get_properties().vsync == Window::Vsync::ON) ? vk::PresentModeKHR::eFifo : vk::PresentModeKHR::eMailbox; + std::vector present_mode_priority_list{vk::PresentModeKHR::eMailbox, vk::PresentModeKHR::eImmediate, vk::PresentModeKHR::eFifo}; #endif render_context = - std::make_unique(*device, surface, *window, present_mode, present_mode_priority_list, surface_priority_list); + std::make_unique(*device, surface, *window, present_mode, present_mode_priority_list, surface_priority_list); } template -inline void VulkanSample::draw(CommandBufferType &command_buffer, RenderTargetType &render_target) +inline void VulkanSample::draw(vkb::core::CommandBuffer &command_buffer, RenderTargetType &render_target) { if constexpr (bindingType == BindingType::Cpp) { @@ -556,12 +568,14 @@ inline void VulkanSample::draw(CommandBufferType &command_buffer, R } else { - draw_impl(reinterpret_cast(command_buffer), reinterpret_cast(render_target)); + draw_impl(reinterpret_cast(command_buffer), + reinterpret_cast(render_target)); } } template -inline void VulkanSample::draw_impl(vkb::core::HPPCommandBuffer &command_buffer, vkb::rendering::HPPRenderTarget &render_target) +inline void VulkanSample::draw_impl(vkb::core::CommandBufferCpp &command_buffer, + vkb::rendering::HPPRenderTarget &render_target) { auto &views = render_target.get_views(); @@ -599,13 +613,14 @@ inline void VulkanSample::draw_impl(vkb::core::HPPCommandBuffer &co render_target.set_layout(1, memory_barrier.new_layout); } + // draw_renderpass is a virtual function, thus we have to call that, instead of directly calling draw_renderpass_impl! if constexpr (bindingType == BindingType::Cpp) { draw_renderpass(command_buffer, render_target); } else { - draw_renderpass(reinterpret_cast(command_buffer), reinterpret_cast(render_target)); + draw_renderpass(reinterpret_cast(command_buffer), reinterpret_cast(render_target)); } { @@ -627,7 +642,7 @@ inline void VulkanSample::draw_gui() } template -inline void VulkanSample::draw_renderpass(CommandBufferType &command_buffer, RenderTargetType &render_target) +inline void VulkanSample::draw_renderpass(vkb::core::CommandBuffer &command_buffer, RenderTargetType &render_target) { if constexpr (bindingType == BindingType::Cpp) { @@ -635,24 +650,25 @@ inline void VulkanSample::draw_renderpass(CommandBufferType &comman } else { - draw_renderpass_impl(reinterpret_cast(command_buffer), + draw_renderpass_impl(reinterpret_cast(command_buffer), reinterpret_cast(render_target)); } } template -inline void VulkanSample::draw_renderpass_impl(vkb::core::HPPCommandBuffer &command_buffer, vkb::rendering::HPPRenderTarget &render_target) +inline void VulkanSample::draw_renderpass_impl(vkb::core::CommandBufferCpp &command_buffer, + vkb::rendering::HPPRenderTarget &render_target) { + set_viewport_and_scissor_impl(command_buffer, render_target.get_extent()); + + // render is a virtual function, thus we have to call that, instead of directly calling render_impl! if constexpr (bindingType == BindingType::Cpp) { - set_viewport_and_scissor(command_buffer, render_target.get_extent()); render(command_buffer); } else { - set_viewport_and_scissor(reinterpret_cast(command_buffer), - reinterpret_cast(render_target.get_extent())); - render(reinterpret_cast(command_buffer)); + render(reinterpret_cast(command_buffer)); } if (gui) @@ -681,20 +697,20 @@ inline Configuration &VulkanSample::get_configuration() } template -inline typename VulkanSample::DeviceType const &VulkanSample::get_device() const +inline vkb::core::Device const &VulkanSample::get_device() const { if constexpr (bindingType == BindingType::Cpp) { - return reinterpret_cast(*device); + return *device; } else { - return *device; + return reinterpret_cast(*device); } } template -inline typename VulkanSample::DeviceType &VulkanSample::get_device() +inline vkb::core::Device &VulkanSample::get_device() { if constexpr (bindingType == BindingType::Cpp) { @@ -702,7 +718,7 @@ inline typename VulkanSample::DeviceType &VulkanSample } else { - return reinterpret_cast(*device); + return reinterpret_cast(*device); } } @@ -713,7 +729,7 @@ inline std::unordered_map const &VulkanSample:: } template -inline typename VulkanSample::GuiType &VulkanSample::get_gui() +inline vkb::Gui &VulkanSample::get_gui() { if constexpr (bindingType == BindingType::Cpp) { @@ -721,12 +737,12 @@ inline typename VulkanSample::GuiType &VulkanSample::g } else { - return reinterpret_cast(*gui); + return reinterpret_cast(*gui); } } template -inline typename VulkanSample::GuiType const &VulkanSample::get_gui() const +inline vkb::Gui const &VulkanSample::get_gui() const { if constexpr (bindingType == BindingType::Cpp) { @@ -734,7 +750,7 @@ inline typename VulkanSample::GuiType const &VulkanSample(*gui); + return reinterpret_cast(*gui); } } @@ -765,7 +781,7 @@ inline std::vector::SurfaceFormatType> const } template -inline typename VulkanSample::InstanceType &VulkanSample::get_instance() +inline vkb::core::Instance &VulkanSample::get_instance() { if constexpr (bindingType == BindingType::Cpp) { @@ -773,12 +789,12 @@ inline typename VulkanSample::InstanceType &VulkanSample(*instance); + return reinterpret_cast(*instance); } } template -inline typename VulkanSample::InstanceType const &VulkanSample::get_instance() const +inline vkb::core::Instance const &VulkanSample::get_instance() const { if constexpr (bindingType == BindingType::Cpp) { @@ -786,7 +802,7 @@ inline typename VulkanSample::InstanceType const &VulkanSample(*instance); + return reinterpret_cast(*instance); } } @@ -796,6 +812,18 @@ inline std::unordered_map const &VulkanSample:: return instance_extensions; } +template +inline std::unordered_map const &VulkanSample::get_instance_layers() const +{ + return instance_layers; +} + +template +inline void VulkanSample::add_instance_layer(const char *layer, bool optional) +{ + instance_layers[layer] = optional; +} + template inline std::vector::LayerSettingType> const &VulkanSample::get_layer_settings() const { @@ -810,21 +838,21 @@ inline std::vector::LayerSettingType> const & } template -inline typename VulkanSample::RenderContextType const &VulkanSample::get_render_context() const +inline vkb::rendering::RenderContext const &VulkanSample::get_render_context() const { assert(render_context && "Render context is not valid"); if constexpr (bindingType == BindingType::Cpp) { - return reinterpret_cast(*render_context); + return *render_context; } else { - return *render_context; + return reinterpret_cast(*render_context); } } template -inline typename VulkanSample::RenderContextType &VulkanSample::get_render_context() +inline vkb::rendering::RenderContext &VulkanSample::get_render_context() { assert(render_context && "Render context is not valid"); if constexpr (bindingType == BindingType::Cpp) @@ -833,7 +861,7 @@ inline typename VulkanSample::RenderContextType &VulkanSample(*render_context); + return reinterpret_cast(*render_context); } } @@ -905,12 +933,6 @@ inline typename VulkanSample::SurfaceType VulkanSample } } -template -inline const std::vector VulkanSample::get_validation_layers() -{ - return {}; -} - template inline bool VulkanSample::has_device() const { @@ -1009,9 +1031,9 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options // initialize C++-Bindings default dispatcher, first step #if defined(_HPP_VULKAN_LIBRARY) - static vk::DynamicLoader dl(_HPP_VULKAN_LIBRARY); + static vk::detail::DynamicLoader dl(_HPP_VULKAN_LIBRARY); #else - static vk::DynamicLoader dl; + static vk::detail::DynamicLoader dl; #endif VULKAN_HPP_DEFAULT_DISPATCHER.init(dl.getProcAddress("vkGetInstanceProcAddr")); @@ -1034,9 +1056,8 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options { std::vector available_instance_extensions = vk::enumerateInstanceExtensionProperties(); auto debugExtensionIt = - std::find_if(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](vk::ExtensionProperties const &ep) { return strcmp(ep.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0; }); + std::ranges::find_if(available_instance_extensions, + [](vk::ExtensionProperties const &ep) { return strcmp(ep.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0; }); if (debugExtensionIt != available_instance_extensions.end()) { LOGI("Vulkan debug utils enabled ({})", VK_EXT_DEBUG_UTILS_EXTENSION_NAME); @@ -1053,14 +1074,11 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options } else { - instance.reset(reinterpret_cast(create_instance().release())); + instance.reset(reinterpret_cast(create_instance().release())); } - // initialize C++-Bindings default dispatcher, second step - VULKAN_HPP_DEFAULT_DISPATCHER.init(instance->get_handle()); - // Getting a valid vulkan surface from the platform - surface = static_cast(window->create_surface(reinterpret_cast(*instance))); + surface = static_cast(window->create_surface(reinterpret_cast(*instance))); if (!surface) { throw std::runtime_error("Failed to create window surface."); @@ -1075,16 +1093,6 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options gpu.get_mutable_requested_features().textureCompressionASTC_LDR = true; } - // Request sample required GPU features - if constexpr (bindingType == BindingType::Cpp) - { - request_gpu_features(gpu); - } - else - { - request_gpu_features(reinterpret_cast(gpu)); - } - // Creating vulkan device, specifying the swapchain extension always // If using VK_EXT_headless_surface, we still create and use a swap-chain { @@ -1096,6 +1104,18 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options } } + // Shaders generated by Slang require a certain SPIR-V environment that can't be satisfied by Vulkan 1.0, so we need to expliclity up that to at least 1.1 and enable some required extensions + if (get_shading_language() == ShadingLanguage::SLANG) + { + if (api_version < VK_API_VERSION_1_1) + { + api_version = VK_API_VERSION_1_1; + } + add_device_extension(VK_KHR_SPIRV_1_4_EXTENSION_NAME); + add_device_extension(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); + add_device_extension(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME); + } + #ifdef VKB_ENABLE_PORTABILITY // VK_KHR_portability_subset must be enabled if present in the implementation (e.g on macOS/iOS with beta extensions enabled) add_device_extension(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, /*optional=*/true); @@ -1106,9 +1126,8 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options { std::vector available_device_extensions = gpu.get_handle().enumerateDeviceExtensionProperties(); auto debugExtensionIt = - std::find_if(available_device_extensions.begin(), - available_device_extensions.end(), - [](vk::ExtensionProperties const &ep) { return strcmp(ep.extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME) == 0; }); + std::ranges::find_if(available_device_extensions, + [](vk::ExtensionProperties const &ep) { return strcmp(ep.extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME) == 0; }); if (debugExtensionIt != available_device_extensions.end()) { LOGI("Vulkan debug utils enabled ({})", VK_EXT_DEBUG_MARKER_EXTENSION_NAME); @@ -1135,7 +1154,7 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options } else { - device.reset(reinterpret_cast(create_device(reinterpret_cast(gpu)).release())); + device.reset(reinterpret_cast(create_device(reinterpret_cast(gpu)).release())); } // initialize C++-Bindings default dispatcher, optional third step @@ -1157,12 +1176,15 @@ inline void VulkanSample::create_gui(const Window &window, StatsTyp { if constexpr (bindingType == BindingType::Cpp) { - gui = std::make_unique(*this, window, stats, font_size, explicit_update); + gui = std::make_unique(get_render_context(), window, stats, font_size, explicit_update); } else { - gui = std::make_unique( - *reinterpret_cast(this), window, reinterpret_cast(stats), font_size, explicit_update); + gui = std::make_unique(reinterpret_cast(get_render_context()), + window, + reinterpret_cast(stats), + font_size, + explicit_update); } } @@ -1173,7 +1195,7 @@ inline void VulkanSample::prepare_render_context() } template -inline void VulkanSample::render(CommandBufferType &command_buffer) +inline void VulkanSample::render(vkb::core::CommandBuffer &command_buffer) { if constexpr (bindingType == BindingType::Cpp) { @@ -1181,12 +1203,12 @@ inline void VulkanSample::render(CommandBufferType &command_buffer) } else { - render_impl(reinterpret_cast(command_buffer)); + render_impl(reinterpret_cast(command_buffer)); } } template -inline void VulkanSample::render_impl(vkb::core::HPPCommandBuffer &command_buffer) +inline void VulkanSample::render_impl(vkb::core::CommandBufferCpp &command_buffer) { if (render_pipeline) { @@ -1195,7 +1217,7 @@ inline void VulkanSample::render_impl(vkb::core::HPPCommandBuffer & } template -inline void VulkanSample::request_gpu_features(PhysicalDeviceType &gpu) +inline void VulkanSample::request_gpu_features(vkb::core::PhysicalDevice &gpu) { // To be overridden by sample } @@ -1248,7 +1270,7 @@ inline void VulkanSample::set_high_priority_graphics_queue_enable(b } template -inline void VulkanSample::set_render_context(std::unique_ptr &&rc) +inline void VulkanSample::set_render_context(std::unique_ptr> &&rc) { if constexpr (bindingType == BindingType::Cpp) { @@ -1256,7 +1278,7 @@ inline void VulkanSample::set_render_context(std::unique_ptr(rc.release())); + render_context.reset(reinterpret_cast(rc.release())); } } @@ -1274,7 +1296,7 @@ inline void VulkanSample::set_render_pipeline(std::unique_ptr -inline void VulkanSample::set_viewport_and_scissor(CommandBufferType const &command_buffer, Extent2DType const &extent) +inline void VulkanSample::set_viewport_and_scissor(vkb::core::CommandBuffer const &command_buffer, Extent2DType const &extent) { if constexpr (bindingType == BindingType::Cpp) { @@ -1282,15 +1304,17 @@ inline void VulkanSample::set_viewport_and_scissor(CommandBufferTyp } else { - set_viewport_and_scissor_impl(reinterpret_cast(command_buffer), reinterpret_cast(extent)); + set_viewport_and_scissor_impl(reinterpret_cast(command_buffer), + reinterpret_cast(extent)); } } template -inline void VulkanSample::set_viewport_and_scissor_impl(vkb::core::HPPCommandBuffer const &command_buffer, vk::Extent2D const &extent) +inline void VulkanSample::set_viewport_and_scissor_impl(vkb::core::CommandBufferCpp const &command_buffer, + vk::Extent2D const &extent) { command_buffer.get_handle().setViewport(0, {{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}}); - command_buffer.get_handle().setScissor(0, vk::Rect2D({}, extent)); + command_buffer.get_handle().setScissor(0, vk::Rect2D{{}, extent}); } template @@ -1302,26 +1326,26 @@ inline void VulkanSample::update(float delta_time) update_gui(delta_time); - auto &command_buffer = render_context->begin(); + auto command_buffer = render_context->begin(); // Collect the performance data for the sample graphs update_stats(delta_time); - command_buffer.begin(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); - stats->begin_sampling(command_buffer); + command_buffer->begin(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); + stats->begin_sampling(*command_buffer); if constexpr (bindingType == BindingType::Cpp) { - draw(command_buffer, render_context->get_active_frame().get_render_target()); + draw(*command_buffer, render_context->get_active_frame().get_render_target()); } else { - draw(reinterpret_cast(command_buffer), + draw(reinterpret_cast(*command_buffer), reinterpret_cast(render_context->get_active_frame().get_render_target())); } - stats->end_sampling(command_buffer); - command_buffer.end(); + stats->end_sampling(*command_buffer); + command_buffer->end(); render_context->submit(command_buffer); } @@ -1425,7 +1449,4 @@ inline void VulkanSample::update_stats(float delta_time) } } -using VulkanSampleC = VulkanSample; -using VulkanSampleCpp = VulkanSample; - } // namespace vkb diff --git a/framework/vulkan_type_mapping.h b/framework/vulkan_type_mapping.h index d83b66756b..c9c75fc067 100644 --- a/framework/vulkan_type_mapping.h +++ b/framework/vulkan_type_mapping.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2025, Arm Limited and Contributors + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -48,6 +49,12 @@ struct HPPType using Type = vk::CommandBuffer; }; +template <> +struct HPPType +{ + using Type = vk::DataGraphPipelineSessionARM; +}; + template <> struct HPPType { @@ -72,6 +79,248 @@ struct HPPType using Type = vk::ImageView; }; +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceAccelerationStructureFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceBlendOperationAdvancedFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceBufferDeviceAddressFeatures; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceColorWriteEnableFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceDepthClipEnableFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceConditionalRenderingFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceDescriptorBufferFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceDescriptorIndexingFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceDynamicRenderingFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceDynamicRenderingLocalReadFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceExtendedDynamicState2FeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceFloat16Int8FeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceFragmentDensityMapFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceFragmentShadingRateFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceHostImageCopyFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceImageCompressionControlFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceLineRasterizationFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceMeshShaderFeaturesEXT; +}; + +#ifdef VKB_ENABLE_PORTABILITY +template <> +struct HPPType +{ + using Type = vk::PhysicalDevicePortabilitySubsetFeaturesKHR; +}; +#endif + +template <> +struct HPPType +{ + using Type = vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceRayQueryFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceRayTracingPipelineFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceRayTracingPositionFetchFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceScalarBlockLayoutFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceShaderObjectFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceSwapchainMaintenance1FeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceSynchronization2FeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceTensorFeaturesARM; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceTimelineSemaphoreFeaturesKHR; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceVulkan12Features; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDeviceVulkan13Features; +}; + +template <> +struct HPPType +{ + using Type = vk::PhysicalDevice16BitStorageFeatures; +}; + +template <> +struct HPPType +{ + using Type = vk::Pipeline; +}; + +template <> +struct HPPType +{ + using Type = vk::PipelineLayout; +}; + template <> struct HPPType { @@ -83,6 +332,24 @@ struct HPPType { using Type = vk::Sampler; }; + +template <> +struct HPPType +{ + using Type = vk::TensorARM; +}; + +template <> +struct HPPType +{ + using Type = vk::TensorCreateInfoARM; +}; + +template <> +struct HPPType +{ + using Type = vk::TensorViewARM; +}; } // namespace detail template @@ -100,4 +367,4 @@ struct VulkanTypeMapping using Type = typename detail::HPPType::Type; }; -} // namespace vkb +} // namespace vkb \ No newline at end of file diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 18f120722c..daf6b02382 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -50,13 +50,13 @@ endforeach () set(ORDER_LIST #API Samples "hello_triangle" + "hello_triangle_1_3" "dynamic_uniform_buffers" "texture_loading" "hdr" "instancing" "compute_nbody" "terrain_tessellation" - "hlsl" "oit_linked_lists" "oit_depth_peeling" @@ -89,8 +89,11 @@ set(ORDER_LIST "fragment_shader_barycentric" "gshader_to_mshader" "color_write_enable" + "dynamic_multisample_rasterization" "sparse_image" "dynamic_primitive_clipping" + "simple_tensor_and_data_graph" + "subgroups_operations" #Performance Samples "swapchain_images" @@ -119,26 +122,25 @@ set(ORDER_LIST #HPP API Samples "hpp_compute_nbody" - "hpp_dynamic_uniform_buffers" - "hpp_hdr" + "hpp_dynamic_uniform_buffers" + "hpp_hdr" "hpp_hello_triangle" - "hpp_hlsl_shaders" - "hpp_instancing" - "hpp_oit_depth_peeling" - "hpp_oit_linked_lists" - "hpp_separate_image_sampler" - "hpp_terrain_tessellation" - "hpp_texture_loading" - "hpp_texture_mipmap_generation" - - #HPP Extension Samples - "hpp_mesh_shading" - "hpp_push_descriptors" - + "hpp_instancing" + "hpp_oit_depth_peeling" + "hpp_oit_linked_lists" + "hpp_separate_image_sampler" + "hpp_terrain_tessellation" + "hpp_texture_loading" + "hpp_texture_mipmap_generation" + + #HPP Extension Samples + "hpp_mesh_shading" + "hpp_push_descriptors" + #HPP Performance Samples "hpp_pipeline_cache" "hpp_swapchain_images" - "hpp_texture_compression_comparison" + "hpp_texture_compression_comparison" #General Samples "mobile_nerf") diff --git a/samples/api/README.adoc b/samples/api/README.adoc index 26a1549992..cdb13a916a 100644 --- a/samples/api/README.adoc +++ b/samples/api/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2024, The Khronos Group +- Copyright (c) 2021-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -36,59 +36,63 @@ Implements a high dynamic range rendering pipeline using 16/32 bit floating poin === xref:./{api_samplespath}hello_triangle/README.adoc[Hello Triangle] -A self-contained (minimal use of framework) sample that illustrates the rendering of a triangle. +A self-contained (minimal use of framework) sample that illustrates the rendering of a triangle using unextended Vulkan 1.1. + +=== xref:./{api_samplespath}hello_triangle_1_3/README.adoc[Hello Triangle 1.3] + +A self-contained (minimal use of framework) sample that illustrates the rendering of a triangle using Vulkan 1.3 features. === xref:./{api_samplespath}hpp_compute_nbody/README.adoc[HPP Compute shader N-Body simulation] -A transcoded version of the API sample xref:./{api_samplespath}compute_nbody/README.adoc[Compute N-Body] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}compute_nbody/README.adoc[Compute N-Body] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_dynamic_uniform_buffers/README.adoc[HPP Dynamic Uniform Buffers] -A transcoded version of the API sample xref:./{api_samplespath}dynamic_uniform_buffers/README.adoc[Dynamic Uniform buffers] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}dynamic_uniform_buffers/README.adoc[Dynamic Uniform buffers] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_hdr/README.adoc[HPP High dynamic range] -A transcoded version of the API sample xref:./{api_samplespath}hdr/README.adoc[High dynamic range] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}hdr/README.adoc[High dynamic range] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_hello_triangle/README.adoc[HPP Hello Triangle] -A transcoded version of the API sample xref:./{api_samplespath}hello_triangle/README.adoc[Hello Triangle] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}hello_triangle/README.adoc[Hello Triangle] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. -=== xref:./{api_samplespath}hpp_hlsl_shaders/README.adoc[HPP HLSL shaders] +=== xref:./{api_samplespath}hpp_hello_triangle_1_3/README.adoc[HPP Hello Triangle 1.3] -A transcoded version of the API sample xref:./{api_samplespath}hlsl_shaders/README.adoc[HLSL Shaders] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}hello_triangle_1_3/README.adoc[Hello Triangle 1.3] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_instancing/README.adoc[HPP Instancing] -A transcoded version of the API sample xref:./{api_samplespath}instancing/README.adoc[Instancing] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}instancing/README.adoc[Instancing] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_oit_depth_peeling/README.adoc[HPP OIT Depth Peeling] -A transcoded version of the API sample xref:./{api_samplespath}oit_depth_peeling/README.adoc[OIT Depth Peeling] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}oit_depth_peeling/README.adoc[OIT Depth Peeling] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_oit_linked_lists/README.adoc[HPP OIT Linked Lists] -A transcoded version of the API sample xref:./{api_samplespath}oit_linked_lists/README.adoc[OIT Linked Lists] that illustrates the usage of the C{pp} bindings of Vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}oit_linked_lists/README.adoc[OIT Linked Lists] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_separate_image_sampler/README.adoc[HPP Separate image sampler] -A transcoded version of the API sample xref:./{api_samplespath}separate_image_sampler/README.adoc[Separate image sampler] that illustrates the usage of the C{pp} bindings of vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}separate_image_sampler/README.adoc[Separate image sampler] that illustrates the usage of the C{pp} bindings of vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_terrain_tessellation/README.adoc[HPP Terrain Tessellation] -A transcoded version of the API sample xref:./{api_samplespath}terrain_tessellation/README.adoc[Terrain Tessellation] that illustrates the usage of the C{pp} bindings of vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}terrain_tessellation/README.adoc[Terrain Tessellation] that illustrates the usage of the C{pp} bindings of vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_texture_loading/README.adoc[HPP Texture Loading] -A transcoded version of the API sample xref:./{api_samplespath}texture_loading/README.adoc[Texture loading] that illustrates the usage of the C{pp} bindings of vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}texture_loading/README.adoc[Texture loading] that illustrates the usage of the C{pp} bindings of vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_texture_mipmap_generation/README.adoc[HPP Texture run-time mip-map generation] -A transcoded version of the API sample xref:./{api_samplespath}texture_mipmap_generation/README.adoc[Texture run-time mip-map generation] that illustrates the usage of the C{pp} bindings of vulkan provided by vulkan.hpp. +A transcoded version of the API sample xref:./{api_samplespath}texture_mipmap_generation/README.adoc[Texture run-time mip-map generation] that illustrates the usage of the C{pp} bindings of vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}hpp_timestamp_queries/README.adoc[HPP Timestamp queries] -A transcoded version of the API samplexref:./{api_samplespath}timestamp_queries/README.adoc[Timestamp queries] that illustrates the usage of the C{pp} bindings of vulkan provided by vulkan.hpp. +A transcoded version of the API samplexref:./{api_samplespath}timestamp_queries/README.adoc[Timestamp queries] that illustrates the usage of the C{pp} bindings of vulkan provided by Vulkan-Hpp. === xref:./{api_samplespath}instancing/README.adoc[Instancing] @@ -111,10 +115,6 @@ Loading and rendering of a 2D texture map from a file. Generates a complete mip-chain for a texture at runtime instead of loading it from a file. -=== xref:./{api_samplespath}hlsl_shaders/README.adoc[HLSL shaders] - -Converts High Level Shading Language (HLSL) shaders to Vulkan-compatible SPIR-V. - === xref:./{api_samplespath}timestamp_queries/README.adoc[Timestamp queries] Using timestamp queries for profiling GPU workloads. diff --git a/samples/api/compute_nbody/CMakeLists.txt b/samples/api/compute_nbody/CMakeLists.txt index 47152aa55f..311d9799a8 100644 --- a/samples/api/compute_nbody/CMakeLists.txt +++ b/samples/api/compute_nbody/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample_with_tags( "compute_nbody/hlsl/particle.vert.hlsl" "compute_nbody/hlsl/particle.frag.hlsl" "compute_nbody/hlsl/particle_calculate.comp.hlsl" - "compute_nbody/hlsl/particle_integrate.comp.hlsl") + "compute_nbody/hlsl/particle_integrate.comp.hlsl" + SHADER_FILES_SLANG + "compute_nbody/slang/particle.vert.slang" + "compute_nbody/slang/particle.frag.slang" + "compute_nbody/slang/particle_calculate.comp.slang" + "compute_nbody/slang/particle_integrate.comp.slang") diff --git a/samples/api/compute_nbody/compute_nbody.cpp b/samples/api/compute_nbody/compute_nbody.cpp index 2b361e78d3..3f63aaf281 100644 --- a/samples/api/compute_nbody/compute_nbody.cpp +++ b/samples/api/compute_nbody/compute_nbody.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -61,7 +61,7 @@ ComputeNBody::~ComputeNBody() } } -void ComputeNBody::request_gpu_features(vkb::PhysicalDevice &gpu) +void ComputeNBody::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -477,8 +477,8 @@ void ComputeNBody::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("compute_nbody", "particle.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("compute_nbody", "particle.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("compute_nbody", "particle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("compute_nbody", "particle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { @@ -603,7 +603,7 @@ void ComputeNBody::prepare_compute() VkComputePipelineCreateInfo compute_pipeline_create_info = vkb::initializers::compute_pipeline_create_info(compute.pipeline_layout, 0); // 1st pass - Particle movement calculations - compute_pipeline_create_info.stage = load_shader("compute_nbody", "particle_calculate.comp", VK_SHADER_STAGE_COMPUTE_BIT); + compute_pipeline_create_info.stage = load_shader("compute_nbody", "particle_calculate.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); // Set some shader parameters via specialization constants struct SpecializationData @@ -635,7 +635,7 @@ void ComputeNBody::prepare_compute() VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1, &compute_pipeline_create_info, nullptr, &compute.pipeline_calculate)); // 2nd pass - Particle integration - compute_pipeline_create_info.stage = load_shader("compute_nbody", "particle_integrate.comp", VK_SHADER_STAGE_COMPUTE_BIT); + compute_pipeline_create_info.stage = load_shader("compute_nbody", "particle_integrate.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); specialization_map_entries.clear(); specialization_map_entries.push_back(vkb::initializers::specialization_map_entry(0, 0, sizeof(uint32_t))); @@ -648,7 +648,7 @@ void ComputeNBody::prepare_compute() // Separate command pool as queue family for compute may be different than graphics VkCommandPoolCreateInfo command_pool_create_info = {}; command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - command_pool_create_info.queueFamilyIndex = get_device().get_queue_family_index(VK_QUEUE_COMPUTE_BIT); + command_pool_create_info.queueFamilyIndex = vkb::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), VK_QUEUE_COMPUTE_BIT); VK_CHECK(vkCreateCommandPool(get_device().get_handle(), &command_pool_create_info, nullptr, &compute.command_pool)); // Create a command buffer for compute operations @@ -835,8 +835,9 @@ bool ComputeNBody::prepare(const vkb::ApplicationOptions &options) return false; } - graphics.queue_family_index = get_device().get_queue_family_index(VK_QUEUE_GRAPHICS_BIT); - compute.queue_family_index = get_device().get_queue_family_index(VK_QUEUE_COMPUTE_BIT); + auto const &queue_family_properties = get_device().get_gpu().get_queue_family_properties(); + graphics.queue_family_index = vkb::get_queue_family_index(queue_family_properties, VK_QUEUE_GRAPHICS_BIT); + compute.queue_family_index = vkb::get_queue_family_index(queue_family_properties, VK_QUEUE_COMPUTE_BIT); // Not all implementations support a work group size of 256, so we need to check with the device limits work_group_size = std::min(static_cast(256), get_device().get_gpu().get_properties().limits.maxComputeWorkGroupSize[0]); diff --git a/samples/api/compute_nbody/compute_nbody.h b/samples/api/compute_nbody/compute_nbody.h index 9a9d700ec7..37ee83c1ab 100644 --- a/samples/api/compute_nbody/compute_nbody.h +++ b/samples/api/compute_nbody/compute_nbody.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -96,7 +96,7 @@ class ComputeNBody : public ApiVulkanSample ComputeNBody(); ~ComputeNBody(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void load_assets(); void build_command_buffers() override; void build_compute_command_buffer(); diff --git a/samples/api/dynamic_uniform_buffers/CMakeLists.txt b/samples/api/dynamic_uniform_buffers/CMakeLists.txt index 6e1acc04cd..d6c8df2cac 100644 --- a/samples/api/dynamic_uniform_buffers/CMakeLists.txt +++ b/samples/api/dynamic_uniform_buffers/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "dynamic_uniform_buffers/glsl/base.frag" SHADER_FILES_HLSL "dynamic_uniform_buffers/hlsl/base.vert.hlsl" - "dynamic_uniform_buffers/hlsl/base.frag.hlsl") \ No newline at end of file + "dynamic_uniform_buffers/hlsl/base.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_uniform_buffers/slang/base.vert.slang" + "dynamic_uniform_buffers/slang/base.frag.slang") \ No newline at end of file diff --git a/samples/api/dynamic_uniform_buffers/dynamic_uniform_buffers.cpp b/samples/api/dynamic_uniform_buffers/dynamic_uniform_buffers.cpp index 544afb84c3..096d09d028 100644 --- a/samples/api/dynamic_uniform_buffers/dynamic_uniform_buffers.cpp +++ b/samples/api/dynamic_uniform_buffers/dynamic_uniform_buffers.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -341,8 +341,8 @@ void DynamicUniformBuffers::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("dynamic_uniform_buffers", "base.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_uniform_buffers", "base.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_uniform_buffers", "base.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_uniform_buffers", "base.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/api/hdr/CMakeLists.txt b/samples/api/hdr/CMakeLists.txt index 04e8271496..eedd58c96f 100644 --- a/samples/api/hdr/CMakeLists.txt +++ b/samples/api/hdr/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "hdr/hlsl/bloom.vert.hlsl" "hdr/hlsl/bloom.frag.hlsl" "hdr/hlsl/gbuffer.vert.hlsl" - "hdr/hlsl/gbuffer.frag.hlsl") + "hdr/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "hdr/slang/composition.vert.slang" + "hdr/slang/composition.frag.slang" + "hdr/slang/bloom.vert.slang" + "hdr/slang/bloom.frag.slang" + "hdr/slang/gbuffer.vert.slang" + "hdr/slang/gbuffer.frag.slang") diff --git a/samples/api/hdr/hdr.cpp b/samples/api/hdr/hdr.cpp index 65f2f2ac17..d9c562b13e 100644 --- a/samples/api/hdr/hdr.cpp +++ b/samples/api/hdr/hdr.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -65,7 +65,7 @@ HDR::~HDR() } } -void HDR::request_gpu_features(vkb::PhysicalDevice &gpu) +void HDR::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -267,7 +267,7 @@ void HDR::create_attachment(VkFormat format, VkImageUsageFlagBits usage, FrameBu VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment->image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment->image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment->mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment->image, attachment->mem, 0)); @@ -755,8 +755,8 @@ void HDR::prepare_pipelines() pipeline_create_info.pVertexInputState = &empty_input_state; // Final fullscreen composition pass pipeline - shader_stages[0] = load_shader("hdr", "composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.layout = pipeline_layouts.composition; pipeline_create_info.renderPass = render_pass; rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; @@ -765,8 +765,8 @@ void HDR::prepare_pipelines() VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.composition)); // Bloom pass - shader_stages[0] = load_shader("hdr", "bloom.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "bloom.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "bloom.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "bloom.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); color_blend_state.pAttachments = &blend_attachment_state; blend_attachment_state.colorWriteMask = 0xF; blend_attachment_state.blendEnable = VK_TRUE; @@ -820,8 +820,8 @@ void HDR::prepare_pipelines() color_blend_state.attachmentCount = 2; color_blend_state.pAttachments = blend_attachment_states.data(); - shader_stages[0] = load_shader("hdr", "gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Set constant parameters via specialization constants specialization_map_entries[0] = vkb::initializers::specialization_map_entry(0, 0, sizeof(uint32_t)); diff --git a/samples/api/hdr/hdr.h b/samples/api/hdr/hdr.h index 1c4da1bcd2..f6dfdcf08b 100644 --- a/samples/api/hdr/hdr.h +++ b/samples/api/hdr/hdr.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -129,7 +129,7 @@ class HDR : public ApiVulkanSample HDR(); ~HDR(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void create_attachment(VkFormat format, VkImageUsageFlagBits usage, FrameBufferAttachment *attachment); void prepare_offscreen_buffer(); diff --git a/samples/api/hello_triangle/CMakeLists.txt b/samples/api/hello_triangle/CMakeLists.txt index 5b2baf8644..c0911a4cf5 100644 --- a/samples/api/hello_triangle/CMakeLists.txt +++ b/samples/api/hello_triangle/CMakeLists.txt @@ -1,4 +1,5 @@ -# Copyright (c) 2019-2021, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors +# Copyright (c) 2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -26,5 +27,11 @@ add_sample( NAME "Hello Triangle" DESCRIPTION "An introduction into Vulkan and its respective objects." SHADER_FILES_GLSL - "triangle.vert" - "triangle.frag") + "hello_triangle/glsl/triangle.vert" + "hello_triangle/glsl/triangle.frag" + SHADER_FILES_HLSL + "hello_triangle/hlsl/triangle.vert.hlsl" + "hello_triangle/hlsl/triangle.frag.hlsl" + SHADER_FILES_SLANG + "hello_triangle/slang/triangle.vert.slang" + "hello_triangle/slang/triangle.frag.slang") diff --git a/samples/api/hello_triangle/hello_triangle.cpp b/samples/api/hello_triangle/hello_triangle.cpp index a2b499a389..7c6f04c5b5 100644 --- a/samples/api/hello_triangle/hello_triangle.cpp +++ b/samples/api/hello_triangle/hello_triangle.cpp @@ -1,4 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -20,7 +21,6 @@ #include "common/vk_common.h" #include "core/util/logging.hpp" #include "filesystem/legacy.h" -#include "glsl_compiler.h" #include "platform/window.h" #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) @@ -83,74 +83,6 @@ bool HelloTriangle::validate_extensions(const std::vector return true; } -/** - * @brief Validates a list of required layers, comparing it with the available ones. - * - * @param required A vector containing required layer names. - * @param available A VkLayerProperties object containing available layers. - * @return true if all required extensions are available - * @return false otherwise - */ -bool HelloTriangle::validate_layers(const std::vector &required, - const std::vector &available) -{ - for (auto extension : required) - { - bool found = false; - for (auto &available_extension : available) - { - if (strcmp(available_extension.layerName, extension) == 0) - { - found = true; - break; - } - } - - if (!found) - { - return false; - } - } - - return true; -} - -/** - * @brief Find the vulkan shader stage for a given a string. - * - * @param ext A string containing the shader stage name. - * @return VkShaderStageFlagBits The shader stage mapping from the given string, VK_SHADER_STAGE_VERTEX_BIT otherwise. - */ -VkShaderStageFlagBits HelloTriangle::find_shader_stage(const std::string &ext) -{ - if (ext == "vert") - { - return VK_SHADER_STAGE_VERTEX_BIT; - } - else if (ext == "frag") - { - return VK_SHADER_STAGE_FRAGMENT_BIT; - } - else if (ext == "comp") - { - return VK_SHADER_STAGE_COMPUTE_BIT; - } - else if (ext == "geom") - { - return VK_SHADER_STAGE_GEOMETRY_BIT; - } - else if (ext == "tesc") - { - return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; - } - else if (ext == "tese") - { - return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; - } - - throw std::runtime_error("No Vulkan shader stage found for the file extension name."); -}; - /** * @brief Initializes the Vulkan instance. */ @@ -194,9 +126,8 @@ void HelloTriangle::init_instance() #if (defined(VKB_ENABLE_PORTABILITY)) required_instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); bool portability_enumeration_available = false; - if (std::any_of(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) + if (std::ranges::any_of(available_instance_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) { required_instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); portability_enumeration_available = true; @@ -226,49 +157,46 @@ void HelloTriangle::init_instance() throw std::runtime_error("Required instance extensions are missing."); } - uint32_t instance_layer_count; - VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr)); + std::vector requested_instance_layers{}; - std::vector supported_validation_layers(instance_layer_count); - VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_validation_layers.data())); +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + char const *validationLayer = "VK_LAYER_KHRONOS_validation"; - std::vector requested_validation_layers{}; + uint32_t instance_layer_count; + VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr)); -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) - // Determine the optimal validation layers to enable that are necessary for useful debugging - std::vector optimal_validation_layers = vkb::get_optimal_validation_layers(supported_validation_layers); - requested_validation_layers.insert(requested_validation_layers.end(), optimal_validation_layers.begin(), optimal_validation_layers.end()); -#endif + std::vector supported_instance_layers(instance_layer_count); + VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_instance_layers.data())); - if (validate_layers(requested_validation_layers, supported_validation_layers)) + if (std::ranges::any_of(supported_instance_layers, [&validationLayer](auto const &lp) { return strcmp(lp.layerName, validationLayer) == 0; })) { - LOGI("Enabled Validation Layers:") - for (const auto &layer : requested_validation_layers) - { - LOGI(" \t{}", layer); - } + requested_instance_layers.push_back(validationLayer); + LOGI("Enabled Validation Layer {}", validationLayer); } else { - throw std::runtime_error("Required validation layers are missing."); + LOGW("Validation Layer {} is not available", validationLayer); } +#endif - VkApplicationInfo app{VK_STRUCTURE_TYPE_APPLICATION_INFO}; - app.pApplicationName = "Hello Triangle"; - app.pEngineName = "Vulkan Samples"; - app.apiVersion = VK_MAKE_VERSION(1, 0, 0); + VkApplicationInfo app{ + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pApplicationName = "Hello Triangle", + .pEngineName = "Vulkan Samples", + .apiVersion = VK_API_VERSION_1_1}; - VkInstanceCreateInfo instance_info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; - instance_info.pApplicationInfo = &app; - instance_info.enabledExtensionCount = vkb::to_u32(required_instance_extensions.size()); - instance_info.ppEnabledExtensionNames = required_instance_extensions.data(); - instance_info.enabledLayerCount = vkb::to_u32(requested_validation_layers.size()); - instance_info.ppEnabledLayerNames = requested_validation_layers.data(); + VkInstanceCreateInfo instance_info{ + .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + .pApplicationInfo = &app, + .enabledLayerCount = static_cast(requested_instance_layers.size()), + .ppEnabledLayerNames = requested_instance_layers.data(), + .enabledExtensionCount = static_cast(required_instance_extensions.size()), + .ppEnabledExtensionNames = required_instance_extensions.data()}; #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) // Validation layers help finding wrong api usage, we enable them when explicitly requested or in debug builds // For this we use the debug utils extension if it is supported - VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; + VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; if (has_debug_utils) { debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; @@ -359,29 +287,106 @@ void HelloTriangle::init_device() // Since this sample has visual output, the device needs to support the swapchain extension std::vector required_device_extensions{VK_KHR_SWAPCHAIN_EXTENSION_NAME}; + // Shaders generated by Slang require a certain SPIR-V environment that can't be satisfied by Vulkan 1.0, so we need to expliclity up that to at least 1.1 and enable some required extensions + if (get_shading_language() == vkb::ShadingLanguage::SLANG) + { + required_device_extensions.push_back(VK_KHR_SPIRV_1_4_EXTENSION_NAME); + required_device_extensions.push_back(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); + required_device_extensions.push_back(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME); + } + if (!validate_extensions(required_device_extensions, device_extensions)) { throw std::runtime_error("Required device extensions are missing."); } +#if (defined(VKB_ENABLE_PORTABILITY)) + // VK_KHR_portability_subset must be enabled if present in the implementation (e.g on macOS/iOS with beta extensions enabled) + if (std::ranges::any_of(device_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0; })) + { + required_device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + } +#endif + // The sample uses a single graphics queue - const float queue_priority = 1.0f; + const float queue_priority = 0.5f; - VkDeviceQueueCreateInfo queue_info{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO}; - queue_info.queueFamilyIndex = context.graphics_queue_index; - queue_info.queueCount = 1; - queue_info.pQueuePriorities = &queue_priority; + VkDeviceQueueCreateInfo queue_info{ + .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, + .queueFamilyIndex = static_cast(context.graphics_queue_index), + .queueCount = 1, + .pQueuePriorities = &queue_priority}; - VkDeviceCreateInfo device_info{VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO}; - device_info.queueCreateInfoCount = 1; - device_info.pQueueCreateInfos = &queue_info; - device_info.enabledExtensionCount = vkb::to_u32(required_device_extensions.size()); - device_info.ppEnabledExtensionNames = required_device_extensions.data(); + VkDeviceCreateInfo device_info{ + .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &queue_info, + .enabledExtensionCount = static_cast(required_device_extensions.size()), + .ppEnabledExtensionNames = required_device_extensions.data()}; VK_CHECK(vkCreateDevice(context.gpu, &device_info, nullptr, &context.device)); volkLoadDevice(context.device); vkGetDeviceQueue(context.device, context.graphics_queue_index, 0, &context.queue); + + // This sample uses the Vulkan Memory Alloctor (VMA), which needs to be set up + VmaVulkanFunctions vma_vulkan_func{ + .vkGetInstanceProcAddr = vkGetInstanceProcAddr, + .vkGetDeviceProcAddr = vkGetDeviceProcAddr}; + + VmaAllocatorCreateInfo allocator_info{ + .physicalDevice = context.gpu, + .device = context.device, + .pVulkanFunctions = &vma_vulkan_func, + .instance = context.instance}; + + VkResult result = vmaCreateAllocator(&allocator_info, &context.vma_allocator); + if (result != VK_SUCCESS) + { + throw std::runtime_error("Could not create allocator for VMA allocator"); + } +} + +/** + * @brief Initializes the vertex buffer by creating it, allocating memory, binding the memory, and uploading vertex data. + * @note This function must be called after the Vulkan device has been initialized. + * @throws std::runtime_error if any Vulkan operation fails. + */ +void HelloTriangle::init_vertex_buffer() +{ + // Vertex data for a single colored triangle + const std::vector vertices = { + {{0.5f, -0.5f, 0.5f}, {1.0f, 0.0f, 0.0f}}, + {{0.5f, 0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, + {{-0.5f, 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}}; + + const VkDeviceSize buffer_size = sizeof(vertices[0]) * vertices.size(); + + // Copy Vertex data to a buffer accessible by the device + + VkBufferCreateInfo buffer_info{ + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .size = buffer_size, + .usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT}; + + // We use the Vulkan Memory Allocator to find a memory type that can be written and mapped from the host + // On most setups this will return a memory type that resides in VRAM and is accessible from the host + VmaAllocationCreateInfo buffer_alloc_ci{ + .flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, + .usage = VMA_MEMORY_USAGE_AUTO, + .requiredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT}; + + VmaAllocationInfo buffer_alloc_info{}; + vmaCreateBuffer(context.vma_allocator, &buffer_info, &buffer_alloc_ci, &vertex_buffer, &vertex_buffer_allocation, &buffer_alloc_info); + if (buffer_alloc_info.pMappedData) + { + memcpy(buffer_alloc_info.pMappedData, vertices.data(), buffer_size); + } + else + { + throw std::runtime_error("Could not map vertex buffer."); + } } /** @@ -390,19 +395,22 @@ void HelloTriangle::init_device() */ void HelloTriangle::init_per_frame(PerFrame &per_frame) { - VkFenceCreateInfo info{VK_STRUCTURE_TYPE_FENCE_CREATE_INFO}; - info.flags = VK_FENCE_CREATE_SIGNALED_BIT; + VkFenceCreateInfo info{ + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .flags = VK_FENCE_CREATE_SIGNALED_BIT}; VK_CHECK(vkCreateFence(context.device, &info, nullptr, &per_frame.queue_submit_fence)); - VkCommandPoolCreateInfo cmd_pool_info{VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO}; - cmd_pool_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT; - cmd_pool_info.queueFamilyIndex = context.graphics_queue_index; + VkCommandPoolCreateInfo cmd_pool_info{ + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, + .queueFamilyIndex = static_cast(context.graphics_queue_index)}; VK_CHECK(vkCreateCommandPool(context.device, &cmd_pool_info, nullptr, &per_frame.primary_command_pool)); - VkCommandBufferAllocateInfo cmd_buf_info{VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO}; - cmd_buf_info.commandPool = per_frame.primary_command_pool; - cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - cmd_buf_info.commandBufferCount = 1; + VkCommandBufferAllocateInfo cmd_buf_info{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = per_frame.primary_command_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1}; VK_CHECK(vkAllocateCommandBuffers(context.device, &cmd_buf_info, &per_frame.primary_command_buffer)); } @@ -514,21 +522,21 @@ void HelloTriangle::init_swapchain() composite = VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR; } - VkSwapchainCreateInfoKHR info{VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR}; - info.surface = context.surface; - info.minImageCount = desired_swapchain_images; - info.imageFormat = format.format; - info.imageColorSpace = format.colorSpace; - info.imageExtent.width = swapchain_size.width; - info.imageExtent.height = swapchain_size.height; - info.imageArrayLayers = 1; - info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; - info.preTransform = pre_transform; - info.compositeAlpha = composite; - info.presentMode = swapchain_present_mode; - info.clipped = true; - info.oldSwapchain = old_swapchain; + VkSwapchainCreateInfoKHR info{ + .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, + .surface = context.surface, + .minImageCount = desired_swapchain_images, + .imageFormat = format.format, + .imageColorSpace = format.colorSpace, + .imageExtent = swapchain_size, + .imageArrayLayers = 1, + .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, + .preTransform = pre_transform, + .compositeAlpha = composite, + .presentMode = swapchain_present_mode, + .clipped = true, + .oldSwapchain = old_swapchain}; VK_CHECK(vkCreateSwapchainKHR(context.device, &info, nullptr, &context.swapchain)); @@ -572,17 +580,12 @@ void HelloTriangle::init_swapchain() for (size_t i = 0; i < image_count; i++) { // Create an image view which we can render into. - VkImageViewCreateInfo view_info{VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO}; - view_info.viewType = VK_IMAGE_VIEW_TYPE_2D; - view_info.format = context.swapchain_dimensions.format; - view_info.image = swapchain_images[i]; - view_info.subresourceRange.levelCount = 1; - view_info.subresourceRange.layerCount = 1; - view_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - view_info.components.r = VK_COMPONENT_SWIZZLE_R; - view_info.components.g = VK_COMPONENT_SWIZZLE_G; - view_info.components.b = VK_COMPONENT_SWIZZLE_B; - view_info.components.a = VK_COMPONENT_SWIZZLE_A; + VkImageViewCreateInfo view_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = swapchain_images[i], + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = context.swapchain_dimensions.format, + .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, .layerCount = 1}}; VkImageView image_view; VK_CHECK(vkCreateImageView(context.device, &view_info, nullptr, &image_view)); @@ -596,23 +599,16 @@ void HelloTriangle::init_swapchain() */ void HelloTriangle::init_render_pass() { - VkAttachmentDescription attachment = {0}; - // Backbuffer format. - attachment.format = context.swapchain_dimensions.format; - // Not multisampled. - attachment.samples = VK_SAMPLE_COUNT_1_BIT; - // When starting the frame, we want tiles to be cleared. - attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - // When ending the frame, we want tiles to be written out. - attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - // Don't care about stencil since we're not using it. - attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - - // The image layout will be undefined when the render pass begins. - attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - // After the render pass is complete, we will transition to PRESENT_SRC_KHR layout. - attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + VkAttachmentDescription attachment{ + .format = context.swapchain_dimensions.format, // Backbuffer format. + .samples = VK_SAMPLE_COUNT_1_BIT, // Not multisampled. + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, // When starting the frame, we want tiles to be cleared. + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, // When ending the frame, we want tiles to be written out. + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, // Don't care about stencil since we're not using it. + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, // Don't care about stencil since we're not using it. + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, // The image layout will be undefined when the render pass begins. + .finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR // After the render pass is complete, we will transition to PRESENT_SRC_KHR layout. + }; // We have one subpass. This subpass has one color attachment. // While executing this subpass, the attachment will be in attachment optimal layout. @@ -623,20 +619,21 @@ void HelloTriangle::init_render_pass() // UNDEFINED is transitioned into COLOR_ATTACHMENT_OPTIMAL. // The final layout in the render pass attachment states PRESENT_SRC_KHR, so we // will get a final transition from COLOR_ATTACHMENT_OPTIMAL to PRESENT_SRC_KHR. - VkSubpassDescription subpass = {0}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &color_ref; + VkSubpassDescription subpass{ + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .colorAttachmentCount = 1, + .pColorAttachments = &color_ref, + }; // Create a dependency to external events. // We need to wait for the WSI semaphore to signal. // Only pipeline stages which depend on COLOR_ATTACHMENT_OUTPUT_BIT will // actually wait for the semaphore, so we must also wait for that pipeline stage. - VkSubpassDependency dependency = {0}; - dependency.srcSubpass = VK_SUBPASS_EXTERNAL; - dependency.dstSubpass = 0; - dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + VkSubpassDependency dependency{ + .srcSubpass = VK_SUBPASS_EXTERNAL, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; // Since we changed the image layout, we need to make the memory visible to // color attachment to modify. @@ -644,46 +641,31 @@ void HelloTriangle::init_render_pass() dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; // Finally, create the renderpass. - VkRenderPassCreateInfo rp_info = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO}; - rp_info.attachmentCount = 1; - rp_info.pAttachments = &attachment; - rp_info.subpassCount = 1; - rp_info.pSubpasses = &subpass; - rp_info.dependencyCount = 1; - rp_info.pDependencies = &dependency; + VkRenderPassCreateInfo rp_info{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &attachment, + .subpassCount = 1, + .pSubpasses = &subpass, + .dependencyCount = 1, + .pDependencies = &dependency}; VK_CHECK(vkCreateRenderPass(context.device, &rp_info, nullptr, &context.render_pass)); } /** - * @brief Helper function to load a shader module. + * @brief Helper function to load a shader module from an offline-compiled SPIR-V file * @param path The path for the shader (relative to the assets directory). * @returns A VkShaderModule handle. Aborts execution if shader creation fails. */ -VkShaderModule HelloTriangle::load_shader_module(const char *path) +VkShaderModule HelloTriangle::load_shader_module(const std::string &path) { - vkb::GLSLCompiler glsl_compiler; - - auto buffer = vkb::fs::read_shader_binary(path); - - std::string file_ext = path; - - // Extract extension name from the glsl shader file - file_ext = file_ext.substr(file_ext.find_last_of(".") + 1); + auto spirv = vkb::fs::read_shader_binary_u32(path); - std::vector spirv; - std::string info_log; - - // Compile the GLSL source - if (!glsl_compiler.compile_to_spirv(find_shader_stage(file_ext), buffer, "main", {}, spirv, info_log)) - { - LOGE("Failed to compile shader, Error: {}", info_log.c_str()); - return VK_NULL_HANDLE; - } - - VkShaderModuleCreateInfo module_info{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO}; - module_info.codeSize = spirv.size() * sizeof(uint32_t); - module_info.pCode = spirv.data(); + VkShaderModuleCreateInfo module_info{ + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = spirv.size() * sizeof(uint32_t), + .pCode = spirv.data()}; VkShaderModule shader_module; VK_CHECK(vkCreateShaderModule(context.device, &module_info, nullptr, &shader_module)); @@ -698,78 +680,123 @@ void HelloTriangle::init_pipeline() { // Create a blank pipeline layout. // We are not binding any resources to the pipeline in this first sample. - VkPipelineLayoutCreateInfo layout_info{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + VkPipelineLayoutCreateInfo layout_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; VK_CHECK(vkCreatePipelineLayout(context.device, &layout_info, nullptr, &context.pipeline_layout)); - VkPipelineVertexInputStateCreateInfo vertex_input{VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO}; + // The Vertex input properties define the interface between the vertex buffer and the vertex shader. // Specify we will use triangle lists to draw geometry. - VkPipelineInputAssemblyStateCreateInfo input_assembly{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO}; - input_assembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + VkPipelineInputAssemblyStateCreateInfo input_assembly{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST}; + + // Define the vertex input binding. + VkVertexInputBindingDescription binding_description{ + .binding = 0, + .stride = sizeof(Vertex), + .inputRate = VK_VERTEX_INPUT_RATE_VERTEX}; + + // Define the vertex input attribute. + std::array attribute_descriptions{ + {{.location = 0, .binding = 0, .format = VK_FORMAT_R32G32_SFLOAT, .offset = offsetof(Vertex, position)}, + {.location = 1, .binding = 0, .format = VK_FORMAT_R32G32B32_SFLOAT, .offset = offsetof(Vertex, color)}}}; + + // Define the pipeline vertex input. + VkPipelineVertexInputStateCreateInfo vertex_input{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &binding_description, + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; // Specify rasterization state. - VkPipelineRasterizationStateCreateInfo raster{VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO}; - raster.cullMode = VK_CULL_MODE_BACK_BIT; - raster.frontFace = VK_FRONT_FACE_CLOCKWISE; - raster.lineWidth = 1.0f; + VkPipelineRasterizationStateCreateInfo raster{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .cullMode = VK_CULL_MODE_BACK_BIT, + .frontFace = VK_FRONT_FACE_CLOCKWISE, + .lineWidth = 1.0f}; // Our attachment will write to all color channels, but no blending is enabled. - VkPipelineColorBlendAttachmentState blend_attachment{}; - blend_attachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + VkPipelineColorBlendAttachmentState blend_attachment{ + .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT}; - VkPipelineColorBlendStateCreateInfo blend{VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO}; - blend.attachmentCount = 1; - blend.pAttachments = &blend_attachment; + VkPipelineColorBlendStateCreateInfo blend{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &blend_attachment}; // We will have one viewport and scissor box. - VkPipelineViewportStateCreateInfo viewport{VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO}; - viewport.viewportCount = 1; - viewport.scissorCount = 1; + VkPipelineViewportStateCreateInfo viewport{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .viewportCount = 1, + .scissorCount = 1}; // Disable all depth testing. - VkPipelineDepthStencilStateCreateInfo depth_stencil{VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO}; + VkPipelineDepthStencilStateCreateInfo depth_stencil{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO}; // No multisampling. - VkPipelineMultisampleStateCreateInfo multisample{VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO}; - multisample.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + VkPipelineMultisampleStateCreateInfo multisample{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT}; // Specify that these states will be dynamic, i.e. not part of pipeline state object. std::array dynamics{VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR}; - VkPipelineDynamicStateCreateInfo dynamic{VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO}; - dynamic.pDynamicStates = dynamics.data(); - dynamic.dynamicStateCount = vkb::to_u32(dynamics.size()); + VkPipelineDynamicStateCreateInfo dynamic{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .dynamicStateCount = static_cast(dynamics.size()), + .pDynamicStates = dynamics.data()}; // Load our SPIR-V shaders. + + // Samples support different shading languages, all of which are offline compiled to SPIR-V, the shader format that Vulkan uses. + // The shading language to load for can be selected via command line + std::string shader_folder{""}; + switch (get_shading_language()) + { + case vkb::ShadingLanguage::HLSL: + shader_folder = "hlsl"; + break; + case vkb::ShadingLanguage::SLANG: + shader_folder = "slang"; + break; + default: + shader_folder = "glsl"; + } + std::array shader_stages{}; // Vertex stage of the pipeline - shader_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shader_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; - shader_stages[0].module = load_shader_module("triangle.vert"); - shader_stages[0].pName = "main"; + shader_stages[0] = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = load_shader_module("hello_triangle/" + shader_folder + "/triangle.vert.spv"), + .pName = "main"}; // Fragment stage of the pipeline - shader_stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shader_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; - shader_stages[1].module = load_shader_module("triangle.frag"); - shader_stages[1].pName = "main"; - - VkGraphicsPipelineCreateInfo pipe{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; - pipe.stageCount = vkb::to_u32(shader_stages.size()); - pipe.pStages = shader_stages.data(); - pipe.pVertexInputState = &vertex_input; - pipe.pInputAssemblyState = &input_assembly; - pipe.pRasterizationState = &raster; - pipe.pColorBlendState = &blend; - pipe.pMultisampleState = &multisample; - pipe.pViewportState = &viewport; - pipe.pDepthStencilState = &depth_stencil; - pipe.pDynamicState = &dynamic; - - // We need to specify the pipeline layout and the render pass description up front as well. - pipe.renderPass = context.render_pass; - pipe.layout = context.pipeline_layout; + shader_stages[1] = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = load_shader_module("hello_triangle/" + shader_folder + "/triangle.frag.spv"), + .pName = "main"}; + + VkGraphicsPipelineCreateInfo pipe{ + .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .stageCount = static_cast(shader_stages.size()), + .pStages = shader_stages.data(), + .pVertexInputState = &vertex_input, + .pInputAssemblyState = &input_assembly, + .pViewportState = &viewport, + .pRasterizationState = &raster, + .pMultisampleState = &multisample, + .pDepthStencilState = &depth_stencil, + .pColorBlendState = &blend, + .pDynamicState = &dynamic, + .layout = context.pipeline_layout, // We need to specify the pipeline layout up front + .renderPass = context.render_pass // We need to specify the render pass up front + }; VK_CHECK(vkCreateGraphicsPipelines(context.device, VK_NULL_HANDLE, 1, &pipe, nullptr, &context.pipeline)); @@ -788,7 +815,8 @@ VkResult HelloTriangle::acquire_next_image(uint32_t *image) VkSemaphore acquire_semaphore; if (context.recycled_semaphores.empty()) { - VkSemaphoreCreateInfo info = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; + VkSemaphoreCreateInfo info = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; VK_CHECK(vkCreateSemaphore(context.device, &info, nullptr, &acquire_semaphore)); } else @@ -850,44 +878,48 @@ void HelloTriangle::render_triangle(uint32_t swapchain_index) VkCommandBuffer cmd = context.per_frame[swapchain_index].primary_command_buffer; // We will only submit this once before it's recycled. - VkCommandBufferBeginInfo begin_info{VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO}; - begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + VkCommandBufferBeginInfo begin_info{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT}; // Begin command recording vkBeginCommandBuffer(cmd, &begin_info); // Set clear color values. - VkClearValue clear_value{}; - clear_value.color = {{0.01f, 0.01f, 0.033f, 1.0f}}; + VkClearValue clear_value{ + .color = {{0.01f, 0.01f, 0.033f, 1.0f}}}; // Begin the render pass. - VkRenderPassBeginInfo rp_begin{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO}; - rp_begin.renderPass = context.render_pass; - rp_begin.framebuffer = framebuffer; - rp_begin.renderArea.extent.width = context.swapchain_dimensions.width; - rp_begin.renderArea.extent.height = context.swapchain_dimensions.height; - rp_begin.clearValueCount = 1; - rp_begin.pClearValues = &clear_value; + VkRenderPassBeginInfo rp_begin{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, + .renderPass = context.render_pass, + .framebuffer = framebuffer, + .renderArea = {.extent = {.width = context.swapchain_dimensions.width, .height = context.swapchain_dimensions.height}}, + .clearValueCount = 1, + .pClearValues = &clear_value}; // We will add draw commands in the same command buffer. vkCmdBeginRenderPass(cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE); // Bind the graphics pipeline. vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, context.pipeline); - VkViewport vp{}; - vp.width = static_cast(context.swapchain_dimensions.width); - vp.height = static_cast(context.swapchain_dimensions.height); - vp.minDepth = 0.0f; - vp.maxDepth = 1.0f; + VkViewport vp{ + .width = static_cast(context.swapchain_dimensions.width), + .height = static_cast(context.swapchain_dimensions.height), + .minDepth = 0.0f, + .maxDepth = 1.0f}; // Set viewport dynamically vkCmdSetViewport(cmd, 0, 1, &vp); - VkRect2D scissor{}; - scissor.extent.width = context.swapchain_dimensions.width; - scissor.extent.height = context.swapchain_dimensions.height; + VkRect2D scissor{ + .extent = {.width = context.swapchain_dimensions.width, .height = context.swapchain_dimensions.height}}; // Set scissor dynamically vkCmdSetScissor(cmd, 0, 1, &scissor); - // Draw three vertices with one instance. + // Bind the vertex buffer to source the draw calls from. + VkDeviceSize offset = {0}; + vkCmdBindVertexBuffers(cmd, 0, 1, &vertex_buffer, &offset); + + // Draw three vertices with one instance from the currently bound vertex bound. vkCmdDraw(cmd, 3, 1, 0, 0); // Complete render pass. @@ -899,21 +931,22 @@ void HelloTriangle::render_triangle(uint32_t swapchain_index) // Submit it to the queue with a release semaphore. if (context.per_frame[swapchain_index].swapchain_release_semaphore == VK_NULL_HANDLE) { - VkSemaphoreCreateInfo semaphore_info{VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; - VK_CHECK(vkCreateSemaphore(context.device, &semaphore_info, nullptr, - &context.per_frame[swapchain_index].swapchain_release_semaphore)); + VkSemaphoreCreateInfo semaphore_info{ + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; + VK_CHECK(vkCreateSemaphore(context.device, &semaphore_info, nullptr, &context.per_frame[swapchain_index].swapchain_release_semaphore)); } VkPipelineStageFlags wait_stage{VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; - VkSubmitInfo info{VK_STRUCTURE_TYPE_SUBMIT_INFO}; - info.commandBufferCount = 1; - info.pCommandBuffers = &cmd; - info.waitSemaphoreCount = 1; - info.pWaitSemaphores = &context.per_frame[swapchain_index].swapchain_acquire_semaphore; - info.pWaitDstStageMask = &wait_stage; - info.signalSemaphoreCount = 1; - info.pSignalSemaphores = &context.per_frame[swapchain_index].swapchain_release_semaphore; + VkSubmitInfo info{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context.per_frame[swapchain_index].swapchain_acquire_semaphore, + .pWaitDstStageMask = &wait_stage, + .commandBufferCount = 1, + .pCommandBuffers = &cmd, + .signalSemaphoreCount = 1, + .pSignalSemaphores = &context.per_frame[swapchain_index].swapchain_release_semaphore}; // Submit command buffer to graphics queue VK_CHECK(vkQueueSubmit(context.queue, 1, &info, context.per_frame[swapchain_index].queue_submit_fence)); } @@ -925,12 +958,14 @@ void HelloTriangle::render_triangle(uint32_t swapchain_index) */ VkResult HelloTriangle::present_image(uint32_t index) { - VkPresentInfoKHR present{VK_STRUCTURE_TYPE_PRESENT_INFO_KHR}; - present.swapchainCount = 1; - present.pSwapchains = &context.swapchain; - present.pImageIndices = &index; - present.waitSemaphoreCount = 1; - present.pWaitSemaphores = &context.per_frame[index].swapchain_release_semaphore; + VkPresentInfoKHR present{ + .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context.per_frame[index].swapchain_release_semaphore, + .swapchainCount = 1, + .pSwapchains = &context.swapchain, + .pImageIndices = &index, + }; // Present swapchain image return vkQueuePresentKHR(context.queue, &present); } @@ -946,13 +981,14 @@ void HelloTriangle::init_framebuffers() for (auto &image_view : context.swapchain_image_views) { // Build the framebuffer. - VkFramebufferCreateInfo fb_info{VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO}; - fb_info.renderPass = context.render_pass; - fb_info.attachmentCount = 1; - fb_info.pAttachments = &image_view; - fb_info.width = context.swapchain_dimensions.width; - fb_info.height = context.swapchain_dimensions.height; - fb_info.layers = 1; + VkFramebufferCreateInfo fb_info{ + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .renderPass = context.render_pass, + .attachmentCount = 1, + .pAttachments = &image_view, + .width = context.swapchain_dimensions.width, + .height = context.swapchain_dimensions.height, + .layers = 1}; VkFramebuffer framebuffer; VK_CHECK(vkCreateFramebuffer(context.device, &fb_info, nullptr, &framebuffer)); @@ -1018,6 +1054,16 @@ HelloTriangle::~HelloTriangle() vkDestroySurfaceKHR(context.instance, context.surface, nullptr); } + if (vertex_buffer_allocation != VK_NULL_HANDLE) + { + vmaDestroyBuffer(context.vma_allocator, vertex_buffer, vertex_buffer_allocation); + } + + if (context.vma_allocator != VK_NULL_HANDLE) + { + vmaDestroyAllocator(context.vma_allocator); + } + if (context.device != VK_NULL_HANDLE) { vkDestroyDevice(context.device, nullptr); @@ -1039,7 +1085,7 @@ bool HelloTriangle::prepare(const vkb::ApplicationOptions &options) init_instance(); - vk_instance = std::make_unique(context.instance); + vk_instance = std::make_unique(context.instance); context.surface = options.window->create_surface(*vk_instance); auto &extent = options.window->get_extent(); @@ -1053,6 +1099,8 @@ bool HelloTriangle::prepare(const vkb::ApplicationOptions &options) init_device(); + init_vertex_buffer(); + init_swapchain(); // Create the necessary objects for rendering. diff --git a/samples/api/hello_triangle/hello_triangle.h b/samples/api/hello_triangle/hello_triangle.h index 5a23153a2b..9e68d7243f 100644 --- a/samples/api/hello_triangle/hello_triangle.h +++ b/samples/api/hello_triangle/hello_triangle.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -109,8 +110,26 @@ class HelloTriangle : public vkb::Application /// A set of per-frame data. std::vector per_frame; + + VmaAllocator vma_allocator = VK_NULL_HANDLE; }; + /// Properties of the vertices used in this sample. + struct Vertex + { + glm::vec3 position; + glm::vec3 color; + }; + + /// The Vulkan buffer object that holds the vertex data for the triangle. + VkBuffer vertex_buffer = VK_NULL_HANDLE; + + /// The device memory allocated for the vertex buffer. + VkDeviceMemory vertex_buffer_memory = VK_NULL_HANDLE; + + /// Vulkan Memory Allocator (VMA) allocation info for the vertex buffer. + VmaAllocation vertex_buffer_allocation = VK_NULL_HANDLE; + public: HelloTriangle(); @@ -125,15 +144,12 @@ class HelloTriangle : public vkb::Application bool validate_extensions(const std::vector &required, const std::vector &available); - bool validate_layers(const std::vector &required, - const std::vector &available); - - VkShaderStageFlagBits find_shader_stage(const std::string &ext); - void init_instance(); void init_device(); + void init_vertex_buffer(); + void init_per_frame(PerFrame &per_frame); void teardown_per_frame(PerFrame &per_frame); @@ -142,7 +158,7 @@ class HelloTriangle : public vkb::Application void init_render_pass(); - VkShaderModule load_shader_module(const char *path); + VkShaderModule load_shader_module(const std::string &path); void init_pipeline(); @@ -157,7 +173,7 @@ class HelloTriangle : public vkb::Application private: Context context; - std::unique_ptr vk_instance; + std::unique_ptr vk_instance; }; std::unique_ptr create_hello_triangle(); diff --git a/samples/api/hpp_hlsl_shaders/CMakeLists.txt b/samples/api/hello_triangle_1_3/CMakeLists.txt similarity index 58% rename from samples/api/hpp_hlsl_shaders/CMakeLists.txt rename to samples/api/hello_triangle_1_3/CMakeLists.txt index 600b4c017d..08fe68f6cf 100644 --- a/samples/api/hpp_hlsl_shaders/CMakeLists.txt +++ b/samples/api/hello_triangle_1_3/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # # SPDX-License-Identifier: Apache-2.0 # @@ -13,18 +13,25 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# + +set(CMAKE_CXX_EXTENSIONS OFF) get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) -add_sample_with_tags( +add_sample( ID ${FOLDER_NAME} CATEGORY ${CATEGORY_NAME} - AUTHOR "Sascha Willems" - NAME "HPP Using HLSL shaders in Vulkan with glslang" - DESCRIPTION "Shows how to generate SPIR-V from HLSL shaders that can be used in Vulkan, using vulkan.hpp" + AUTHOR "Huawei Technologies Co., Ltd." + NAME "Vulkan 1.3 Hello Triangle" + DESCRIPTION "An introduction into Vulkan using Vulkan 1.3" SHADER_FILES_GLSL - "hlsl_shaders/hlsl_shader.vert" - "hlsl_shaders/hlsl_shader.frag") \ No newline at end of file + "hello_triangle_1_3/glsl/triangle.vert" + "hello_triangle_1_3/glsl/triangle.frag" + SHADER_FILES_HLSL + "hello_triangle_1_3/hlsl/triangle.vert.hlsl" + "hello_triangle_1_3/hlsl/triangle.frag.hlsl" + SHADER_FILES_SLANG + "hello_triangle_1_3/slang/triangle.vert.slang" + "hello_triangle_1_3/slang/triangle.frag.slang") \ No newline at end of file diff --git a/samples/api/hello_triangle_1_3/README.adoc b/samples/api/hello_triangle_1_3/README.adoc new file mode 100644 index 0000000000..37544e137e --- /dev/null +++ b/samples/api/hello_triangle_1_3/README.adoc @@ -0,0 +1,213 @@ +//// + * Copyright (c) 2024, Huawei Technologies Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +//// += Hello Triangle with Vulkan 1.3 Features + +ifdef::site-gen-antora[] +TIP: The source for this sample can be found in the https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/api/hello_triangle_1_3[Khronos Vulkan samples github repository]. +endif::[] + + +This sample demonstrates how to render a simple triangle using Vulkan 1.3 core features. It modernizes the traditional "Hello Triangle" Vulkan sample by incorporating: + +- **Dynamic Rendering** +- **Synchronization2** +- **Extended Dynamic State** +- **Vertex Buffers** + +## Overview + +The sample renders a colored triangle to the screen using Vulkan 1.3. It showcases how to: + +- Initialize Vulkan with Vulkan 1.3 features enabled. +- Use dynamic rendering to simplify the rendering pipeline. +- Employ the Synchronization2 API for improved synchronization. +- Utilize extended dynamic states to reduce pipeline complexity. +- Manage vertex data using vertex buffers instead of hard-coded vertices. + +## Key Features + +### 1. Dynamic Rendering + +**What is Dynamic Rendering?** + +Dynamic Rendering is a feature introduced in Vulkan 1.3 that allows rendering without pre-defined render passes and framebuffers. It simplifies the rendering process by enabling you to specify rendering states directly during command buffer recording. + +**How It's Used in the Sample:** + +- **No Render Passes or Framebuffers:** The sample does not create `VkRenderPass` or `VkFramebuffer` objects. +- **`vkCmdBeginRendering()` and `vkCmdEndRendering()`:** These functions are used to begin and end rendering operations dynamically. +- **Pipeline Creation:** Uses `VkPipelineRenderingCreateInfo` during pipeline creation to specify rendering details. + +**Benefits:** + +- Simplifies code by reducing boilerplate associated with render passes and framebuffers. +- Increases flexibility by allowing rendering to different attachments without recreating render passes. + +### 2. Synchronization2 + +**What is Synchronization2?** + +Synchronization2 is an improved synchronization API introduced in Vulkan 1.3. It provides more granular control over synchronization primitives and simplifies the synchronization process. + +**How It's Used in the Sample:** + +- **`vkCmdPipelineBarrier2()`:** Replaces the older `vkCmdPipelineBarrier()` for more detailed synchronization. +- **`VkDependencyInfo` and `VkImageMemoryBarrier2`:** Used to specify precise memory dependencies and image layout transitions. + +**Example Usage:** + +```cpp +VkImageMemoryBarrier2 image_barrier = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, + // ... other members ... +}; + +VkDependencyInfo dependency_info = { + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &image_barrier, +}; + +vkCmdPipelineBarrier2(cmd, &dependency_info); +``` + +**Benefits:** + +- Provides more expressive and flexible synchronization. +- Reduces the potential for synchronization errors. +- Simplifies the specification of pipeline stages and access masks. + +### 3. Extended Dynamic State + +**What is Extended Dynamic State?** + +Extended Dynamic State allows more pipeline states to be set dynamically at command buffer recording time rather than during pipeline creation. This reduces the number of pipeline objects needed. + +**How It's Used in the Sample:** + +- **Dynamic States Enabled:** The sample enables dynamic states like `VK_DYNAMIC_STATE_CULL_MODE`, `VK_DYNAMIC_STATE_FRONT_FACE`, and `VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY`. +- **Dynamic State Commands:** Uses `vkCmdSetCullMode()`, `vkCmdSetFrontFace()`, and `vkCmdSetPrimitiveTopology()` to set these states dynamically. + +**Example Usage:** + +```cpp +vkCmdSetCullMode(cmd, VK_CULL_MODE_NONE); +vkCmdSetFrontFace(cmd, VK_FRONT_FACE_CLOCKWISE); +vkCmdSetPrimitiveTopology(cmd, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST); +``` + +**Benefits:** + +- Reduces the need to create multiple pipelines for different state configurations. +- Enhances flexibility by allowing state changes without pipeline recreation. + +### 4. Vertex Buffers + +**What Changed?** + +Unlike the original sample, which used hard-coded vertices in the shader, this sample uses a vertex buffer to store vertex data. + +**How It's Used in the Sample:** + +- **Vertex Structure Defined:** + +```cpp + struct Vertex { + glm::vec2 position; + glm::vec3 color; + }; +``` + +- **Vertex Data Stored in a Buffer:** + +```cpp + std::vector vertices = { + {{0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, // Red Vertex + // ... other vertices ... + }; +``` + +- **Buffer Creation and Memory Allocation:** + +```cpp + VkBufferCreateInfo buffer_info = { /* ... */ }; + vkCreateBuffer(device, &buffer_info, nullptr, &vertex_buffer); + + VkMemoryAllocateInfo alloc_info = { /* ... */ }; + vkAllocateMemory(device, &alloc_info, nullptr, &vertex_buffer_memory); +``` + +- **Binding the Vertex Buffer:** + +```cpp + vkCmdBindVertexBuffers(cmd, 0, 1, &vertex_buffer, &offset); +``` + +**Benefits:** + +- **Flexibility:** Easier to modify vertex data without changing shaders. +- **Performance:** Potentially better performance due to efficient memory usage. +- **Scalability:** Simplifies rendering more complex geometries. + +## How the Sample Works + +1. **Initialization:** + + - **Instance Creation:** Initializes a Vulkan instance with Vulkan 1.3 API version and required extensions. + - **Device Selection:** Chooses a physical device that supports Vulkan 1.3 and required features. + - **Logical Device Creation:** Creates a logical device with enabled Vulkan 1.3 features like dynamic rendering, synchronization2, and extended dynamic state. + - **Surface and Swapchain Creation:** Sets up the window surface and initializes the swapchain for presenting images. + +2. **Vertex Buffer Setup:** + + - **Vertex Data Definition:** Defines vertices with positions and colors. + - **Buffer Creation:** Creates a buffer to store vertex data. + - **Memory Allocation:** Allocates memory for the buffer and maps the vertex data into it. + +3. **Pipeline Setup:** + + - **Shader Modules:** Loads and compiles vertex and fragment shaders. + - **Pipeline Layout:** Creates a pipeline layout (empty in this case as no descriptors are used). + - **Dynamic States Specification:** Specifies which states will be dynamic. + - **Graphics Pipeline Creation:** Creates the graphics pipeline with dynamic rendering info and dynamic states enabled. + +4. **Rendering Loop:** + + - **Acquire Swapchain Image:** Gets the next available image from the swapchain. + - **Command Buffer Recording:** + + - **Begin Rendering:** Uses `vkCmdBeginRendering()` with dynamic rendering info. + - **Set Dynamic States:** Sets viewport, scissor, cull mode, front face, and primitive topology dynamically. + - **Bind Pipeline and Vertex Buffer:** Binds the graphics pipeline and the vertex buffer. + - **Draw Call:** Issues a draw call to render the triangle. + - **End Rendering:** Uses `vkCmdEndRendering()` to finish rendering. + - **Image Layout Transition:** Transitions the swapchain image layout for presentation using `vkCmdPipelineBarrier2()`. + + - **Queue Submission:** Submits the command buffer to the graphics queue. + - **Present Image:** Presents the rendered image to the screen. + +5. **Cleanup:** + + - **Resource Destruction:** Cleans up Vulkan resources like pipelines, buffers, and swapchain images upon application exit. + +## Dependencies and Requirements + +- **Vulkan SDK 1.3 or Later:** Ensure you have the Vulkan SDK that supports Vulkan 1.3. +- **Hardware Support:** A GPU that supports Vulkan 1.3 features, including dynamic rendering, synchronization2, and extended dynamic state. +- **GLM Library:** Used for vector and matrix operations. +- **Shader Compiler:** GLSL shaders are compiled at runtime using a GLSL compiler. \ No newline at end of file diff --git a/samples/api/hello_triangle_1_3/hello_triangle_1_3.cpp b/samples/api/hello_triangle_1_3/hello_triangle_1_3.cpp new file mode 100644 index 0000000000..bbfa0579bb --- /dev/null +++ b/samples/api/hello_triangle_1_3/hello_triangle_1_3.cpp @@ -0,0 +1,1300 @@ +/* Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "hello_triangle_1_3.h" + +#include "common/vk_common.h" +#include "core/util/logging.hpp" +#include "filesystem/legacy.h" +#include "platform/window.h" + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) +/// @brief A debug callback called from Vulkan validation layers. +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, + VkDebugUtilsMessageTypeFlagsEXT message_types, + const VkDebugUtilsMessengerCallbackDataEXT *callback_data, + void *user_data) +{ + if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) + { + LOGE("{} Validation Layer: Error: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) + { + LOGW("{} Validation Layer: Warning: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) + { + LOGI("{} Validation Layer: Information: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_types & VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT) + { + LOGI("{} Validation Layer: Performance warning: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) + { + LOGD("{} Validation Layer: Verbose: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + return VK_FALSE; +} +#endif + +/** + * @brief Validates a list of required extensions, comparing it with the available ones. + * + * @param required A vector containing required extension names. + * @param available A VkExtensionProperties object containing available extensions. + * @return true if all required extensions are available + * @return false otherwise + */ +bool HelloTriangleV13::validate_extensions(const std::vector &required, + const std::vector &available) +{ + bool all_found = true; + + for (const auto *extension_name : required) + { + bool found = false; + for (const auto &available_extension : available) + { + if (strcmp(available_extension.extensionName, extension_name) == 0) + { + found = true; + break; + } + } + + if (!found) + { + // Output an error message for the missing extension + LOGE("Error: Required extension not found: {}", extension_name); + all_found = false; + } + } + + return all_found; +} + +/** + * @brief Initializes the Vulkan instance. + */ +void HelloTriangleV13::init_instance() +{ + LOGI("Initializing Vulkan instance."); + + if (volkInitialize()) + { + throw std::runtime_error("Failed to initialize volk."); + } + + uint32_t instance_extension_count; + VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, nullptr)); + + std::vector available_instance_extensions(instance_extension_count); + VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, available_instance_extensions.data())); + + std::vector required_instance_extensions{VK_KHR_SURFACE_EXTENSION_NAME}; + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + bool has_debug_utils = false; + for (const auto &ext : available_instance_extensions) + { + if (strncmp(ext.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME, strlen(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) == 0) + { + has_debug_utils = true; + break; + } + } + if (has_debug_utils) + { + required_instance_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + else + { + LOGW("{} is not available; disabling debug utils messenger", VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } +#endif + +#if (defined(VKB_ENABLE_PORTABILITY)) + required_instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + bool portability_enumeration_available = false; + if (std::ranges::any_of(available_instance_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) + { + required_instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + portability_enumeration_available = true; + } +#endif + +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + required_instance_extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_WIN32_KHR) + required_instance_extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_METAL_EXT) + required_instance_extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_XCB_KHR) + required_instance_extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_XLIB_KHR) + required_instance_extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) + required_instance_extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) + required_instance_extensions.push_back(VK_KHR_DISPLAY_EXTENSION_NAME); +#else +# pragma error Platform not supported +#endif + + if (!validate_extensions(required_instance_extensions, available_instance_extensions)) + { + throw std::runtime_error("Required instance extensions are missing."); + } + + std::vector requested_instance_layers{}; + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + char const *validationLayer = "VK_LAYER_KHRONOS_validation"; + + uint32_t instance_layer_count; + VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr)); + + std::vector supported_instance_layers(instance_layer_count); + VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_instance_layers.data())); + + if (std::ranges::any_of(supported_instance_layers, [&validationLayer](auto const &lp) { return strcmp(lp.layerName, validationLayer) == 0; })) + { + requested_instance_layers.push_back(validationLayer); + LOGI("Enabled Validation Layer {}", validationLayer); + } + else + { + LOGW("Validation Layer {} is not available", validationLayer); + } +#endif + + VkApplicationInfo app{ + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pApplicationName = "Hello Triangle V1.3", + .pEngineName = "Vulkan Samples", + .apiVersion = VK_API_VERSION_1_3}; + + VkInstanceCreateInfo instance_info{ + .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + .pApplicationInfo = &app, + .enabledLayerCount = vkb::to_u32(requested_instance_layers.size()), + .ppEnabledLayerNames = requested_instance_layers.data(), + .enabledExtensionCount = vkb::to_u32(required_instance_extensions.size()), + .ppEnabledExtensionNames = required_instance_extensions.data()}; + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + VkDebugUtilsMessengerCreateInfoEXT debug_messenger_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; + if (has_debug_utils) + { + debug_messenger_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; + debug_messenger_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; + debug_messenger_create_info.pfnUserCallback = debug_callback; + + instance_info.pNext = &debug_messenger_create_info; + } +#endif + +#if (defined(VKB_ENABLE_PORTABILITY)) + if (portability_enumeration_available) + { + instance_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + } +#endif + + // Create the Vulkan instance + VK_CHECK(vkCreateInstance(&instance_info, nullptr, &context.instance)); + + volkLoadInstance(context.instance); + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + if (has_debug_utils) + { + VK_CHECK(vkCreateDebugUtilsMessengerEXT(context.instance, &debug_messenger_create_info, nullptr, &context.debug_callback)); + } +#endif +} + +/** + * @brief Initializes the Vulkan physical device and logical device. + */ +void HelloTriangleV13::init_device() +{ + LOGI("Initializing Vulkan device."); + + uint32_t gpu_count = 0; + VK_CHECK(vkEnumeratePhysicalDevices(context.instance, &gpu_count, nullptr)); + + if (gpu_count < 1) + { + throw std::runtime_error("No physical device found."); + } + + std::vector gpus(gpu_count); + VK_CHECK(vkEnumeratePhysicalDevices(context.instance, &gpu_count, gpus.data())); + + for (const auto &physical_device : gpus) + { + // Check if the device supports Vulkan 1.3 + VkPhysicalDeviceProperties device_properties; + vkGetPhysicalDeviceProperties(physical_device, &device_properties); + + if (device_properties.apiVersion < VK_API_VERSION_1_3) + { + LOGW("Physical device '{}' does not support Vulkan 1.3, skipping.", device_properties.deviceName); + continue; + } + + // Find a queue family that supports graphics and presentation + uint32_t queue_family_count = 0; + vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, nullptr); + + std::vector queue_family_properties(queue_family_count); + vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, queue_family_properties.data()); + + for (uint32_t i = 0; i < queue_family_count; i++) + { + VkBool32 supports_present = VK_FALSE; + vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, i, context.surface, &supports_present); + + if ((queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && supports_present) + { + context.graphics_queue_index = i; + break; + } + } + + if (context.graphics_queue_index >= 0) + { + context.gpu = physical_device; + break; + } + } + + if (context.graphics_queue_index < 0) + { + throw std::runtime_error("Failed to find a suitable GPU with Vulkan 1.3 support."); + } + + uint32_t device_extension_count; + + VK_CHECK(vkEnumerateDeviceExtensionProperties(context.gpu, nullptr, &device_extension_count, nullptr)); + + std::vector device_extensions(device_extension_count); + + VK_CHECK(vkEnumerateDeviceExtensionProperties(context.gpu, nullptr, &device_extension_count, device_extensions.data())); + + // Since this sample has visual output, the device needs to support the swapchain extension + std::vector required_device_extensions{VK_KHR_SWAPCHAIN_EXTENSION_NAME}; + + if (!validate_extensions(required_device_extensions, device_extensions)) + { + throw std::runtime_error("Required device extensions are missing"); + } + +#if (defined(VKB_ENABLE_PORTABILITY)) + // VK_KHR_portability_subset must be enabled if present in the implementation (e.g on macOS/iOS with beta extensions enabled) + if (std::ranges::any_of(device_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0; })) + { + required_device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + } +#endif + + // Query for Vulkan 1.3 features + VkPhysicalDeviceFeatures2 query_device_features2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2}; + VkPhysicalDeviceVulkan13Features query_vulkan13_features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES}; + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT query_extended_dynamic_state_features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT}; + query_device_features2.pNext = &query_vulkan13_features; + query_vulkan13_features.pNext = &query_extended_dynamic_state_features; + + vkGetPhysicalDeviceFeatures2(context.gpu, &query_device_features2); + + // Check if Physical device supports Vulkan 1.3 features + if (!query_vulkan13_features.dynamicRendering) + { + throw std::runtime_error("Dynamic Rendering feature is missing"); + } + + if (!query_vulkan13_features.synchronization2) + { + throw std::runtime_error("Synchronization2 feature is missing"); + } + + if (!query_extended_dynamic_state_features.extendedDynamicState) + { + throw std::runtime_error("Extended Dynamic State feature is missing"); + } + + // Enable only specific Vulkan 1.3 features + + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT enable_extended_dynamic_state_features = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, + .extendedDynamicState = VK_TRUE}; + + VkPhysicalDeviceVulkan13Features enable_vulkan13_features = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, + .pNext = &enable_extended_dynamic_state_features, + .synchronization2 = VK_TRUE, + .dynamicRendering = VK_TRUE, + }; + + VkPhysicalDeviceFeatures2 enable_device_features2{ + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, + .pNext = &enable_vulkan13_features}; + // Create the logical device + + float queue_priority = 0.5f; + + // Create one queue + VkDeviceQueueCreateInfo queue_info{ + .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, + .queueFamilyIndex = static_cast(context.graphics_queue_index), + .queueCount = 1, + .pQueuePriorities = &queue_priority}; + + VkDeviceCreateInfo device_info{ + .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, + .pNext = &enable_device_features2, + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &queue_info, + .enabledExtensionCount = vkb::to_u32(required_device_extensions.size()), + .ppEnabledExtensionNames = required_device_extensions.data()}; + + VK_CHECK(vkCreateDevice(context.gpu, &device_info, nullptr, &context.device)); + volkLoadDevice(context.device); + + vkGetDeviceQueue(context.device, context.graphics_queue_index, 0, &context.queue); +} + +/** + * @brief Initializes the vertex buffer by creating it, allocating memory, binding the memory, and uploading vertex data. + * @note This function must be called after the Vulkan device has been initialized. + * @throws std::runtime_error if any Vulkan operation fails. + */ +void HelloTriangleV13::init_vertex_buffer() +{ + VkDeviceSize buffer_size = sizeof(vertices[0]) * vertices.size(); + + // Create the vertex buffer + VkBufferCreateInfo vertext_buffer_info{ + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .flags = 0, + .size = buffer_size, + .usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE}; + + VK_CHECK(vkCreateBuffer(context.device, &vertext_buffer_info, nullptr, &context.vertex_buffer)); + + // Get memory requirements + VkMemoryRequirements memory_requirements; + vkGetBufferMemoryRequirements(context.device, context.vertex_buffer, &memory_requirements); + + // Allocate memory for the buffer + VkMemoryAllocateInfo alloc_info{ + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = memory_requirements.size, + .memoryTypeIndex = find_memory_type(context.gpu, memory_requirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)}; + + VK_CHECK(vkAllocateMemory(context.device, &alloc_info, nullptr, &context.vertex_buffer_memory)); + + // Bind the buffer with the allocated memory + VK_CHECK(vkBindBufferMemory(context.device, context.vertex_buffer, context.vertex_buffer_memory, 0)); + + // Map the memory and copy the vertex data + void *data; + VK_CHECK(vkMapMemory(context.device, context.vertex_buffer_memory, 0, buffer_size, 0, &data)); + memcpy(data, vertices.data(), static_cast(buffer_size)); + vkUnmapMemory(context.device, context.vertex_buffer_memory); +} + +/** + * @brief Finds a suitable memory type index for allocating memory. + * + * This function searches through the physical device's memory types to find one that matches + * the requirements specified by `type_filter` and `properties`. It's typically used when allocating + * memory for buffers or images, ensuring that the memory type supports the desired properties. + * + * @param physical_device The Vulkan physical device to query for memory properties. + * @param type_filter A bitmask specifying the acceptable memory types. + * This is usually obtained from `VkMemoryRequirements::memoryTypeBits`. + * @param properties A bitmask specifying the desired memory properties, + * such as `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` or `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`. + * @return The index of a suitable memory type. + * @throws std::runtime_error if no suitable memory type is found. + */ +uint32_t HelloTriangleV13::find_memory_type(VkPhysicalDevice physical_device, uint32_t type_filter, VkMemoryPropertyFlags properties) +{ + // Structure to hold the physical device's memory properties + VkPhysicalDeviceMemoryProperties mem_properties; + vkGetPhysicalDeviceMemoryProperties(physical_device, &mem_properties); + + // Iterate over all memory types available on the physical device + for (uint32_t i = 0; i < mem_properties.memoryTypeCount; i++) + { + // Check if the current memory type is acceptable based on the type_filter + // The type_filter is a bitmask where each bit represents a memory type that is suitable + if (type_filter & (1 << i)) + { + // Check if the memory type has all the desired property flags + // properties is a bitmask of the required memory properties + if ((mem_properties.memoryTypes[i].propertyFlags & properties) == properties) + { + // Found a suitable memory type; return its index + return i; + } + } + } + + // If no suitable memory type was found, throw an exception + throw std::runtime_error("Failed to find suitable memory type."); +} +/** + * @brief Initializes per frame data. + * @param per_frame The data of a frame. + */ +void HelloTriangleV13::init_per_frame(PerFrame &per_frame) +{ + VkFenceCreateInfo info{ + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .flags = VK_FENCE_CREATE_SIGNALED_BIT}; + VK_CHECK(vkCreateFence(context.device, &info, nullptr, &per_frame.queue_submit_fence)); + + VkCommandPoolCreateInfo cmd_pool_info{ + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, + .queueFamilyIndex = static_cast(context.graphics_queue_index)}; + VK_CHECK(vkCreateCommandPool(context.device, &cmd_pool_info, nullptr, &per_frame.primary_command_pool)); + + VkCommandBufferAllocateInfo cmd_buf_info{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = per_frame.primary_command_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1}; + VK_CHECK(vkAllocateCommandBuffers(context.device, &cmd_buf_info, &per_frame.primary_command_buffer)); +} + +/** + * @brief Tears down the frame data. + * @param per_frame The data of a frame. + */ +void HelloTriangleV13::teardown_per_frame(PerFrame &per_frame) +{ + if (per_frame.queue_submit_fence != VK_NULL_HANDLE) + { + vkDestroyFence(context.device, per_frame.queue_submit_fence, nullptr); + + per_frame.queue_submit_fence = VK_NULL_HANDLE; + } + + if (per_frame.primary_command_buffer != VK_NULL_HANDLE) + { + vkFreeCommandBuffers(context.device, per_frame.primary_command_pool, 1, &per_frame.primary_command_buffer); + + per_frame.primary_command_buffer = VK_NULL_HANDLE; + } + + if (per_frame.primary_command_pool != VK_NULL_HANDLE) + { + vkDestroyCommandPool(context.device, per_frame.primary_command_pool, nullptr); + + per_frame.primary_command_pool = VK_NULL_HANDLE; + } + + if (per_frame.swapchain_acquire_semaphore != VK_NULL_HANDLE) + { + vkDestroySemaphore(context.device, per_frame.swapchain_acquire_semaphore, nullptr); + + per_frame.swapchain_acquire_semaphore = VK_NULL_HANDLE; + } + + if (per_frame.swapchain_release_semaphore != VK_NULL_HANDLE) + { + vkDestroySemaphore(context.device, per_frame.swapchain_release_semaphore, nullptr); + + per_frame.swapchain_release_semaphore = VK_NULL_HANDLE; + } +} + +/** + * @brief Initializes the Vulkan swapchain. + */ +void HelloTriangleV13::init_swapchain() +{ + VkSurfaceCapabilitiesKHR surface_properties; + VK_CHECK(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(context.gpu, context.surface, &surface_properties)); + + VkSurfaceFormatKHR format = vkb::select_surface_format(context.gpu, context.surface); + + VkExtent2D swapchain_size; + if (surface_properties.currentExtent.width == 0xFFFFFFFF) + { + swapchain_size.width = context.swapchain_dimensions.width; + swapchain_size.height = context.swapchain_dimensions.height; + } + else + { + swapchain_size = surface_properties.currentExtent; + } + + // FIFO must be supported by all implementations. + VkPresentModeKHR swapchain_present_mode = VK_PRESENT_MODE_FIFO_KHR; + + // Determine the number of VkImage's to use in the swapchain. + // Ideally, we desire to own 1 image at a time, the rest of the images can + // either be rendered to and/or being queued up for display. + uint32_t desired_swapchain_images = surface_properties.minImageCount + 1; + if ((surface_properties.maxImageCount > 0) && (desired_swapchain_images > surface_properties.maxImageCount)) + { + // Application must settle for fewer images than desired. + desired_swapchain_images = surface_properties.maxImageCount; + } + + // Figure out a suitable surface transform. + VkSurfaceTransformFlagBitsKHR pre_transform; + if (surface_properties.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) + { + pre_transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; + } + else + { + pre_transform = surface_properties.currentTransform; + } + + VkSwapchainKHR old_swapchain = context.swapchain; + + // one bitmask needs to be set according to the priority of presentation engine + VkCompositeAlphaFlagBitsKHR composite = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + if (surface_properties.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) + { + composite = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + } + else if (surface_properties.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) + { + composite = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR; + } + else if (surface_properties.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR) + { + composite = VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR; + } + else if (surface_properties.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR) + { + composite = VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR; + } + + VkSwapchainCreateInfoKHR info{ + .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, + .surface = context.surface, // The surface onto which images will be presented + .minImageCount = desired_swapchain_images, // Minimum number of images in the swapchain (number of buffers) + .imageFormat = format.format, // Format of the swapchain images (e.g., VK_FORMAT_B8G8R8A8_SRGB) + .imageColorSpace = format.colorSpace, // Color space of the images (e.g., VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) + .imageExtent = swapchain_size, // Resolution of the swapchain images (width and height) + .imageArrayLayers = 1, // Number of layers in each image (usually 1 unless stereoscopic) + .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, // How the images will be used (as color attachments) + .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, // Access mode of the images (exclusive to one queue family) + .preTransform = pre_transform, // Transform to apply to images (e.g., rotation) + .compositeAlpha = composite, // Alpha blending to apply (e.g., opaque, pre-multiplied) + .presentMode = swapchain_present_mode, // Presentation mode (e.g., vsync settings) + .clipped = true, // Whether to clip obscured pixels (improves performance) + .oldSwapchain = old_swapchain // Handle to the old swapchain, if replacing an existing one + }; + + VK_CHECK(vkCreateSwapchainKHR(context.device, &info, nullptr, &context.swapchain)); + + if (old_swapchain != VK_NULL_HANDLE) + { + for (VkImageView image_view : context.swapchain_image_views) + { + vkDestroyImageView(context.device, image_view, nullptr); + } + + for (auto &per_frame : context.per_frame) + { + teardown_per_frame(per_frame); + } + + context.swapchain_image_views.clear(); + + vkDestroySwapchainKHR(context.device, old_swapchain, nullptr); + } + + context.swapchain_dimensions = {swapchain_size.width, swapchain_size.height, format.format}; + + uint32_t image_count; + VK_CHECK(vkGetSwapchainImagesKHR(context.device, context.swapchain, &image_count, nullptr)); + + /// The swapchain images. + std::vector swapchain_images(image_count); + VK_CHECK(vkGetSwapchainImagesKHR(context.device, context.swapchain, &image_count, swapchain_images.data())); + + // Store swapchain images + context.swapchain_images = swapchain_images; + + // Initialize per-frame resources. + // Every swapchain image has its own command pool and fence manager. + // This makes it very easy to keep track of when we can reset command buffers and such. + context.per_frame.clear(); + context.per_frame.resize(image_count); + + for (size_t i = 0; i < image_count; i++) + { + init_per_frame(context.per_frame[i]); + } + + for (size_t i = 0; i < image_count; i++) + { + // Create an image view which we can render into. + VkImageViewCreateInfo view_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .image = swapchain_images[i], + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = context.swapchain_dimensions.format, + .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, .layerCount = 1}}; + + VkImageView image_view; + VK_CHECK(vkCreateImageView(context.device, &view_info, nullptr, &image_view)); + + context.swapchain_image_views.push_back(image_view); + } +} +/** + * @brief Helper function to load a shader module. + * @param path The path for the shader (relative to the assets directory). + * @param shader_stage The shader stage flag specifying the type of shader (e.g., VK_SHADER_STAGE_VERTEX_BIT). + * @returns A VkShaderModule handle. Aborts execution if shader creation fails. + */ +VkShaderModule HelloTriangleV13::load_shader_module(const std::string &path, VkShaderStageFlagBits shader_stage) +{ + auto spirv = vkb::fs::read_shader_binary_u32(path); + + VkShaderModuleCreateInfo module_info{ + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = spirv.size() * sizeof(uint32_t), + .pCode = spirv.data()}; + + VkShaderModule shader_module; + VK_CHECK(vkCreateShaderModule(context.device, &module_info, nullptr, &shader_module)); + + return shader_module; +} + +/** + * @brief Initializes the Vulkan pipeline. + */ +void HelloTriangleV13::init_pipeline() +{ + // Create a blank pipeline layout. + // We are not binding any resources to the pipeline in this first sample. + VkPipelineLayoutCreateInfo layout_info{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + VK_CHECK(vkCreatePipelineLayout(context.device, &layout_info, nullptr, &context.pipeline_layout)); + + // Define the vertex input binding description + VkVertexInputBindingDescription binding_description{ + .binding = 0, + .stride = sizeof(Vertex), + .inputRate = VK_VERTEX_INPUT_RATE_VERTEX}; + + // Define the vertex input attribute descriptions + std::array attribute_descriptions = {{ + {.location = 0, .binding = 0, .format = VK_FORMAT_R32G32_SFLOAT, .offset = offsetof(Vertex, position)}, // position + {.location = 1, .binding = 0, .format = VK_FORMAT_R32G32B32_SFLOAT, .offset = offsetof(Vertex, color)} // color + }}; + + // Create the vertex input state + VkPipelineVertexInputStateCreateInfo vertex_input{.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &binding_description, + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; + + // Specify we will use triangle lists to draw geometry. + VkPipelineInputAssemblyStateCreateInfo input_assembly{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + .primitiveRestartEnable = VK_FALSE}; + + // Specify rasterization state. + VkPipelineRasterizationStateCreateInfo raster{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .depthClampEnable = VK_FALSE, + .rasterizerDiscardEnable = VK_FALSE, + .polygonMode = VK_POLYGON_MODE_FILL, + .depthBiasEnable = VK_FALSE, + .lineWidth = 1.0f}; + + // Specify that these states will be dynamic, i.e. not part of pipeline state object. + std::vector dynamic_states = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, + VK_DYNAMIC_STATE_CULL_MODE, + VK_DYNAMIC_STATE_FRONT_FACE, + VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY}; + + // Our attachment will write to all color channels, but no blending is enabled. + VkPipelineColorBlendAttachmentState blend_attachment{ + .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT}; + + VkPipelineColorBlendStateCreateInfo blend{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &blend_attachment}; + + // We will have one viewport and scissor box. + VkPipelineViewportStateCreateInfo viewport{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .viewportCount = 1, + .scissorCount = 1}; + + // Disable all depth testing. + VkPipelineDepthStencilStateCreateInfo depth_stencil{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, + .depthCompareOp = VK_COMPARE_OP_ALWAYS}; + + // No multisampling. + VkPipelineMultisampleStateCreateInfo multisample{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT}; + + VkPipelineDynamicStateCreateInfo dynamic_state_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .dynamicStateCount = static_cast(dynamic_states.size()), + .pDynamicStates = dynamic_states.data()}; + + // Load our SPIR-V shaders. + + // Samples support different shading languages, all of which are offline compiled to SPIR-V, the shader format that Vulkan uses. + // The shading language to load for can be selected via command line + std::string shader_folder{""}; + switch (get_shading_language()) + { + case vkb::ShadingLanguage::HLSL: + shader_folder = "hlsl"; + break; + case vkb::ShadingLanguage::SLANG: + shader_folder = "slang"; + break; + default: + shader_folder = "glsl"; + } + + std::array shader_stages = {{ + {.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + .pName = "main"}, // Vertex shader stage + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT), + .pName = "main"} // Fragment shader stage + }}; + + // Pipeline rendering info (for dynamic rendering). + VkPipelineRenderingCreateInfo pipeline_rendering_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, + .colorAttachmentCount = 1, + .pColorAttachmentFormats = &context.swapchain_dimensions.format}; + + // Create the graphics pipeline. + VkGraphicsPipelineCreateInfo pipe{ + .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .pNext = &pipeline_rendering_info, + .stageCount = vkb::to_u32(shader_stages.size()), + .pStages = shader_stages.data(), + .pVertexInputState = &vertex_input, + .pInputAssemblyState = &input_assembly, + .pViewportState = &viewport, + .pRasterizationState = &raster, + .pMultisampleState = &multisample, + .pDepthStencilState = &depth_stencil, + .pColorBlendState = &blend, + .pDynamicState = &dynamic_state_info, + .layout = context.pipeline_layout, // We need to specify the pipeline layout description up front as well. + .renderPass = VK_NULL_HANDLE, // Since we are using dynamic rendering this will set as null + .subpass = 0, + }; + + VK_CHECK(vkCreateGraphicsPipelines(context.device, VK_NULL_HANDLE, 1, &pipe, nullptr, &context.pipeline)); + + // Pipeline is baked, we can delete the shader modules now. + vkDestroyShaderModule(context.device, shader_stages[0].module, nullptr); + vkDestroyShaderModule(context.device, shader_stages[1].module, nullptr); +} + +/** + * @brief Acquires an image from the swapchain. + * @param[out] image The swapchain index for the acquired image. + * @returns Vulkan result code + */ +VkResult HelloTriangleV13::acquire_next_swapchain_image(uint32_t *image) +{ + VkSemaphore acquire_semaphore; + if (context.recycled_semaphores.empty()) + { + VkSemaphoreCreateInfo info = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; + VK_CHECK(vkCreateSemaphore(context.device, &info, nullptr, &acquire_semaphore)); + } + else + { + acquire_semaphore = context.recycled_semaphores.back(); + context.recycled_semaphores.pop_back(); + } + + VkResult res = vkAcquireNextImageKHR(context.device, context.swapchain, UINT64_MAX, acquire_semaphore, VK_NULL_HANDLE, image); + + if (res != VK_SUCCESS) + { + context.recycled_semaphores.push_back(acquire_semaphore); + return res; + } + + // If we have outstanding fences for this swapchain image, wait for them to complete first. + // After begin frame returns, it is safe to reuse or delete resources which + // were used previously. + // + // We wait for fences which completes N frames earlier, so we do not stall, + // waiting for all GPU work to complete before this returns. + // Normally, this doesn't really block at all, + // since we're waiting for old frames to have been completed, but just in case. + if (context.per_frame[*image].queue_submit_fence != VK_NULL_HANDLE) + { + vkWaitForFences(context.device, 1, &context.per_frame[*image].queue_submit_fence, true, UINT64_MAX); + vkResetFences(context.device, 1, &context.per_frame[*image].queue_submit_fence); + } + + if (context.per_frame[*image].primary_command_pool != VK_NULL_HANDLE) + { + vkResetCommandPool(context.device, context.per_frame[*image].primary_command_pool, 0); + } + + // Recycle the old semaphore back into the semaphore manager. + VkSemaphore old_semaphore = context.per_frame[*image].swapchain_acquire_semaphore; + + if (old_semaphore != VK_NULL_HANDLE) + { + context.recycled_semaphores.push_back(old_semaphore); + } + + context.per_frame[*image].swapchain_acquire_semaphore = acquire_semaphore; + + return VK_SUCCESS; +} + +/** + * @brief Renders a triangle to the specified swapchain image. + * @param swapchain_index The swapchain index for the image being rendered. + */ +void HelloTriangleV13::render_triangle(uint32_t swapchain_index) +{ + // Allocate or re-use a primary command buffer. + VkCommandBuffer cmd = context.per_frame[swapchain_index].primary_command_buffer; + + // We will only submit this once before it's recycled. + VkCommandBufferBeginInfo begin_info{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT}; + + // Begin command recording + VK_CHECK(vkBeginCommandBuffer(cmd, &begin_info)); + + // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL + transition_image_layout( + cmd, + context.swapchain_images[swapchain_index], + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + 0, // srcAccessMask (no need to wait for previous operations) + VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask + VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT, // srcStage + VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT // dstStage + ); + // Set clear color values. + VkClearValue clear_value{ + .color = {{0.01f, 0.01f, 0.033f, 1.0f}}}; + + // Set up the rendering attachment info + VkRenderingAttachmentInfo color_attachment{ + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .imageView = context.swapchain_image_views[swapchain_index], + .imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .clearValue = clear_value}; + + // Begin rendering + VkRenderingInfo rendering_info{ + .sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR, + .renderArea = { // Initialize the nested `VkRect2D` structure + .offset = {0, 0}, // Initialize the `VkOffset2D` inside `renderArea` + .extent = { // Initialize the `VkExtent2D` inside `renderArea` + .width = context.swapchain_dimensions.width, + .height = context.swapchain_dimensions.height}}, + .layerCount = 1, + .colorAttachmentCount = 1, + .pColorAttachments = &color_attachment}; + + vkCmdBeginRendering(cmd, &rendering_info); + + // Bind the graphics pipeline. + vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, context.pipeline); + + // Set dynamic states + + // Set viewport dynamically + VkViewport vp{ + .width = static_cast(context.swapchain_dimensions.width), + .height = static_cast(context.swapchain_dimensions.height), + .minDepth = 0.0f, + .maxDepth = 1.0f}; + + vkCmdSetViewport(cmd, 0, 1, &vp); + + // Set scissor dynamically + VkRect2D scissor{ + .extent = { + .width = context.swapchain_dimensions.width, + .height = context.swapchain_dimensions.height}}; + + vkCmdSetScissor(cmd, 0, 1, &scissor); + + // Since we declared VK_DYNAMIC_STATE_CULL_MODE as dynamic in the pipeline, + // we need to set the cull mode here. VK_CULL_MODE_NONE disables face culling, + // meaning both front and back faces will be rendered. + vkCmdSetCullMode(cmd, VK_CULL_MODE_NONE); + + // Since we declared VK_DYNAMIC_STATE_FRONT_FACE as dynamic, + // we need to specify the winding order considered as the front face. + // VK_FRONT_FACE_CLOCKWISE indicates that vertices defined in clockwise order + // are considered front-facing. + vkCmdSetFrontFace(cmd, VK_FRONT_FACE_CLOCKWISE); + + // Since we declared VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY as dynamic, + // we need to set the primitive topology here. VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST + // tells Vulkan that the input vertex data should be interpreted as a list of triangles. + vkCmdSetPrimitiveTopology(cmd, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST); + + // Bind the vertex buffer + VkDeviceSize offset = {0}; + vkCmdBindVertexBuffers(cmd, 0, 1, &context.vertex_buffer, &offset); + + // Draw three vertices with one instance. + vkCmdDraw(cmd, vertices.size(), 1, 0, 0); + + // Complete rendering. + vkCmdEndRendering(cmd); + + // After rendering , transition the swapchain image to PRESENT_SRC + transition_image_layout( + cmd, + context.swapchain_images[swapchain_index], + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask + 0, // dstAccessMask + VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, // srcStage + VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT // dstStage + ); + + // Complete the command buffer. + VK_CHECK(vkEndCommandBuffer(cmd)); + + // Submit it to the queue with a release semaphore. + if (context.per_frame[swapchain_index].swapchain_release_semaphore == VK_NULL_HANDLE) + { + VkSemaphoreCreateInfo semaphore_info{VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; + VK_CHECK(vkCreateSemaphore(context.device, &semaphore_info, nullptr, + &context.per_frame[swapchain_index].swapchain_release_semaphore)); + } + + // Using TOP_OF_PIPE here to ensure that the command buffer does not begin executing any pipeline stages + // (including the layout transition) until the swapchain image is actually acquired (signaled by the semaphore). + // This prevents the GPU from starting operations too early and guarantees that the image is ready + // before any rendering commands run. + VkPipelineStageFlags wait_stage{VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT}; + + VkSubmitInfo info{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context.per_frame[swapchain_index].swapchain_acquire_semaphore, + .pWaitDstStageMask = &wait_stage, + .commandBufferCount = 1, + .pCommandBuffers = &cmd, + .signalSemaphoreCount = 1, + .pSignalSemaphores = &context.per_frame[swapchain_index].swapchain_release_semaphore}; + + // Submit command buffer to graphics queue + VK_CHECK(vkQueueSubmit(context.queue, 1, &info, context.per_frame[swapchain_index].queue_submit_fence)); +} + +/** + * @brief Presents an image to the swapchain. + * @param index The swapchain index previously obtained from @ref acquire_next_swapchain_image. + * @returns Vulkan result code + */ +VkResult HelloTriangleV13::present_image(uint32_t index) +{ + VkPresentInfoKHR present{ + .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context.per_frame[index].swapchain_release_semaphore, + .swapchainCount = 1, + .pSwapchains = &context.swapchain, + .pImageIndices = &index, + }; + + // Present swapchain image + return vkQueuePresentKHR(context.queue, &present); +} + +/** + * @brief Transitions an image layout in a Vulkan command buffer. + * @param cmd The command buffer to record the barrier into. + * @param image The Vulkan image to transition. + * @param oldLayout The current layout of the image. + * @param newLayout The desired new layout of the image. + * @param srcAccessMask The source access mask, specifying which access types are being transitioned from. + * @param dstAccessMask The destination access mask, specifying which access types are being transitioned to. + * @param srcStage The pipeline stage that must happen before the transition. + * @param dstStage The pipeline stage that must happen after the transition. + */ +void HelloTriangleV13::transition_image_layout( + VkCommandBuffer cmd, + VkImage image, + VkImageLayout oldLayout, + VkImageLayout newLayout, + VkAccessFlags2 srcAccessMask, + VkAccessFlags2 dstAccessMask, + VkPipelineStageFlags2 srcStage, + VkPipelineStageFlags2 dstStage) +{ + // Initialize the VkImageMemoryBarrier2 structure + VkImageMemoryBarrier2 image_barrier{ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, + + // Specify the pipeline stages and access masks for the barrier + .srcStageMask = srcStage, // Source pipeline stage mask + .srcAccessMask = srcAccessMask, // Source access mask + .dstStageMask = dstStage, // Destination pipeline stage mask + .dstAccessMask = dstAccessMask, // Destination access mask + + // Specify the old and new layouts of the image + .oldLayout = oldLayout, // Current layout of the image + .newLayout = newLayout, // Target layout of the image + + // We are not changing the ownership between queues + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + + // Specify the image to be affected by this barrier + .image = image, + + // Define the subresource range (which parts of the image are affected) + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, // Affects the color aspect of the image + .baseMipLevel = 0, // Start at mip level 0 + .levelCount = 1, // Number of mip levels affected + .baseArrayLayer = 0, // Start at array layer 0 + .layerCount = 1 // Number of array layers affected + }}; + + // Initialize the VkDependencyInfo structure + VkDependencyInfo dependency_info{ + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .dependencyFlags = 0, // No special dependency flags + .imageMemoryBarrierCount = 1, // Number of image memory barriers + .pImageMemoryBarriers = &image_barrier // Pointer to the image memory barrier(s) + }; + + // Record the pipeline barrier into the command buffer + vkCmdPipelineBarrier2(cmd, &dependency_info); +} + +HelloTriangleV13::~HelloTriangleV13() +{ + // Don't release anything until the GPU is completely idle. + if (context.device != VK_NULL_HANDLE) + { + vkDeviceWaitIdle(context.device); + } + + for (auto &per_frame : context.per_frame) + { + teardown_per_frame(per_frame); + } + + context.per_frame.clear(); + + for (auto semaphore : context.recycled_semaphores) + { + vkDestroySemaphore(context.device, semaphore, nullptr); + } + + if (context.pipeline != VK_NULL_HANDLE) + { + vkDestroyPipeline(context.device, context.pipeline, nullptr); + } + + if (context.pipeline_layout != VK_NULL_HANDLE) + { + vkDestroyPipelineLayout(context.device, context.pipeline_layout, nullptr); + } + + for (VkImageView image_view : context.swapchain_image_views) + { + vkDestroyImageView(context.device, image_view, nullptr); + } + + if (context.swapchain != VK_NULL_HANDLE) + { + vkDestroySwapchainKHR(context.device, context.swapchain, nullptr); + context.swapchain = VK_NULL_HANDLE; + } + + if (context.surface != VK_NULL_HANDLE) + { + vkDestroySurfaceKHR(context.instance, context.surface, nullptr); + context.surface = VK_NULL_HANDLE; + } + + if (context.vertex_buffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(context.device, context.vertex_buffer, nullptr); + context.vertex_buffer = VK_NULL_HANDLE; + } + + if (context.vertex_buffer_memory != VK_NULL_HANDLE) + { + vkFreeMemory(context.device, context.vertex_buffer_memory, nullptr); + context.vertex_buffer_memory = VK_NULL_HANDLE; + } + + if (context.device != VK_NULL_HANDLE) + { + vkDestroyDevice(context.device, nullptr); + context.device = VK_NULL_HANDLE; + } + + if (context.debug_callback != VK_NULL_HANDLE) + { + vkDestroyDebugUtilsMessengerEXT(context.instance, context.debug_callback, nullptr); + context.debug_callback = VK_NULL_HANDLE; + } + + vk_instance.reset(); +} + +bool HelloTriangleV13::prepare(const vkb::ApplicationOptions &options) +{ + assert(options.window != nullptr); + + init_instance(); + + vk_instance = std::make_unique(context.instance); + + context.surface = options.window->create_surface(*vk_instance); + auto &extent = options.window->get_extent(); + context.swapchain_dimensions.width = extent.width; + context.swapchain_dimensions.height = extent.height; + + if (!context.surface) + { + throw std::runtime_error("Failed to create window surface."); + } + + init_device(); + + init_vertex_buffer(); + + init_swapchain(); + + // Create the necessary objects for rendering. + init_pipeline(); + + return true; +} + +void HelloTriangleV13::update(float delta_time) +{ + uint32_t index; + + auto res = acquire_next_swapchain_image(&index); + + // Handle outdated error in acquire. + if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR) + { + if (!resize(context.swapchain_dimensions.width, context.swapchain_dimensions.height)) + { + LOGI("Resize failed"); + } + res = acquire_next_swapchain_image(&index); + } + + if (res != VK_SUCCESS) + { + vkQueueWaitIdle(context.queue); + return; + } + + render_triangle(index); + res = present_image(index); + + // Handle Outdated error in present. + if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR) + { + if (!resize(context.swapchain_dimensions.width, context.swapchain_dimensions.height)) + { + LOGI("Resize failed"); + } + } + else if (res != VK_SUCCESS) + { + LOGE("Failed to present swapchain image."); + } +} + +bool HelloTriangleV13::resize(const uint32_t, const uint32_t) +{ + if (context.device == VK_NULL_HANDLE) + { + return false; + } + + VkSurfaceCapabilitiesKHR surface_properties; + VK_CHECK(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(context.gpu, context.surface, &surface_properties)); + + // Only rebuild the swapchain if the dimensions have changed + if (surface_properties.currentExtent.width == context.swapchain_dimensions.width && + surface_properties.currentExtent.height == context.swapchain_dimensions.height) + { + return false; + } + + vkDeviceWaitIdle(context.device); + + init_swapchain(); + return true; +} + +std::unique_ptr create_hello_triangle_1_3() +{ + return std::make_unique(); +} diff --git a/samples/api/hello_triangle_1_3/hello_triangle_1_3.h b/samples/api/hello_triangle_1_3/hello_triangle_1_3.h new file mode 100644 index 0000000000..27a905457c --- /dev/null +++ b/samples/api/hello_triangle_1_3/hello_triangle_1_3.h @@ -0,0 +1,177 @@ +/* Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "common/vk_common.h" +#include "core/instance.h" +#include "platform/application.h" + +/** + * @brief A self-contained (minimal use of framework) sample that illustrates + * the rendering of a triangle + */ +class HelloTriangleV13 : public vkb::Application +{ + // Define the Vertex structure + struct Vertex + { + glm::vec2 position; + glm::vec3 color; + }; + + // Define the vertex data + const std::vector vertices = { + {{0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, // Vertex 1: Red + {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, // Vertex 2: Green + {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}} // Vertex 3: Blue + }; + + /** + * @brief Swapchain state + */ + struct SwapchainDimensions + { + /// Width of the swapchain. + uint32_t width = 0; + + /// Height of the swapchain. + uint32_t height = 0; + + /// Pixel format of the swapchain. + VkFormat format = VK_FORMAT_UNDEFINED; + }; + + /** + * @brief Per-frame data + */ + struct PerFrame + { + VkFence queue_submit_fence = VK_NULL_HANDLE; + VkCommandPool primary_command_pool = VK_NULL_HANDLE; + VkCommandBuffer primary_command_buffer = VK_NULL_HANDLE; + VkSemaphore swapchain_acquire_semaphore = VK_NULL_HANDLE; + VkSemaphore swapchain_release_semaphore = VK_NULL_HANDLE; + }; + + /** + * @brief Vulkan objects and global state + */ + struct Context + { + /// The Vulkan instance. + VkInstance instance = VK_NULL_HANDLE; + + /// The Vulkan physical device. + VkPhysicalDevice gpu = VK_NULL_HANDLE; + + /// The Vulkan device. + VkDevice device = VK_NULL_HANDLE; + + /// The Vulkan device queue. + VkQueue queue = VK_NULL_HANDLE; + + /// The swapchain. + VkSwapchainKHR swapchain = VK_NULL_HANDLE; + + /// The swapchain dimensions. + SwapchainDimensions swapchain_dimensions; + + /// The surface we will render to. + VkSurfaceKHR surface = VK_NULL_HANDLE; + + /// The queue family index where graphics work will be submitted. + int32_t graphics_queue_index = -1; + + /// The image view for each swapchain image. + std::vector swapchain_image_views; + + /// The handles to the images in the swapchain. + std::vector swapchain_images; + + /// The graphics pipeline. + VkPipeline pipeline = VK_NULL_HANDLE; + + /** + * The pipeline layout for resources. + * Not used in this sample, but we still need to provide a dummy one. + */ + VkPipelineLayout pipeline_layout = VK_NULL_HANDLE; + + /// The debug utility messenger callback. + VkDebugUtilsMessengerEXT debug_callback = VK_NULL_HANDLE; + + /// A set of semaphores that can be reused. + std::vector recycled_semaphores; + + /// A set of per-frame data. + std::vector per_frame; + + /// The Vulkan buffer object that holds the vertex data for the triangle. + VkBuffer vertex_buffer = VK_NULL_HANDLE; + + /// The device memory allocated for the vertex buffer. + VkDeviceMemory vertex_buffer_memory = VK_NULL_HANDLE; + }; + + public: + HelloTriangleV13() = default; + + virtual ~HelloTriangleV13(); + + virtual bool prepare(const vkb::ApplicationOptions &options) override; + + virtual void update(float delta_time) override; + + virtual bool resize(const uint32_t width, const uint32_t height) override; + + bool validate_extensions(const std::vector &required, + const std::vector &available); + + void init_instance(); + + void init_device(); + + void init_vertex_buffer(); + + void init_per_frame(PerFrame &per_frame); + + void teardown_per_frame(PerFrame &per_frame); + + void init_swapchain(); + + VkShaderModule load_shader_module(const std::string &path, VkShaderStageFlagBits shader_stage); + + void init_pipeline(); + + VkResult acquire_next_swapchain_image(uint32_t *image); + + void render_triangle(uint32_t swapchain_index); + + VkResult present_image(uint32_t index); + + void transition_image_layout(VkCommandBuffer cmd, VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout, VkAccessFlags2 srcAccessMask, VkAccessFlags2 dstAccessMask, VkPipelineStageFlags2 srcStage, VkPipelineStageFlags2 dstStage); + + uint32_t find_memory_type(VkPhysicalDevice physical_device, uint32_t type_filter, VkMemoryPropertyFlags properties); + + private: + Context context; + + std::unique_ptr vk_instance; +}; + +std::unique_ptr create_hello_triangle_1_3(); diff --git a/samples/api/hlsl_shaders/README.adoc b/samples/api/hlsl_shaders/README.adoc deleted file mode 100644 index 23abc1acec..0000000000 --- a/samples/api/hlsl_shaders/README.adoc +++ /dev/null @@ -1,141 +0,0 @@ -//// -- Copyright (c) 2021-2023, Sascha Willems -- -- SPDX-License-Identifier: Apache-2.0 -- -- Licensed under the Apache License, Version 2.0 the "License"; -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. -- -//// -= Using HLSL shaders in Vulkan - -ifdef::site-gen-antora[] -TIP: The source for this sample can be found in the https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/api/hlsl_shaders[Khronos Vulkan samples github repository]. -endif::[] - - -This tutorial, along with the accompanying example code, shows how to use shaders written in the High Level Shading Language (HLSL) in Vulkan at runtime. - -Vulkan does not directly consume shaders in a human-readable text format, but instead uses SPIR-V as an intermediate representation. -This opens the option to use shader languages other than e.g. -GLSL, as long as they can target the Vulkan SPIR-V environment. -One such language is Microsoft's HLSL, which is the shading language for DirectX. - -Details on how HLSL fits into the Vulkan ecosystem can be found in this https://github.com/KhronosGroup/Vulkan-Guide/blob/main/chapters/hlsl.adoc[Vulkan guide chapter]. - -== HLSL Syntax - -HLSL is a bit more object-oriented than GLSL, but the general structure of a shader is similar Vulkan-specific functions are marked with the https://github.com/microsoft/DirectXShaderCompiler/blob/main/docs/SPIR-V.rst#the-implicit-vk-namespace[implicit `vk` namespace]: - -[,hlsl] ----- -struct VSInput -{ -[[vk::location(0)]] float3 Pos : POSITION0; -[[vk::location(1)]] float2 UV : TEXCOORD0; -[[vk::location(2)]] float3 Normal : NORMAL0; -}; - -struct UBO -{ - float4x4 projection; - float4x4 model; - float4 viewPos; -}; - -cbuffer ubo : register(b0, space0) { UBO ubo; } - -struct VSOutput -{ - float4 Pos : SV_POSITION; -[[vk::location(0)]] float2 UV : TEXCOORD0; -}; - -VSOutput main(VSInput input) -{ - VSOutput output = (VSOutput)0; - output.UV = input.UV; - output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); - return output; -} ----- - -== Glslang - -The Vulkan samples use https://github.com/KhronosGroup/glslang[Glslang] for converting shaders to SPIR-V at runtime. -Glslang is the reference GLSL validator and translator, but also supports HLSL as an input language. - -HLSL support in Glslang limited though and for a more feature complete HLSL to SPIR-V compiler, you can also use the https://github.com/microsoft/DirectXShaderCompiler[DirectX shader compiler]. - -For the basic shader in this tutorial, we can go with Glslang though, as it supports all features we require. - -== Converting HLSL to SPIR-V - -Loading HLSL with Glslang is similar to loading GLSL, but requires different parameters. -Here are the relevant parts that differ from loading HLSL from the `HlslShaders::load_hlsl_shader` function of the sample: - -[,cpp] ----- -std::vector spirv; - -// Use HLSL parsing rules and semantics (EShMsgReadHlsl) -EShMessages messages = static_cast(EShMsgReadHlsl | ...); -... - -// Language needs to be selected based on the shader stage -EShLanguage language = EShLangVertex; -glslang::TShader shader(language); -... - -// Set the source language to HLSL -shader.setEnvInput(glslang::EShSourceHlsl, language, glslang::EShClientVulkan, 1); -... - -// Parse the HLSL input -if (!shader.parse(&glslang::DefaultTBuiltInResource, 100, false, messages)) -{ - ... -} - -// Add shader to new program object. -glslang::TProgram program; -program.addShader(&shader); - -// Link program. -if (!program.link(messages)) -{ - ... -} -... - -// Translate to SPIRV -glslang::TIntermediate *intermediate = program.getIntermediate(language); -... -glslang::GlslangToSpv(*intermediate, spirv, &logger); -... ----- - -=== Creating the shader module - -The call to `glslang::GlslangToSpv` will generate the SPIR-V bytecode that we can use to create the Vulkan shader module from: - -[,cpp] ----- -VkShaderModule shader_module; -VkShaderModuleCreateInfo module_create_info{}; - -module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; -module_create_info.codeSize = spirv.size() * sizeof(uint32_t); -module_create_info.pCode = spirv.data(); - -VK_CHECK(vkCreateShaderModule(get_device().get_handle(), &module_create_info, NULL, &shader_module)); ----- diff --git a/samples/api/hlsl_shaders/hlsl_shaders.cpp b/samples/api/hlsl_shaders/hlsl_shaders.cpp deleted file mode 100644 index ac07d00c1f..0000000000 --- a/samples/api/hlsl_shaders/hlsl_shaders.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/* Copyright (c) 2021-2024, Sascha Willems - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Using HLSL shaders in Vulkan with the glslang library - */ - -#include "hlsl_shaders.h" - -#include -#include - -VkPipelineShaderStageCreateInfo HlslShaders::load_hlsl_shader(const std::string &file, VkShaderStageFlagBits stage) -{ - std::vector spirv; - std::string info_log; - - // Compile HLSL to SPIR-V - - // Initialize glslang library - glslang::InitializeProcess(); - - auto messages = static_cast(EShMsgReadHlsl | EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); - - EShLanguage language{}; - switch (stage) - { - case VK_SHADER_STAGE_VERTEX_BIT: - language = EShLangVertex; - break; - case VK_SHADER_STAGE_FRAGMENT_BIT: - language = EShLangFragment; - break; - default: - language = EShLangVertex; - } - - std::string source = vkb::fs::read_shader(file); - const char *shader_source = reinterpret_cast(source.data()); - - glslang::TShader shader(language); - shader.setStringsWithLengths(&shader_source, nullptr, 1); - shader.setEnvInput(glslang::EShSourceHlsl, language, glslang::EShClientVulkan, 1); - shader.setEntryPoint("main"); - shader.setSourceEntryPoint("main"); - shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_0); - shader.setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetSpv_1_0); - - if (!shader.parse(GetDefaultResources(), 100, false, messages)) - { - LOGE("Failed to parse HLSL shader, Error: {}", std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog())); - throw std::runtime_error("Failed to parse HLSL shader"); - } - - // Add shader to new program object - glslang::TProgram program; - program.addShader(&shader); - - // Link program - if (!program.link(messages)) - { - LOGE("Failed to compile HLSL shader, Error: {}", std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog())); - throw std::runtime_error("Failed to compile HLSL shader"); - } - - if (shader.getInfoLog()) - { - info_log += std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()) + "\n"; - } - if (program.getInfoLog()) - { - info_log += std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog()); - } - - // Translate to SPIRV - glslang::TIntermediate *intermediate = program.getIntermediate(language); - if (!intermediate) - { - LOGE("Failed to get shared intermediate code."); - throw std::runtime_error("Failed to compile HLSL shader"); - } - - spv::SpvBuildLogger logger; - - glslang::GlslangToSpv(*intermediate, spirv, &logger); - - info_log += logger.getAllMessages() + "\n"; - - glslang::FinalizeProcess(); - - // Create shader module from generated SPIR-V - VkShaderModule shader_module; - VkShaderModuleCreateInfo module_create_info{}; - module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - module_create_info.codeSize = spirv.size() * sizeof(uint32_t); - module_create_info.pCode = spirv.data(); - VK_CHECK(vkCreateShaderModule(get_device().get_handle(), &module_create_info, nullptr, &shader_module)); - - VkPipelineShaderStageCreateInfo shader_stage = {}; - shader_stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shader_stage.stage = stage; - shader_stage.module = shader_module; - shader_stage.pName = "main"; - assert(shader_stage.module != VK_NULL_HANDLE); - shader_modules.push_back(shader_stage.module); - return shader_stage; -} - -HlslShaders::HlslShaders() -{ - zoom = -2.0f; - rotation = {0.0f, 0.0f, 0.0f}; - title = "HLSL shaders"; -} - -HlslShaders::~HlslShaders() -{ - if (has_device()) - { - // Clean up used Vulkan resources - // Note : Inherited destructor cleans up resources stored in base class - - vkDestroyPipeline(get_device().get_handle(), pipeline, nullptr); - - vkDestroyPipelineLayout(get_device().get_handle(), pipeline_layout, nullptr); - vkDestroyDescriptorSetLayout(get_device().get_handle(), base_descriptor_set_layout, nullptr); - vkDestroyDescriptorSetLayout(get_device().get_handle(), sampler_descriptor_set_layout, nullptr); - // Delete the implicitly created sampler for the texture loaded via the framework - vkDestroySampler(get_device().get_handle(), texture.sampler, nullptr); - } -} - -// Enable physical device features required for this example -void HlslShaders::request_gpu_features(vkb::PhysicalDevice &gpu) -{ - // Enable anisotropic filtering if supported - if (gpu.get_features().samplerAnisotropy) - { - gpu.get_mutable_requested_features().samplerAnisotropy = VK_TRUE; - } -} - -void HlslShaders::build_command_buffers() -{ - VkCommandBufferBeginInfo command_buffer_begin_info = vkb::initializers::command_buffer_begin_info(); - - VkClearValue clear_values[2]{}; - clear_values[0].color = default_clear_color; - clear_values[1].depthStencil = {0.0f, 0}; - - VkRenderPassBeginInfo render_pass_begin_info = vkb::initializers::render_pass_begin_info(); - render_pass_begin_info.renderPass = render_pass; - render_pass_begin_info.renderArea.offset.x = 0; - render_pass_begin_info.renderArea.offset.y = 0; - render_pass_begin_info.renderArea.extent.width = width; - render_pass_begin_info.renderArea.extent.height = height; - render_pass_begin_info.clearValueCount = 2; - render_pass_begin_info.pClearValues = clear_values; - - for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) - { - // Set target frame buffer - render_pass_begin_info.framebuffer = framebuffers[i]; - - VK_CHECK(vkBeginCommandBuffer(draw_cmd_buffers[i], &command_buffer_begin_info)); - - vkCmdBeginRenderPass(draw_cmd_buffers[i], &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - - VkViewport viewport = vkb::initializers::viewport(static_cast(width), static_cast(height), 0.0f, 1.0f); - vkCmdSetViewport(draw_cmd_buffers[i], 0, 1, &viewport); - - VkRect2D scissor = vkb::initializers::rect2D(static_cast(width), static_cast(height), 0, 0); - vkCmdSetScissor(draw_cmd_buffers[i], 0, 1, &scissor); - - // Bind the uniform buffer and sampled image to set 0 - vkCmdBindDescriptorSets(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &base_descriptor_set, 0, nullptr); - vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); - - VkDeviceSize offsets[1] = {0}; - vkCmdBindVertexBuffers(draw_cmd_buffers[i], 0, 1, vertex_buffer->get(), offsets); - vkCmdBindIndexBuffer(draw_cmd_buffers[i], index_buffer->get_handle(), 0, VK_INDEX_TYPE_UINT32); - - vkCmdDrawIndexed(draw_cmd_buffers[i], index_count, 1, 0, 0, 0); - - draw_ui(draw_cmd_buffers[i]); - - vkCmdEndRenderPass(draw_cmd_buffers[i]); - - VK_CHECK(vkEndCommandBuffer(draw_cmd_buffers[i])); - } -} - -void HlslShaders::load_assets() -{ - texture = load_texture("textures/metalplate01_rgba.ktx", vkb::sg::Image::Color); -} - -void HlslShaders::draw() -{ - ApiVulkanSample::prepare_frame(); - - // Command buffer to be submitted to the queue - submit_info.commandBufferCount = 1; - submit_info.pCommandBuffers = &draw_cmd_buffers[current_buffer]; - - // Submit to queue - VK_CHECK(vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE)); - - ApiVulkanSample::submit_frame(); -} - -void HlslShaders::generate_quad() -{ - // Setup vertices for a single uv-mapped quad made from two triangles - std::vector vertices = - { - {{1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 0.0f, 1.0f}}, - {{-1.0f, 1.0f, 0.0f}, {0.0f, 1.0f}, {0.0f, 0.0f, 1.0f}}, - {{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}}, - {{1.0f, -1.0f, 0.0f}, {1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}}}; - - // Setup indices - std::vector indices = {0, 1, 2, 2, 3, 0}; - index_count = static_cast(indices.size()); - - auto vertex_buffer_size = vkb::to_u32(vertices.size() * sizeof(VertexStructure)); - auto index_buffer_size = vkb::to_u32(indices.size() * sizeof(uint32_t)); - - // Create buffers - // For the sake of simplicity we won't stage the vertex data to the gpu memory - // Vertex buffer - vertex_buffer = std::make_unique(get_device(), - vertex_buffer_size, - VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); - vertex_buffer->update(vertices.data(), vertex_buffer_size); - - index_buffer = std::make_unique(get_device(), - index_buffer_size, - VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); - - index_buffer->update(indices.data(), index_buffer_size); -} - -void HlslShaders::setup_descriptor_pool() -{ - std::vector pool_sizes = { - vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1), - vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1), - vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_SAMPLER, 2)}; - - VkDescriptorPoolCreateInfo descriptor_pool_create_info = - vkb::initializers::descriptor_pool_create_info( - static_cast(pool_sizes.size()), - pool_sizes.data(), - 3); - VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &descriptor_pool_create_info, nullptr, &descriptor_pool)); -} - -void HlslShaders::setup_descriptor_set_layout() -{ - // We separate the descriptor sets for the uniform buffer + image and samplers, so we don't need to duplicate the descriptors for the former - VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info{}; - std::vector set_layout_bindings{}; - - // Set layout for the uniform buffer and the image - set_layout_bindings = { - // Binding 0 : Vertex shader uniform buffer - vkb::initializers::descriptor_set_layout_binding( - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_SHADER_STAGE_VERTEX_BIT, - 0), - // Binding 1 : Fragment shader combined image and sampler - vkb::initializers::descriptor_set_layout_binding( - VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - VK_SHADER_STAGE_FRAGMENT_BIT, - 1)}; - descriptor_layout_create_info = - vkb::initializers::descriptor_set_layout_create_info( - set_layout_bindings.data(), - static_cast(set_layout_bindings.size())); - VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout_create_info, nullptr, &base_descriptor_set_layout)); - - // Set layout for the samplers - set_layout_bindings = { - // Binding 0: Fragment shader sampler - vkb::initializers::descriptor_set_layout_binding( - VK_DESCRIPTOR_TYPE_SAMPLER, - VK_SHADER_STAGE_FRAGMENT_BIT, - 0)}; - descriptor_layout_create_info = - vkb::initializers::descriptor_set_layout_create_info( - set_layout_bindings.data(), - static_cast(set_layout_bindings.size())); - VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout_create_info, nullptr, &sampler_descriptor_set_layout)); - - // Pipeline layout - // Set layout for the base descriptors in set 0 and set layout for the sampler descriptors in set 1 - std::vector set_layouts = {base_descriptor_set_layout, sampler_descriptor_set_layout}; - VkPipelineLayoutCreateInfo pipeline_layout_create_info = - vkb::initializers::pipeline_layout_create_info( - set_layouts.data(), - static_cast(set_layouts.size())); - VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout)); -} - -void HlslShaders::setup_descriptor_set() -{ - // We separate the descriptor sets for the uniform buffer + image and samplers, so we don't need to duplicate the descriptors for the former - VkDescriptorSetAllocateInfo descriptor_set_alloc_info{}; - - // Descriptors set for the uniform buffer and the image - descriptor_set_alloc_info = - vkb::initializers::descriptor_set_allocate_info( - descriptor_pool, - &base_descriptor_set_layout, - 1); - VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &descriptor_set_alloc_info, &base_descriptor_set)); - - VkDescriptorBufferInfo buffer_descriptor = create_descriptor(*uniform_buffer_vs); - - // Combined image descriptor for the texture - VkDescriptorImageInfo image_descriptor{}; - image_descriptor.imageView = texture.image->get_vk_image_view().get_handle(); - image_descriptor.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - image_descriptor.sampler = texture.sampler; - - std::vector write_descriptor_sets = { - // Binding 0 : Vertex shader uniform buffer - vkb::initializers::write_descriptor_set( - base_descriptor_set, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - 0, - &buffer_descriptor), - // Binding 1 : Fragment shader sampled image - vkb::initializers::write_descriptor_set( - base_descriptor_set, - VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - 1, - &image_descriptor)}; - vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr); -} - -void HlslShaders::prepare_pipelines() -{ - VkPipelineInputAssemblyStateCreateInfo input_assembly_state = - vkb::initializers::pipeline_input_assembly_state_create_info( - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - 0, - VK_FALSE); - - VkPipelineRasterizationStateCreateInfo rasterization_state = - vkb::initializers::pipeline_rasterization_state_create_info( - VK_POLYGON_MODE_FILL, - VK_CULL_MODE_NONE, - VK_FRONT_FACE_COUNTER_CLOCKWISE, - 0); - - VkPipelineColorBlendAttachmentState blend_attachment_state = - vkb::initializers::pipeline_color_blend_attachment_state( - 0xf, - VK_FALSE); - - VkPipelineColorBlendStateCreateInfo color_blend_state = - vkb::initializers::pipeline_color_blend_state_create_info( - 1, - &blend_attachment_state); - - // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept - VkPipelineDepthStencilStateCreateInfo depth_stencil_state = - vkb::initializers::pipeline_depth_stencil_state_create_info( - VK_TRUE, - VK_TRUE, - VK_COMPARE_OP_GREATER); - - VkPipelineViewportStateCreateInfo viewport_state = - vkb::initializers::pipeline_viewport_state_create_info(1, 1, 0); - - VkPipelineMultisampleStateCreateInfo multisample_state = - vkb::initializers::pipeline_multisample_state_create_info( - VK_SAMPLE_COUNT_1_BIT, - 0); - - std::vector dynamic_state_enables = { - VK_DYNAMIC_STATE_VIEWPORT, - VK_DYNAMIC_STATE_SCISSOR}; - - VkPipelineDynamicStateCreateInfo dynamic_state = - vkb::initializers::pipeline_dynamic_state_create_info( - dynamic_state_enables.data(), - static_cast(dynamic_state_enables.size()), - 0); - - // Load shaders - std::array shader_stages{}; - shader_stages[0] = load_hlsl_shader("hlsl_shaders/hlsl_shader.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_hlsl_shader("hlsl_shaders/hlsl_shader.frag", VK_SHADER_STAGE_FRAGMENT_BIT); - - // Vertex bindings and attributes - const std::vector vertex_input_bindings = { - vkb::initializers::vertex_input_binding_description(0, sizeof(VertexStructure), VK_VERTEX_INPUT_RATE_VERTEX), - }; - const std::vector vertex_input_attributes = { - vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(VertexStructure, pos)), - vkb::initializers::vertex_input_attribute_description(0, 1, VK_FORMAT_R32G32_SFLOAT, offsetof(VertexStructure, uv)), - vkb::initializers::vertex_input_attribute_description(0, 2, VK_FORMAT_R32G32B32_SFLOAT, offsetof(VertexStructure, normal)), - }; - VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); - vertex_input_state.vertexBindingDescriptionCount = static_cast(vertex_input_bindings.size()); - vertex_input_state.pVertexBindingDescriptions = vertex_input_bindings.data(); - vertex_input_state.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); - vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); - - VkGraphicsPipelineCreateInfo pipeline_create_info = - vkb::initializers::pipeline_create_info( - pipeline_layout, - render_pass, - 0); - - pipeline_create_info.pVertexInputState = &vertex_input_state; - pipeline_create_info.pInputAssemblyState = &input_assembly_state; - pipeline_create_info.pRasterizationState = &rasterization_state; - pipeline_create_info.pColorBlendState = &color_blend_state; - pipeline_create_info.pMultisampleState = &multisample_state; - pipeline_create_info.pViewportState = &viewport_state; - pipeline_create_info.pDepthStencilState = &depth_stencil_state; - pipeline_create_info.pDynamicState = &dynamic_state; - pipeline_create_info.stageCount = static_cast(shader_stages.size()); - pipeline_create_info.pStages = shader_stages.data(); - - VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline)); -} - -// Prepare and initialize uniform buffer containing shader uniforms -void HlslShaders::prepare_uniform_buffers() -{ - // Vertex shader uniform buffer block - uniform_buffer_vs = std::make_unique(get_device(), - sizeof(ubo_vs), - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); - - update_uniform_buffers(); -} - -void HlslShaders::update_uniform_buffers() -{ - // Vertex shader - ubo_vs.projection = glm::perspective(glm::radians(60.0f), static_cast(width) / static_cast(height), 0.001f, 256.0f); - glm::mat4 view_matrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, zoom)); - - ubo_vs.model = view_matrix * glm::translate(glm::mat4(1.0f), camera_pos); - ubo_vs.model = glm::rotate(ubo_vs.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - ubo_vs.model = glm::rotate(ubo_vs.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); - ubo_vs.model = glm::rotate(ubo_vs.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - - ubo_vs.view_pos = glm::vec4(0.0f, 0.0f, -zoom, 0.0f); - - uniform_buffer_vs->convert_and_update(ubo_vs); -} - -bool HlslShaders::prepare(const vkb::ApplicationOptions &options) -{ - if (!ApiVulkanSample::prepare(options)) - { - return false; - } - load_assets(); - generate_quad(); - prepare_uniform_buffers(); - setup_descriptor_set_layout(); - prepare_pipelines(); - setup_descriptor_pool(); - setup_descriptor_set(); - build_command_buffers(); - prepared = true; - return true; -} - -void HlslShaders::render(float delta_time) -{ - if (!prepared) - { - return; - } - draw(); -} - -void HlslShaders::view_changed() -{ - update_uniform_buffers(); -} - -std::unique_ptr create_hlsl_shaders() -{ - return std::make_unique(); -} diff --git a/samples/api/hlsl_shaders/hlsl_shaders.h b/samples/api/hlsl_shaders/hlsl_shaders.h deleted file mode 100644 index c112c51b47..0000000000 --- a/samples/api/hlsl_shaders/hlsl_shaders.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2021-2024, Sascha Willems - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Using HLSL shaders in Vulkan with the glslang library - */ - -#pragma once - -#include - -#include - -#include "common/vk_common.h" -#include "core/shader_module.h" - -#include "api_vulkan_sample.h" - -class HlslShaders : public ApiVulkanSample -{ - public: - // Vertex layout for this example - struct VertexStructure - { - float pos[3]; - float uv[2]; - float normal[3]; - }; - - Texture texture; - - std::unique_ptr vertex_buffer; - std::unique_ptr index_buffer; - uint32_t index_count{0}; - - std::unique_ptr - uniform_buffer_vs; - - struct - { - glm::mat4 projection; - glm::mat4 model; - glm::vec4 view_pos; - } ubo_vs; - - VkPipeline pipeline{VK_NULL_HANDLE}; - VkPipelineLayout pipeline_layout{VK_NULL_HANDLE}; - VkDescriptorSet base_descriptor_set{VK_NULL_HANDLE}; - - VkDescriptorSetLayout base_descriptor_set_layout{VK_NULL_HANDLE}; - VkDescriptorSetLayout sampler_descriptor_set_layout{VK_NULL_HANDLE}; - - HlslShaders(); - ~HlslShaders() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; - void build_command_buffers() override; - void load_assets(); - void draw(); - void generate_quad(); - void setup_descriptor_pool(); - void setup_descriptor_set_layout(); - void setup_descriptor_set(); - void prepare_pipelines(); - void prepare_uniform_buffers(); - void update_uniform_buffers(); - bool prepare(const vkb::ApplicationOptions &options) override; - VkPipelineShaderStageCreateInfo load_hlsl_shader(const std::string &file, VkShaderStageFlagBits stage); - void render(float delta_time) override; - void view_changed() override; -}; - -std::unique_ptr create_hlsl_shaders(); diff --git a/samples/api/hpp_compute_nbody/CMakeLists.txt b/samples/api/hpp_compute_nbody/CMakeLists.txt index 80b7c9e0ce..07ba90c945 100644 --- a/samples/api/hpp_compute_nbody/CMakeLists.txt +++ b/samples/api/hpp_compute_nbody/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample_with_tags( "compute_nbody/hlsl/particle.vert.hlsl" "compute_nbody/hlsl/particle.frag.hlsl" "compute_nbody/hlsl/particle_calculate.comp.hlsl" - "compute_nbody/hlsl/particle_integrate.comp.hlsl") \ No newline at end of file + "compute_nbody/hlsl/particle_integrate.comp.hlsl" + SHADER_FILES_SLANG + "compute_nbody/slang/particle.vert.slang" + "compute_nbody/slang/particle.frag.slang" + "compute_nbody/slang/particle_calculate.comp.slang" + "compute_nbody/slang/particle_integrate.comp.slang") \ No newline at end of file diff --git a/samples/api/hpp_compute_nbody/hpp_compute_nbody.cpp b/samples/api/hpp_compute_nbody/hpp_compute_nbody.cpp index 33f043e67f..4c7623c45a 100644 --- a/samples/api/hpp_compute_nbody/hpp_compute_nbody.cpp +++ b/samples/api/hpp_compute_nbody/hpp_compute_nbody.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,8 +20,8 @@ */ #include "hpp_compute_nbody.h" -#include -#include +#include "benchmark_mode/benchmark_mode.h" +#include "core/command_pool.h" #include HPPComputeNBody::HPPComputeNBody() @@ -67,7 +67,7 @@ bool HPPComputeNBody::resize(const uint32_t width, const uint32_t height) return true; } -void HPPComputeNBody::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPComputeNBody::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -79,9 +79,12 @@ void HPPComputeNBody::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) void HPPComputeNBody::build_command_buffers() { std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 1.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; + vk::ClearDepthStencilValue{0.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -94,13 +97,11 @@ void HPPComputeNBody::build_command_buffers() // Acquire if (graphics.queue_family_index != compute.queue_family_index) { - vk::BufferMemoryBarrier buffer_barrier({}, - vk::AccessFlagBits::eVertexAttributeRead, - compute.queue_family_index, - graphics.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier buffer_barrier{.dstAccessMask = vk::AccessFlagBits::eVertexAttributeRead, + .srcQueueFamilyIndex = compute.queue_family_index, + .dstQueueFamilyIndex = graphics.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eComputeShader, vk::PipelineStageFlagBits::eVertexInput, {}, nullptr, buffer_barrier, nullptr); @@ -120,13 +121,11 @@ void HPPComputeNBody::build_command_buffers() // Release barrier if (graphics.queue_family_index != compute.queue_family_index) { - vk::BufferMemoryBarrier buffer_barrier(vk::AccessFlagBits::eVertexAttributeRead, - {}, - graphics.queue_family_index, - compute.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier buffer_barrier{.srcAccessMask = vk::AccessFlagBits::eVertexAttributeRead, + .srcQueueFamilyIndex = graphics.queue_family_index, + .dstQueueFamilyIndex = compute.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eVertexInput, vk::PipelineStageFlagBits::eComputeShader, {}, nullptr, buffer_barrier, nullptr); @@ -156,13 +155,11 @@ void HPPComputeNBody::build_compute_command_buffer() // Acquire if (graphics.queue_family_index != compute.queue_family_index) { - vk::BufferMemoryBarrier buffer_barrier({}, - vk::AccessFlagBits::eShaderWrite, - graphics.queue_family_index, - compute.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier buffer_barrier{.dstAccessMask = vk::AccessFlagBits::eShaderWrite, + .srcQueueFamilyIndex = graphics.queue_family_index, + .dstQueueFamilyIndex = compute.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; compute.command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eComputeShader, {}, nullptr, buffer_barrier, nullptr); @@ -175,13 +172,12 @@ void HPPComputeNBody::build_compute_command_buffer() compute.command_buffer.dispatch(compute.ubo.particle_count / compute.work_group_size, 1, 1); // Add memory barrier to ensure that the computer shader has finished writing to the buffer - vk::BufferMemoryBarrier memory_barrier(vk::AccessFlagBits::eShaderWrite, - vk::AccessFlagBits::eShaderRead, - VK_QUEUE_FAMILY_IGNORED, - VK_QUEUE_FAMILY_IGNORED, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier memory_barrier{.srcAccessMask = vk::AccessFlagBits::eShaderWrite, + .dstAccessMask = vk::AccessFlagBits::eShaderRead, + .srcQueueFamilyIndex = vk::QueueFamilyIgnored, + .dstQueueFamilyIndex = vk::QueueFamilyIgnored, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; compute.command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eComputeShader, vk::PipelineStageFlagBits::eComputeShader, {}, nullptr, memory_barrier, nullptr); @@ -194,13 +190,11 @@ void HPPComputeNBody::build_compute_command_buffer() // Release if (graphics.queue_family_index != compute.queue_family_index) { - vk::BufferMemoryBarrier buffer_barrier(vk::AccessFlagBits::eShaderWrite, - {}, - compute.queue_family_index, - graphics.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier buffer_barrier{.srcAccessMask = vk::AccessFlagBits::eShaderWrite, + .srcQueueFamilyIndex = compute.queue_family_index, + .dstQueueFamilyIndex = graphics.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; compute.command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eComputeShader, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, buffer_barrier, nullptr); @@ -213,23 +207,19 @@ void HPPComputeNBody::build_compute_transfer_command_buffer(vk::CommandBuffer co { command_buffer.begin(vk::CommandBufferBeginInfo()); - vk::BufferMemoryBarrier acquire_buffer_barrier({}, - vk::AccessFlagBits::eShaderWrite, - graphics.queue_family_index, - compute.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier acquire_buffer_barrier{.dstAccessMask = vk::AccessFlagBits::eShaderWrite, + .srcQueueFamilyIndex = graphics.queue_family_index, + .dstQueueFamilyIndex = compute.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eComputeShader, {}, nullptr, acquire_buffer_barrier, nullptr); - vk::BufferMemoryBarrier release_buffer_barrier(vk::AccessFlagBits::eShaderWrite, - {}, - compute.queue_family_index, - graphics.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier release_buffer_barrier{.srcAccessMask = vk::AccessFlagBits::eShaderWrite, + .srcQueueFamilyIndex = compute.queue_family_index, + .dstQueueFamilyIndex = graphics.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; command_buffer.pipelineBarrier( vk::PipelineStageFlagBits::eComputeShader, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, release_buffer_barrier, nullptr); @@ -245,13 +235,11 @@ void HPPComputeNBody::build_copy_command_buffer(vk::CommandBuffer command_buffer // Execute a transfer to the compute queue, if necessary if (graphics.queue_family_index != compute.queue_family_index) { - vk::BufferMemoryBarrier buffer_barrier(vk::AccessFlagBits::eVertexAttributeRead, - {}, - graphics.queue_family_index, - compute.queue_family_index, - compute.storage_buffer->get_handle(), - 0, - compute.storage_buffer->get_size()); + vk::BufferMemoryBarrier buffer_barrier{.srcAccessMask = vk::AccessFlagBits::eVertexAttributeRead, + .srcQueueFamilyIndex = graphics.queue_family_index, + .dstQueueFamilyIndex = compute.queue_family_index, + .buffer = compute.storage_buffer->get_handle(), + .size = compute.storage_buffer->get_size()}; command_buffer.pipelineBarrier(vk::PipelineStageFlagBits::eVertexInput, vk::PipelineStageFlagBits::eComputeShader, {}, nullptr, buffer_barrier, nullptr); } @@ -263,12 +251,12 @@ vk::DescriptorSetLayout HPPComputeNBody::create_compute_descriptor_set_layout() std::array bindings = {{{0, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eCompute}, {1, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eCompute}}}; - return get_device().get_handle().createDescriptorSetLayout({{}, bindings}); + return get_device().get_handle().createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); } vk::Pipeline HPPComputeNBody::create_compute_pipeline(vk::PipelineShaderStageCreateInfo const &stage) { - vk::ComputePipelineCreateInfo compute_pipeline_create_info({}, stage, compute.pipeline_layout); + vk::ComputePipelineCreateInfo compute_pipeline_create_info{.stage = stage, .layout = compute.pipeline_layout}; vk::Result result; vk::Pipeline pipeline; @@ -284,7 +272,8 @@ vk::DescriptorPool HPPComputeNBody::create_descriptor_pool() {vk::DescriptorType::eStorageBuffer, 1}, {vk::DescriptorType::eCombinedImageSampler, 2}}}; - return get_device().get_handle().createDescriptorPool({{}, 2, pool_sizes}); + return get_device().get_handle().createDescriptorPool( + {.maxSets = 2, .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data()}); } vk::DescriptorSetLayout HPPComputeNBody::create_graphics_descriptor_set_layout() @@ -293,33 +282,35 @@ vk::DescriptorSetLayout HPPComputeNBody::create_graphics_descriptor_set_layout() {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, {2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}}}; - return get_device().get_handle().createDescriptorSetLayout({{}, bindings}); + return get_device().get_handle().createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); } vk::Pipeline HPPComputeNBody::create_graphics_pipeline() { // Load shaders - std::vector shader_stages = {load_shader("compute_nbody", "particle.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("compute_nbody", "particle.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("compute_nbody", "particle.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("compute_nbody", "particle.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex bindings and attributes - vk::VertexInputBindingDescription vertex_input_bindings(0, sizeof(Particle), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_bindings{0, sizeof(Particle), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = { {{0, 0, vk::Format::eR32G32B32A32Sfloat, offsetof(Particle, pos)}, // Location 0 : Position {1, 0, vk::Format::eR32G32B32A32Sfloat, offsetof(Particle, vel)}}}; // Location 1 : Velocity - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_bindings, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_bindings, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; // Additive blending - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.blendEnable = true; - blend_attachment_state.colorBlendOp = vk::BlendOp::eAdd; - blend_attachment_state.srcColorBlendFactor = vk::BlendFactor::eOne; - blend_attachment_state.dstColorBlendFactor = vk::BlendFactor::eOne; - blend_attachment_state.alphaBlendOp = vk::BlendOp::eAdd; - blend_attachment_state.srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha; - blend_attachment_state.dstAlphaBlendFactor = vk::BlendFactor::eDstAlpha; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.blendEnable = true, + .srcColorBlendFactor = vk::BlendFactor::eOne, + .dstColorBlendFactor = vk::BlendFactor::eOne, + .colorBlendOp = vk::BlendOp::eAdd, + .srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha, + .dstAlphaBlendFactor = vk::BlendFactor::eDstAlpha, + .alphaBlendOp = vk::BlendOp::eAdd, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; depth_stencil_state.depthTestEnable = false; @@ -362,7 +353,13 @@ void HPPComputeNBody::draw() // Submit compute commands, waiting for rendering finished vk::PipelineStageFlags wait_stage_mask = vk::PipelineStageFlagBits::eComputeShader; - vk::SubmitInfo compute_submit_info(graphics.semaphore, wait_stage_mask, compute.command_buffer, compute.semaphore); + vk::SubmitInfo compute_submit_info{.waitSemaphoreCount = 1, + .pWaitSemaphores = &graphics.semaphore, + .pWaitDstStageMask = &wait_stage_mask, + .commandBufferCount = 1, + .pCommandBuffers = &compute.command_buffer, + .signalSemaphoreCount = 1, + .pSignalSemaphores = &compute.semaphore}; compute.queue.submit(compute_submit_info); } @@ -387,7 +384,7 @@ void HPPComputeNBody::prepare_compute() { vk::Device device = get_device().get_handle(); - compute.queue_family_index = get_device().get_queue_family_index(vk::QueueFlagBits::eCompute); + compute.queue_family_index = vkb::common::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), vk::QueueFlagBits::eCompute); vk::PhysicalDeviceLimits const &limits = get_device().get_gpu().get_properties().limits; // Not all implementations support a work group size of 256, so we need to check with the device limits @@ -410,12 +407,12 @@ void HPPComputeNBody::prepare_compute() compute.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, compute.descriptor_set_layout); update_compute_descriptor_set(); - compute.pipeline_layout = device.createPipelineLayout({{}, compute.descriptor_set_layout}); + compute.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &compute.descriptor_set_layout}); // create the compute pipelines // 1st pass - Particle movement calculations { - vk::PipelineShaderStageCreateInfo stage = load_shader("compute_nbody", "particle_calculate.comp", vk::ShaderStageFlagBits::eCompute); + vk::PipelineShaderStageCreateInfo stage = load_shader("compute_nbody", "particle_calculate.comp.spv", vk::ShaderStageFlagBits::eCompute); // Set some shader parameters via specialization constants struct MovementSpecializationData @@ -436,10 +433,10 @@ void HPPComputeNBody::prepare_compute() MovementSpecializationData movement_specialization_data{compute.work_group_size, compute.shared_data_size, 0.002f, 0.75f, 0.05f}; - vk::SpecializationInfo specialization_info(static_cast(movement_specialization_map_entries.size()), + vk::SpecializationInfo specialization_info{static_cast(movement_specialization_map_entries.size()), movement_specialization_map_entries.data(), sizeof(movement_specialization_data), - &movement_specialization_data); + &movement_specialization_data}; stage.pSpecializationInfo = &specialization_info; @@ -448,17 +445,17 @@ void HPPComputeNBody::prepare_compute() // 2nd pass - Particle integration { - vk::PipelineShaderStageCreateInfo stage = load_shader("compute_nbody", "particle_integrate.comp", vk::ShaderStageFlagBits::eCompute); + vk::PipelineShaderStageCreateInfo stage = load_shader("compute_nbody", "particle_integrate.comp.spv", vk::ShaderStageFlagBits::eCompute); - vk::SpecializationMapEntry integration_specialization_entry(0, 0, sizeof(compute.work_group_size)); - vk::SpecializationInfo specialization_info(1, &integration_specialization_entry, sizeof(compute.work_group_size), &compute.work_group_size); + vk::SpecializationMapEntry integration_specialization_entry{0, 0, sizeof(compute.work_group_size)}; + vk::SpecializationInfo specialization_info{1, &integration_specialization_entry, sizeof(compute.work_group_size), &compute.work_group_size}; stage.pSpecializationInfo = &specialization_info; compute.pipeline_integrate = create_compute_pipeline(stage); } // Separate command pool as queue family for compute may be different than graphics - compute.command_pool = device.createCommandPool({{}, compute.queue_family_index}); + compute.command_pool = device.createCommandPool({.queueFamilyIndex = compute.queue_family_index}); // Create a command buffer for compute operations compute.command_buffer = vkb::common::allocate_command_buffer(device, compute.command_pool); @@ -579,7 +576,7 @@ void HPPComputeNBody::prepare_graphics() { vk::Device device = get_device().get_handle(); - graphics.queue_family_index = get_device().get_queue_family_index(vk::QueueFlagBits::eGraphics); + graphics.queue_family_index = vkb::common::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), vk::QueueFlagBits::eGraphics); // Vertex shader uniform buffer block graphics.uniform_buffer = @@ -589,7 +586,7 @@ void HPPComputeNBody::prepare_graphics() graphics.descriptor_set_layout = create_graphics_descriptor_set_layout(); graphics.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, graphics.descriptor_set_layout); update_graphics_descriptor_set(); - graphics.pipeline_layout = device.createPipelineLayout({{}, graphics.descriptor_set_layout}); + graphics.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &graphics.descriptor_set_layout}); graphics.pipeline = create_graphics_pipeline(); @@ -599,13 +596,20 @@ void HPPComputeNBody::prepare_graphics() void HPPComputeNBody::update_compute_descriptor_set() { - vk::DescriptorBufferInfo storage_buffer_descriptor(compute.storage_buffer->get_handle(), 0, VK_WHOLE_SIZE); - vk::DescriptorBufferInfo uniform_buffer_descriptor(compute.uniform_buffer->get_handle(), 0, VK_WHOLE_SIZE); - std::array compute_write_descriptor_sets = { - {// Binding 0 : Particle position storage buffer - {compute.descriptor_set, 0, {}, vk::DescriptorType::eStorageBuffer, {}, storage_buffer_descriptor}, - // Binding 1 : Uniform buffer - {compute.descriptor_set, 1, {}, vk::DescriptorType::eUniformBuffer, {}, uniform_buffer_descriptor}}}; + vk::DescriptorBufferInfo storage_buffer_descriptor{compute.storage_buffer->get_handle(), 0, vk::WholeSize}; + vk::DescriptorBufferInfo uniform_buffer_descriptor{compute.uniform_buffer->get_handle(), 0, vk::WholeSize}; + std::array compute_write_descriptor_sets = {{// Binding 0 : Particle position storage buffer + {.dstSet = compute.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .pBufferInfo = &storage_buffer_descriptor}, + // Binding 1 : Uniform buffer + {.dstSet = compute.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &uniform_buffer_descriptor}}}; get_device().get_handle().updateDescriptorSets(compute_write_descriptor_sets, nullptr); } @@ -618,21 +622,32 @@ void HPPComputeNBody::update_compute_uniform_buffers(float delta_time) void HPPComputeNBody::update_graphics_descriptor_set() { - vk::DescriptorBufferInfo buffer_descriptor(graphics.uniform_buffer->get_handle(), 0, VK_WHOLE_SIZE); - - vk::DescriptorImageInfo particle_image_descriptor( - textures.particle.sampler, - textures.particle.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, textures.particle.image->get_vk_image_view().get_format())); - vk::DescriptorImageInfo gradient_image_descriptor( - textures.gradient.sampler, - textures.gradient.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, textures.gradient.image->get_vk_image_view().get_format())); - - std::array write_descriptor_sets = { - {{graphics.descriptor_set, 0, 0, vk::DescriptorType::eCombinedImageSampler, particle_image_descriptor}, - {graphics.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, gradient_image_descriptor}, - {graphics.descriptor_set, 2, 0, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}}}; + vk::DescriptorBufferInfo buffer_descriptor{graphics.uniform_buffer->get_handle(), 0, vk::WholeSize}; + + vk::DescriptorImageInfo particle_image_descriptor{textures.particle.sampler, + textures.particle.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + textures.particle.image->get_vk_image_view().get_format())}; + vk::DescriptorImageInfo gradient_image_descriptor{textures.gradient.sampler, + textures.gradient.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + textures.gradient.image->get_vk_image_view().get_format())}; + + std::array write_descriptor_sets = {{{.dstSet = graphics.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &particle_image_descriptor}, + {.dstSet = graphics.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &gradient_image_descriptor}, + {.dstSet = graphics.descriptor_set, + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &buffer_descriptor}}}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, nullptr); } diff --git a/samples/api/hpp_compute_nbody/hpp_compute_nbody.h b/samples/api/hpp_compute_nbody/hpp_compute_nbody.h index 56edf42a95..cc49fbf50f 100644 --- a/samples/api/hpp_compute_nbody/hpp_compute_nbody.h +++ b/samples/api/hpp_compute_nbody/hpp_compute_nbody.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -132,7 +132,7 @@ class HPPComputeNBody : public HPPApiVulkanSample bool resize(const uint32_t width, const uint32_t height) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_dynamic_uniform_buffers/CMakeLists.txt b/samples/api/hpp_dynamic_uniform_buffers/CMakeLists.txt index 11acd7b743..bb75d9e2e5 100644 --- a/samples/api/hpp_dynamic_uniform_buffers/CMakeLists.txt +++ b/samples/api/hpp_dynamic_uniform_buffers/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "dynamic_uniform_buffers/glsl/base.frag" SHADER_FILES_HLSL "dynamic_uniform_buffers/hlsl/base.vert.hlsl" - "dynamic_uniform_buffers/hlsl/base.frag.hlsl") \ No newline at end of file + "dynamic_uniform_buffers/hlsl/base.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_uniform_buffers/slang/base.vert.slang" + "dynamic_uniform_buffers/slang/base.frag.slang") \ No newline at end of file diff --git a/samples/api/hpp_dynamic_uniform_buffers/hpp_dynamic_uniform_buffers.cpp b/samples/api/hpp_dynamic_uniform_buffers/hpp_dynamic_uniform_buffers.cpp index 4bb03bf2dd..6f4b7e32f5 100644 --- a/samples/api/hpp_dynamic_uniform_buffers/hpp_dynamic_uniform_buffers.cpp +++ b/samples/api/hpp_dynamic_uniform_buffers/hpp_dynamic_uniform_buffers.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -91,7 +91,7 @@ bool HPPDynamicUniformBuffers::prepare(const vkb::ApplicationOptions &options) generate_cube(); prepare_uniform_buffers(); descriptor_set_layout = create_descriptor_set_layout(); - pipeline_layout = get_device().get_handle().createPipelineLayout({{}, descriptor_set_layout}); + pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}); pipeline = create_pipeline(); descriptor_pool = create_descriptor_pool(); descriptor_set = vkb::common::allocate_descriptor_set(get_device().get_handle(), descriptor_pool, descriptor_set_layout); @@ -115,9 +115,12 @@ void HPPDynamicUniformBuffers::build_command_buffers() { vk::DeviceSize offset = 0; - std::array clear_values = {default_clear_color, vk::ClearDepthStencilValue(0.0f, 0)}; + std::array clear_values = {default_clear_color, vk::ClearDepthStencilValue{0.0f, 0}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (size_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -171,7 +174,8 @@ vk::DescriptorPool HPPDynamicUniformBuffers::create_descriptor_pool() std::array pool_sizes = {{{vk::DescriptorType::eUniformBuffer, 1}, {vk::DescriptorType::eUniformBufferDynamic, 1}, {vk::DescriptorType::eCombinedImageSampler, 1}}}; - return get_device().get_handle().createDescriptorPool({{}, 2, pool_sizes}); + return get_device().get_handle().createDescriptorPool( + {.maxSets = 2, .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data()}); } vk::DescriptorSetLayout HPPDynamicUniformBuffers::create_descriptor_set_layout() @@ -179,25 +183,27 @@ vk::DescriptorSetLayout HPPDynamicUniformBuffers::create_descriptor_set_layout() std::array bindings = {{{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}, {1, vk::DescriptorType::eUniformBufferDynamic, 1, vk::ShaderStageFlagBits::eVertex}, {2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - return get_device().get_handle().createDescriptorSetLayout({{}, bindings}); + return get_device().get_handle().createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); } vk::Pipeline HPPDynamicUniformBuffers::create_pipeline() { // Load shaders - std::vector shader_stages = {load_shader("dynamic_uniform_buffers", "base.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("dynamic_uniform_buffers", "base.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("dynamic_uniform_buffers", "base.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("dynamic_uniform_buffers", "base.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex bindings and attributes - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(Vertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(Vertex), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = { {{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, pos)}, // Location 0 : Position {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, color)}}}; // Location 1 : Color - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -323,14 +329,21 @@ void HPPDynamicUniformBuffers::prepare_uniform_buffers() void HPPDynamicUniformBuffers::update_descriptor_set() { - vk::DescriptorBufferInfo view_buffer_descriptor(uniform_buffers.view->get_handle(), 0, VK_WHOLE_SIZE); - vk::DescriptorBufferInfo dynamic_buffer_descriptor(uniform_buffers.dynamic->get_handle(), 0, dynamic_alignment); - - std::array write_descriptor_sets = { - {// Binding 0 : Projection/View matrix uniform buffer - {descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, view_buffer_descriptor}, - // Binding 1 : Instance matrix as dynamic uniform buffer - {descriptor_set, 1, {}, vk::DescriptorType::eUniformBufferDynamic, {}, dynamic_buffer_descriptor}}}; + vk::DescriptorBufferInfo view_buffer_descriptor{uniform_buffers.view->get_handle(), 0, vk::WholeSize}; + vk::DescriptorBufferInfo dynamic_buffer_descriptor{uniform_buffers.dynamic->get_handle(), 0, dynamic_alignment}; + + std::array write_descriptor_sets = {{// Binding 0 : Projection/View matrix uniform buffer + {.dstSet = descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &view_buffer_descriptor}, + // Binding 1 : Instance matrix as dynamic uniform buffer + {.dstSet = descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBufferDynamic, + .pBufferInfo = &dynamic_buffer_descriptor}}}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } @@ -361,7 +374,7 @@ void HPPDynamicUniformBuffers::update_dynamic_uniform_buffer(float delta_time, b auto index = x * dim * dim + y * dim + z; // Aligned offset - auto model_mat = (glm::mat4 *) (((uint64_t) ubo_data_dynamic.model + (index * dynamic_alignment))); + auto model_mat = reinterpret_cast((reinterpret_cast(ubo_data_dynamic.model) + (index * dynamic_alignment))); // Update rotations rotations[index] += animation_timer * rotation_speeds[index]; diff --git a/samples/api/hpp_hdr/CMakeLists.txt b/samples/api/hpp_hdr/CMakeLists.txt index 136d4a61dc..47dcf78c12 100644 --- a/samples/api/hpp_hdr/CMakeLists.txt +++ b/samples/api/hpp_hdr/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "hdr/hlsl/bloom.vert.hlsl" "hdr/hlsl/bloom.frag.hlsl" "hdr/hlsl/gbuffer.vert.hlsl" - "hdr/hlsl/gbuffer.frag.hlsl") \ No newline at end of file + "hdr/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "hdr/slang/composition.vert.slang" + "hdr/slang/composition.frag.slang" + "hdr/slang/bloom.vert.slang" + "hdr/slang/bloom.frag.slang" + "hdr/slang/gbuffer.vert.slang" + "hdr/slang/gbuffer.frag.slang") \ No newline at end of file diff --git a/samples/api/hpp_hdr/hpp_hdr.cpp b/samples/api/hpp_hdr/hpp_hdr.cpp index d651749df5..db32c836c7 100644 --- a/samples/api/hpp_hdr/hpp_hdr.cpp +++ b/samples/api/hpp_hdr/hpp_hdr.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -69,7 +69,7 @@ bool HPPHDR::resize(const uint32_t width, const uint32_t height) return true; } -void HPPHDR::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPHDR::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -93,14 +93,18 @@ void HPPHDR::build_command_buffers() */ std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; - vk::RenderPassBeginInfo render_pass_begin_info(offscreen.render_pass, offscreen.framebuffer, {{0, 0}, offscreen.extent}, clear_values); + vk::ClearDepthStencilValue{0.0f, 0}}}; + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = offscreen.render_pass, + .framebuffer = offscreen.framebuffer, + .renderArea = {{0, 0}, offscreen.extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(offscreen.extent.width), static_cast(offscreen.extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(offscreen.extent.width), static_cast(offscreen.extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, offscreen.extent); + vk::Rect2D scissor{{0, 0}, offscreen.extent}; command_buffer.setScissor(0, scissor); // Skybox @@ -126,13 +130,17 @@ void HPPHDR::build_command_buffers() { // Bloom filter vk::ClearValue clear_value(vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}}))); - vk::RenderPassBeginInfo render_pass_begin_info(filter_pass.render_pass, filter_pass.framebuffer, {{0, 0}, filter_pass.extent}, clear_value); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = filter_pass.render_pass, + .framebuffer = filter_pass.framebuffer, + .renderArea = {{0, 0}, filter_pass.extent}, + .clearValueCount = 1, + .pClearValues = &clear_value}; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(filter_pass.extent.width), static_cast(filter_pass.extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(filter_pass.extent.width), static_cast(filter_pass.extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, filter_pass.extent); + vk::Rect2D scissor{{0, 0}, filter_pass.extent}; command_buffer.setScissor(0, scissor); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, bloom.pipeline_layout, 0, bloom.descriptor_set, {}); @@ -152,14 +160,18 @@ void HPPHDR::build_command_buffers() { // Final composition std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, framebuffers[i], {{0, 0}, extent}, clear_values); + vk::ClearDepthStencilValue{0.0f, 0}}}; + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .framebuffer = framebuffers[i], + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, composition.pipeline_layout, 0, composition.descriptor_set, {}); @@ -224,8 +236,9 @@ vk::DeviceMemory HPPHDR::allocate_memory(vk::Image image) { vk::MemoryRequirements memory_requirements = get_device().get_handle().getImageMemoryRequirements(image); - vk::MemoryAllocateInfo memory_allocate_info( - memory_requirements.size, get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal)); + vk::MemoryAllocateInfo memory_allocate_info{.allocationSize = memory_requirements.size, + .memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, + vk::MemoryPropertyFlagBits::eDeviceLocal)}; return get_device().get_handle().allocateMemory(memory_allocate_info); } @@ -244,30 +257,30 @@ HPPHDR::FramebufferAttachment HPPHDR::create_attachment(vk::Format format, vk::I vk::DescriptorPool HPPHDR::create_descriptor_pool() { std::array pool_sizes = {{{vk::DescriptorType::eUniformBuffer, 4}, {vk::DescriptorType::eCombinedImageSampler, 6}}}; - return get_device().get_handle().createDescriptorPool({{}, 4, pool_sizes}); + return get_device().get_handle().createDescriptorPool( + {.maxSets = 4, .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data()}); } vk::Pipeline HPPHDR::create_bloom_pipeline(uint32_t direction) { - std::vector shader_stages{load_shader("hdr", "bloom.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("hdr", "bloom.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("hdr", "bloom.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("hdr", "bloom.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Set constant parameters via specialization constants - vk::SpecializationMapEntry specialization_map_entry(0, 0, sizeof(uint32_t)); + vk::SpecializationMapEntry specialization_map_entry{0, 0, sizeof(uint32_t)}; - vk::SpecializationInfo specialization_info(1, &specialization_map_entry, sizeof(uint32_t), &direction); + vk::SpecializationInfo specialization_info{1, &specialization_map_entry, sizeof(uint32_t), &direction}; shader_stages[1].pSpecializationInfo = &specialization_info; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.blendEnable = true; - blend_attachment_state.colorBlendOp = vk::BlendOp::eAdd; - blend_attachment_state.srcColorBlendFactor = vk::BlendFactor::eOne; - blend_attachment_state.dstColorBlendFactor = vk::BlendFactor::eOne; - blend_attachment_state.alphaBlendOp = vk::BlendOp::eAdd; - blend_attachment_state.srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha; - blend_attachment_state.dstAlphaBlendFactor = vk::BlendFactor::eDstAlpha; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.blendEnable = true, + .srcColorBlendFactor = vk::BlendFactor::eOne, + .dstColorBlendFactor = vk::BlendFactor::eOne, + .colorBlendOp = vk::BlendOp::eAdd, + .srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha, + .dstAlphaBlendFactor = vk::BlendFactor::eDstAlpha, + .alphaBlendOp = vk::BlendOp::eAdd, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -293,12 +306,11 @@ vk::Pipeline HPPHDR::create_bloom_pipeline(uint32_t direction) vk::Pipeline HPPHDR::create_composition_pipeline() { - std::vector shader_stages{load_shader("hdr", "composition.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("hdr", "composition.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("hdr", "composition.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("hdr", "composition.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -325,59 +337,60 @@ vk::Pipeline HPPHDR::create_composition_pipeline() vk::RenderPass HPPHDR::create_filter_render_pass() { // Set up separate renderpass with references to the color and depth attachments - vk::AttachmentDescription attachment_description; - attachment_description.samples = vk::SampleCountFlagBits::e1; - attachment_description.loadOp = vk::AttachmentLoadOp::eClear; - attachment_description.storeOp = vk::AttachmentStoreOp::eStore; - attachment_description.stencilLoadOp = vk::AttachmentLoadOp::eDontCare; - attachment_description.stencilStoreOp = vk::AttachmentStoreOp::eDontCare; - attachment_description.initialLayout = vk::ImageLayout::eUndefined; - attachment_description.finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal; - attachment_description.format = filter_pass.color.format; - - vk::AttachmentReference color_reference(0, vk::ImageLayout::eColorAttachmentOptimal); - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics, {}, color_reference); + vk::AttachmentDescription attachment_description{.format = filter_pass.color.format, + .samples = vk::SampleCountFlagBits::e1, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + .stencilLoadOp = vk::AttachmentLoadOp::eDontCare, + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, + .initialLayout = vk::ImageLayout::eUndefined, + .finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal}; + + vk::AttachmentReference color_reference{0, vk::ImageLayout::eColorAttachmentOptimal}; + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, .colorAttachmentCount = 1, .pColorAttachments = &color_reference}; return create_render_pass({attachment_description}, subpass); } vk::Image HPPHDR::create_image(vk::Format format, vk::ImageUsageFlagBits usage) { - vk::ImageCreateInfo image_create_info; - image_create_info.imageType = vk::ImageType::e2D; - image_create_info.format = format; - image_create_info.extent = vk::Extent3D(offscreen.extent, 1); - image_create_info.mipLevels = 1; - image_create_info.arrayLayers = 1; - image_create_info.samples = vk::SampleCountFlagBits::e1; - image_create_info.tiling = vk::ImageTiling::eOptimal; - image_create_info.usage = usage | vk::ImageUsageFlagBits::eSampled; + vk::ImageCreateInfo image_create_info{.imageType = vk::ImageType::e2D, + .format = format, + .extent = {offscreen.extent.width, offscreen.extent.height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eOptimal, + .usage = usage | vk::ImageUsageFlagBits::eSampled}; return get_device().get_handle().createImage(image_create_info); } vk::Pipeline HPPHDR::create_models_pipeline(uint32_t shaderType, vk::CullModeFlagBits cullMode, bool depthTestAndWrite) { - std::vector shader_stages{load_shader("hdr", "gbuffer.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("hdr", "gbuffer.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("hdr", "gbuffer.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("hdr", "gbuffer.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Set constant parameters via specialization constants - vk::SpecializationMapEntry specialization_map_entry(0, 0, sizeof(uint32_t)); + vk::SpecializationMapEntry specialization_map_entry{0, 0, sizeof(uint32_t)}; // Set constant parameters via specialization constants - vk::SpecializationInfo specialization_info = vk::SpecializationInfo(1, &specialization_map_entry, sizeof(uint32_t), &shaderType); - shader_stages[0].pSpecializationInfo = &specialization_info; - shader_stages[1].pSpecializationInfo = &specialization_info; + vk::SpecializationInfo specialization_info{1, &specialization_map_entry, sizeof(uint32_t), &shaderType}; + shader_stages[0].pSpecializationInfo = &specialization_info; + shader_stages[1].pSpecializationInfo = &specialization_info; // Vertex bindings an attributes for model rendering // Binding description - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; // Attribute descriptions std::vector vertex_input_attributes = {{0, 0, vk::Format::eR32G32B32Sfloat, 0}, {1, 0, vk::Format::eR32G32B32Sfloat, 3 * sizeof(float)}}; - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; std::vector blend_attachment_states(2); blend_attachment_states[0].colorWriteMask = @@ -433,9 +446,12 @@ vk::RenderPass HPPHDR::create_offscreen_render_pass() std::array color_references{{{0, vk::ImageLayout::eColorAttachmentOptimal}, {1, vk::ImageLayout::eColorAttachmentOptimal}}}; - vk::AttachmentReference depth_reference(2, vk::ImageLayout::eDepthStencilAttachmentOptimal); + vk::AttachmentReference depth_reference{2, vk::ImageLayout::eDepthStencilAttachmentOptimal}; - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics, nullptr, color_references, nullptr, &depth_reference); + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, + .colorAttachmentCount = static_cast(color_references.size()), + .pColorAttachments = color_references.data(), + .pDepthStencilAttachment = &depth_reference}; return create_render_pass(attachment_descriptions, subpass); } @@ -466,7 +482,12 @@ vk::RenderPass HPPHDR::create_render_pass(std::vector subpass_dependencies[1].dstStageMask = vk::PipelineStageFlagBits::eFragmentShader; subpass_dependencies[1].dstAccessMask = vk::AccessFlagBits::eShaderRead; - vk::RenderPassCreateInfo render_pass_create_info({}, attachment_descriptions, subpass_description, subpass_dependencies); + vk::RenderPassCreateInfo render_pass_create_info{.attachmentCount = static_cast(attachment_descriptions.size()), + .pAttachments = attachment_descriptions.data(), + .subpassCount = 1, + .pSubpasses = &subpass_description, + .dependencyCount = static_cast(subpass_dependencies.size()), + .pDependencies = subpass_dependencies.data()}; return get_device().get_handle().createRenderPass(render_pass_create_info); } @@ -514,8 +535,8 @@ void HPPHDR::prepare_bloom() {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; vk::Device device = get_device().get_handle(); - bloom.descriptor_set_layout = device.createDescriptorSetLayout({{}, bindings}); - bloom.pipeline_layout = device.createPipelineLayout({{}, bloom.descriptor_set_layout}); + bloom.descriptor_set_layout = device.createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); + bloom.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &bloom.descriptor_set_layout}); bloom.pipelines[0] = create_bloom_pipeline(1); bloom.pipelines[1] = create_bloom_pipeline(0); bloom.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, bloom.descriptor_set_layout); @@ -537,11 +558,12 @@ void HPPHDR::prepare_composition() std::array bindings = {{{0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - vk::Device device = get_device().get_handle(); - composition.descriptor_set_layout = device.createDescriptorSetLayout({{}, bindings}); - composition.pipeline_layout = device.createPipelineLayout({{}, composition.descriptor_set_layout}); - composition.pipeline = create_composition_pipeline(); - composition.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, composition.descriptor_set_layout); + vk::Device device = get_device().get_handle(); + composition.descriptor_set_layout = + device.createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); + composition.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &composition.descriptor_set_layout}); + composition.pipeline = create_composition_pipeline(); + composition.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, composition.descriptor_set_layout); update_composition_descriptor_set(); } @@ -552,8 +574,8 @@ void HPPHDR::prepare_models() {2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eFragment}}}; vk::Device device = get_device().get_handle(); - models.descriptor_set_layout = device.createDescriptorSetLayout({{}, bindings}); - models.pipeline_layout = device.createPipelineLayout({{}, models.descriptor_set_layout}); + models.descriptor_set_layout = device.createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); + models.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &models.descriptor_set_layout}); models.objects.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, models.descriptor_set_layout); update_model_descriptor_set(models.objects.descriptor_set); @@ -636,9 +658,16 @@ void HPPHDR::update_composition_descriptor_set() std::array color_descriptors = {{{offscreen.sampler, offscreen.color[0].view, vk::ImageLayout::eShaderReadOnlyOptimal}, {offscreen.sampler, filter_pass.color.view, vk::ImageLayout::eShaderReadOnlyOptimal}}}; - std::array sampler_write_descriptor_sets = { - {{composition.descriptor_set, 0, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[0]}, - {composition.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[1]}}}; + std::array sampler_write_descriptor_sets = {{{.dstSet = composition.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[0]}, + {.dstSet = composition.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[1]}}}; get_device().get_handle().updateDescriptorSets(sampler_write_descriptor_sets, {}); } @@ -648,28 +677,46 @@ void HPPHDR::update_bloom_descriptor_set() std::array color_descriptors = {{{offscreen.sampler, offscreen.color[0].view, vk::ImageLayout::eShaderReadOnlyOptimal}, {offscreen.sampler, offscreen.color[1].view, vk::ImageLayout::eShaderReadOnlyOptimal}}}; - std::array sampler_write_descriptor_sets = { - {{bloom.descriptor_set, 0, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[0]}, - {bloom.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[1]}}}; + std::array sampler_write_descriptor_sets = {{{.dstSet = bloom.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[0]}, + {.dstSet = bloom.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[1]}}}; get_device().get_handle().updateDescriptorSets(sampler_write_descriptor_sets, {}); } void HPPHDR::update_model_descriptor_set(vk::DescriptorSet descriptor_set) { - vk::DescriptorBufferInfo matrix_buffer_descriptor(uniform_buffers.matrices->get_handle(), 0, VK_WHOLE_SIZE); - - vk::DescriptorImageInfo environment_image_descriptor( - textures.envmap.sampler, - textures.envmap.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, textures.envmap.image->get_vk_image_view().get_format())); - - vk::DescriptorBufferInfo params_buffer_descriptor(uniform_buffers.params->get_handle(), 0, VK_WHOLE_SIZE); - - std::array write_descriptor_sets = { - {{descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, matrix_buffer_descriptor}, - {descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, environment_image_descriptor}, - {descriptor_set, 2, 0, vk::DescriptorType::eUniformBuffer, {}, params_buffer_descriptor}}}; + vk::DescriptorBufferInfo matrix_buffer_descriptor{uniform_buffers.matrices->get_handle(), 0, vk::WholeSize}; + + vk::DescriptorImageInfo environment_image_descriptor{textures.envmap.sampler, + textures.envmap.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + textures.envmap.image->get_vk_image_view().get_format())}; + + vk::DescriptorBufferInfo params_buffer_descriptor{uniform_buffers.params->get_handle(), 0, vk::WholeSize}; + + std::array write_descriptor_sets = {{{.dstSet = descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &matrix_buffer_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &environment_image_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = ¶ms_buffer_descriptor}}}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_hdr/hpp_hdr.h b/samples/api/hpp_hdr/hpp_hdr.h index b55ced85b1..4d6bd977a8 100644 --- a/samples/api/hpp_hdr/hpp_hdr.h +++ b/samples/api/hpp_hdr/hpp_hdr.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -184,7 +184,7 @@ class HPPHDR : public HPPApiVulkanSample virtual bool resize(const uint32_t width, const uint32_t height) override; // from vkb::VulkanSample - virtual void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample virtual void build_command_buffers() override; diff --git a/samples/api/hpp_hello_triangle/CMakeLists.txt b/samples/api/hpp_hello_triangle/CMakeLists.txt index d4ad6a8d45..31fe212017 100644 --- a/samples/api/hpp_hello_triangle/CMakeLists.txt +++ b/samples/api/hpp_hello_triangle/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -26,8 +26,14 @@ add_sample( NAME "HPP Hello Triangle" DESCRIPTION "An introduction into Vulkan and its respective objects using vulkan.hpp." SHADER_FILES_GLSL - "triangle.vert" - "triangle.frag") + "hello_triangle/glsl/triangle.vert" + "hello_triangle/glsl/triangle.frag" + SHADER_FILES_HLSL + "hello_triangle/hlsl/triangle.vert.hlsl" + "hello_triangle/hlsl/triangle.frag.hlsl" + SHADER_FILES_SLANG + "hello_triangle/slang/triangle.vert.slang" + "hello_triangle/slang/triangle.frag.slang") if(${VKB_${FOLDER_NAME}}) target_compile_definitions(${FOLDER_NAME} PUBLIC VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1) diff --git a/samples/api/hpp_hello_triangle/hpp_hello_triangle.cpp b/samples/api/hpp_hello_triangle/hpp_hello_triangle.cpp index 710065a4bb..800e2dd2df 100644 --- a/samples/api/hpp_hello_triangle/hpp_hello_triangle.cpp +++ b/samples/api/hpp_hello_triangle/hpp_hello_triangle.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,6 @@ #include #include #include -#include #include // Note: the default dispatcher is instantiated in hpp_api_vulkan_sample.cpp. @@ -30,16 +29,17 @@ #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) /// @brief A debug callback called from Vulkan validation layers. -VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_type, - const VkDebugUtilsMessengerCallbackDataEXT *callback_data, - void *user_data) +VKAPI_ATTR vk::Bool32 VKAPI_CALL debug_utils_messenger_callback(vk::DebugUtilsMessageSeverityFlagBitsEXT message_severity, + vk::DebugUtilsMessageTypeFlagsEXT message_type, + const vk::DebugUtilsMessengerCallbackDataEXT *callback_data, + void *user_data) { // Log debug message - if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) + if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) { LOGW("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); } - else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) + else if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) { LOGE("{} - {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); } @@ -60,72 +60,13 @@ bool validate_extensions(const std::vector &required, { // inner find_if gives true if the extension was not found // outer find_if gives true if none of the extensions were not found, that is if all extensions were found - return std::find_if(required.begin(), - required.end(), - [&available](auto extension) { - return std::find_if(available.begin(), - available.end(), - [&extension](auto const &ep) { - return strcmp(ep.extensionName, extension) == 0; - }) == available.end(); - }) == required.end(); -} - -bool validate_layers(const std::vector &required, - const std::vector &available) -{ - // inner find_if returns true if the layer was not found - // outer find_if returns iterator to the not found layer, if any - auto requiredButNotFoundIt = std::find_if(required.begin(), - required.end(), - [&available](auto layer) { - return std::find_if(available.begin(), - available.end(), - [&layer](auto const &lp) { - return strcmp(lp.layerName, layer) == 0; - }) == available.end(); - }); - if (requiredButNotFoundIt != required.end()) - { - LOGE("Validation Layer {} not found", *requiredButNotFoundIt); - } - return (requiredButNotFoundIt == required.end()); -} - -std::vector get_optimal_validation_layers(const std::vector &supported_instance_layers) -{ - std::vector> validation_layer_priority_list = - { - // The preferred validation layer is "VK_LAYER_KHRONOS_validation" - {"VK_LAYER_KHRONOS_validation"}, - - // Otherwise we fallback to using the LunarG meta layer - {"VK_LAYER_LUNARG_standard_validation"}, - - // Otherwise we attempt to enable the individual layers that compose the LunarG meta layer since it doesn't exist - { - "VK_LAYER_GOOGLE_threading", - "VK_LAYER_LUNARG_parameter_validation", - "VK_LAYER_LUNARG_object_tracker", - "VK_LAYER_LUNARG_core_validation", - "VK_LAYER_GOOGLE_unique_objects", - }, - - // Otherwise as a last resort we fallback to attempting to enable the LunarG core layer - {"VK_LAYER_LUNARG_core_validation"}}; - - for (auto &validation_layers : validation_layer_priority_list) - { - if (validate_layers(validation_layers, supported_instance_layers)) - { - return validation_layers; - } - - LOGW("Couldn't enable validation layers (see log for error) - falling back"); - } - - // Else return nothing - return {}; + return std::ranges::find_if(required, + [&available](auto extension) { + return std::ranges::find_if(available, + [&extension](auto const &ep) { + return strcmp(ep.extensionName, extension) == 0; + }) == available.end(); + }) == required.end(); } HPPHelloTriangle::HPPHelloTriangle() @@ -181,6 +122,16 @@ HPPHelloTriangle::~HPPHelloTriangle() instance.destroySurfaceKHR(surface); } + if (vertex_buffer_allocation != VK_NULL_HANDLE) + { + vmaDestroyBuffer(vma_allocator, vertex_buffer, vertex_buffer_allocation); + } + + if (vma_allocator != VK_NULL_HANDLE) + { + vmaDestroyAllocator(vma_allocator); + } + if (device) { device.destroy(); @@ -219,6 +170,9 @@ bool HPPHelloTriangle::prepare(const vkb::ApplicationOptions &options) // get the (graphics) queue queue = device.getQueue(graphics_queue_index, 0); + vma_allocator = create_vma_allocator(); + std::tie(vertex_buffer, vertex_buffer_allocation) = create_vertex_buffer(); + init_swapchain(); // Create the necessary objects for rendering. @@ -258,7 +212,11 @@ void HPPHelloTriangle::update(float delta_time) render_triangle(index); // Present swapchain image - vk::PresentInfoKHR present_info(per_frame_data[index].swapchain_release_semaphore, swapchain_data.swapchain, index); + vk::PresentInfoKHR present_info{.waitSemaphoreCount = 1, + .pWaitSemaphores = &per_frame_data[index].swapchain_release_semaphore, + .swapchainCount = 1, + .pSwapchains = &swapchain_data.swapchain, + .pImageIndices = &index}; res = queue.presentKHR(present_info); // Handle Outdated error in present. @@ -364,10 +322,24 @@ vk::Device HPPHelloTriangle::create_device(const std::vector &requ throw std::runtime_error("Required device extensions are missing, will try without."); } + std::vector active_device_extensions(required_device_extensions); + +#if (defined(VKB_ENABLE_PORTABILITY)) + // VK_KHR_portability_subset must be enabled if present in the implementation (e.g on macOS/iOS with beta extensions enabled) + if (std::ranges::any_of(device_extensions, + [](vk::ExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0; })) + { + active_device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + } +#endif + // Create a device with one queue - float queue_priority = 1.0f; - vk::DeviceQueueCreateInfo queue_info({}, graphics_queue_index, 1, &queue_priority); - vk::DeviceCreateInfo device_info({}, queue_info, {}, required_device_extensions); + float queue_priority = 0.5f; + vk::DeviceQueueCreateInfo queue_info{.queueFamilyIndex = graphics_queue_index, .queueCount = 1, .pQueuePriorities = &queue_priority}; + vk::DeviceCreateInfo device_info{.queueCreateInfoCount = 1, + .pQueueCreateInfos = &queue_info, + .enabledExtensionCount = static_cast(active_device_extensions.size()), + .ppEnabledExtensionNames = active_device_extensions.data()}; vk::Device device = gpu.createDevice(device_info); // initialize function pointers for device @@ -379,15 +351,44 @@ vk::Device HPPHelloTriangle::create_device(const std::vector &requ vk::Pipeline HPPHelloTriangle::create_graphics_pipeline() { // Load our SPIR-V shaders. + + // Samples support different shading languages, all of which are offline compiled to SPIR-V, the shader format that Vulkan uses. + // The shading language to load for can be selected via command line + std::string shader_folder{""}; + switch (get_shading_language()) + { + case vkb::ShadingLanguage::HLSL: + shader_folder = "hlsl"; + break; + case vkb::ShadingLanguage::SLANG: + shader_folder = "slang"; + break; + default: + shader_folder = "glsl"; + } + std::vector shader_stages{ - vk::PipelineShaderStageCreateInfo({}, vk::ShaderStageFlagBits::eVertex, create_shader_module("triangle.vert"), "main"), - vk::PipelineShaderStageCreateInfo({}, vk::ShaderStageFlagBits::eFragment, create_shader_module("triangle.frag"), "main")}; + {.stage = vk::ShaderStageFlagBits::eVertex, .module = create_shader_module("hello_triangle/" + shader_folder + "/triangle.vert.spv"), .pName = "main"}, + {.stage = vk::ShaderStageFlagBits::eFragment, .module = create_shader_module("hello_triangle/" + shader_folder + "/triangle.frag.spv"), .pName = "main"}}; + + // Define the vertex input binding. + vk::VertexInputBindingDescription binding_description{.binding = 0, .stride = sizeof(Vertex), .inputRate = vk::VertexInputRate::eVertex}; - vk::PipelineVertexInputStateCreateInfo vertex_input; + // Define the vertex input attribute. + std::array attribute_descriptions{ + {{.location = 0, .binding = 0, .format = vk::Format::eR32G32B32Sfloat, .offset = offsetof(Vertex, position)}, + {.location = 1, .binding = 0, .format = vk::Format::eR32G32B32Sfloat, .offset = offsetof(Vertex, color)}}}; + + // Define the pipeline vertex input. + vk::PipelineVertexInputStateCreateInfo vertex_input{ + .vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &binding_description, + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; // Our attachment will write to all color channels, but no blending is enabled. - vk::PipelineColorBlendAttachmentState blend_attachment; - blend_attachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Disable all depth testing. vk::PipelineDepthStencilStateCreateInfo depth_stencil; @@ -415,21 +416,21 @@ vk::Pipeline HPPHelloTriangle::create_graphics_pipeline() vk::ImageView HPPHelloTriangle::create_image_view(vk::Image image) { - vk::ImageViewCreateInfo image_view_create_info({}, - image, - vk::ImageViewType::e2D, - swapchain_data.format, - {vk::ComponentSwizzle::eR, vk::ComponentSwizzle::eG, vk::ComponentSwizzle::eB, vk::ComponentSwizzle::eA}, - {vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}); + vk::ImageViewCreateInfo image_view_create_info{ + .image = image, + .viewType = vk::ImageViewType::e2D, + .format = swapchain_data.format, + .components = {.r = vk::ComponentSwizzle::eR, .g = vk::ComponentSwizzle::eG, .b = vk::ComponentSwizzle::eB, .a = vk::ComponentSwizzle::eA}, + .subresourceRange = {.aspectMask = vk::ImageAspectFlagBits::eColor, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, .layerCount = 1}}; return device.createImageView(image_view_create_info); } vk::Instance HPPHelloTriangle::create_instance(std::vector const &required_instance_extensions, std::vector const &required_validation_layers) { #if defined(_HPP_VULKAN_LIBRARY) - static vk::DynamicLoader dl(_HPP_VULKAN_LIBRARY); + static vk::detail::DynamicLoader dl(_HPP_VULKAN_LIBRARY); #else - static vk::DynamicLoader dl; + static vk::detail::DynamicLoader dl; #endif PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); @@ -445,9 +446,8 @@ vk::Instance HPPHelloTriangle::create_instance(std::vector const & #if (defined(VKB_ENABLE_PORTABILITY)) active_instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); bool portability_enumeration_available = false; - if (std::any_of(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](vk::ExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) + if (std::ranges::any_of(available_instance_extensions, + [](vk::ExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) { active_instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); portability_enumeration_available = true; @@ -477,39 +477,38 @@ vk::Instance HPPHelloTriangle::create_instance(std::vector const & throw std::runtime_error("Required instance extensions are missing."); } - std::vector supported_validation_layers = vk::enumerateInstanceLayerProperties(); + std::vector requested_instance_layers(required_validation_layers); - std::vector requested_validation_layers(required_validation_layers); +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + char const *validationLayer = "VK_LAYER_KHRONOS_validation"; -#ifdef VKB_VALIDATION_LAYERS - // Determine the optimal validation layers to enable that are necessary for useful debugging - std::vector optimal_validation_layers = get_optimal_validation_layers(supported_validation_layers); - requested_validation_layers.insert(requested_validation_layers.end(), optimal_validation_layers.begin(), optimal_validation_layers.end()); -#endif + std::vector supported_instance_layers = vk::enumerateInstanceLayerProperties(); - if (validate_layers(requested_validation_layers, supported_validation_layers)) + if (std::ranges::any_of(supported_instance_layers, [&validationLayer](auto const &lp) { return strcmp(lp.layerName, validationLayer) == 0; })) { - LOGI("Enabled Validation Layers:") - for (const auto &layer : requested_validation_layers) - { - LOGI(" \t{}", layer); - } + requested_instance_layers.push_back(validationLayer); + LOGI("Enabled Validation Layer {}", validationLayer); } else { - throw std::runtime_error("Required validation layers are missing."); + LOGW("Validation Layer {} is not available", validationLayer); } +#endif - vk::ApplicationInfo app("HPP Hello Triangle", {}, "Vulkan Samples", {}, VK_MAKE_VERSION(1, 0, 0)); + vk::ApplicationInfo app{.pApplicationName = "HPP Hello Triangle", .pEngineName = "Vulkan Samples", .apiVersion = VK_API_VERSION_1_1}; - vk::InstanceCreateInfo instance_info({}, &app, requested_validation_layers, active_instance_extensions); + vk::InstanceCreateInfo instance_info{.pApplicationInfo = &app, + .enabledLayerCount = static_cast(requested_instance_layers.size()), + .ppEnabledLayerNames = requested_instance_layers.data(), + .enabledExtensionCount = static_cast(active_instance_extensions.size()), + .ppEnabledExtensionNames = active_instance_extensions.data()}; #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) debug_utils_create_info = - vk::DebugUtilsMessengerCreateInfoEXT({}, - vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, - vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, - debug_utils_messenger_callback); + vk::DebugUtilsMessengerCreateInfoEXT{.messageSeverity = + vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, + .messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, + .pfnUserCallback = debug_utils_messenger_callback}; instance_info.pNext = &debug_utils_create_info; #endif @@ -541,83 +540,58 @@ vk::Instance HPPHelloTriangle::create_instance(std::vector const & vk::RenderPass HPPHelloTriangle::create_render_pass() { - vk::AttachmentDescription attachment({}, - swapchain_data.format, // Backbuffer format - vk::SampleCountFlagBits::e1, // Not multisampled - vk::AttachmentLoadOp::eClear, // When starting the frame, we want tiles to be cleared - vk::AttachmentStoreOp::eStore, // When ending the frame, we want tiles to be written out - vk::AttachmentLoadOp::eDontCare, // Don't care about stencil since we're not using it - vk::AttachmentStoreOp::eDontCare, - vk::ImageLayout::eUndefined, // The image layout will be undefined when the render pass begins - vk::ImageLayout::ePresentSrcKHR); // After the render pass is complete, we will transition to ePresentSrcKHR layout + vk::AttachmentDescription attachment{ + .format = swapchain_data.format, // Backbuffer format. + .samples = vk::SampleCountFlagBits::e1, // Not multisampled. + .loadOp = vk::AttachmentLoadOp::eClear, // When starting the frame, we want tiles to be cleared. + .storeOp = vk::AttachmentStoreOp::eStore, // When ending the frame, we want tiles to be written out. + .stencilLoadOp = vk::AttachmentLoadOp::eDontCare, // Don't care about stencil since we're not using it. + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, // Don't care about stencil since we're not using it. + .initialLayout = vk::ImageLayout::eUndefined, // The image layout will be undefined when the render pass begins. + .finalLayout = vk::ImageLayout::ePresentSrcKHR // After the render pass is complete, we will transition to PRESENT_SRC_KHR layout. + }; // We have one subpass. This subpass has one color attachment. // While executing this subpass, the attachment will be in attachment optimal layout. - vk::AttachmentReference color_ref(0, vk::ImageLayout::eColorAttachmentOptimal); + vk::AttachmentReference color_ref{.attachment = 0, .layout = vk::ImageLayout::eColorAttachmentOptimal}; // We will end up with two transitions. // The first one happens right before we start subpass #0, where // eUndefined is transitioned into eColorAttachmentOptimal. // The final layout in the render pass attachment states ePresentSrcKHR, so we // will get a final transition from eColorAttachmentOptimal to ePresetSrcKHR. - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics, {}, color_ref); + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, .colorAttachmentCount = 1, .pColorAttachments = &color_ref}; // Create a dependency to external events. // We need to wait for the WSI semaphore to signal. // Only pipeline stages which depend on eColorAttachmentOutput will // actually wait for the semaphore, so we must also wait for that pipeline stage. - vk::SubpassDependency dependency(/*srcSubpass */ VK_SUBPASS_EXTERNAL, - /*dstSubpass */ 0, - /*srcStageMask */ vk::PipelineStageFlagBits::eColorAttachmentOutput, - /*dstStageMask */ vk::PipelineStageFlagBits::eColorAttachmentOutput, - // Since we changed the image layout, we need to make the memory visible to - // color attachment to modify. - /*srcAccessMask*/ {}, - /*dstAccessMask*/ vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite); + vk::SubpassDependency dependency{.srcSubpass = vk::SubpassExternal, + .dstSubpass = 0, + .srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput, + .dstStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput, + // Since we changed the image layout, we need to make the memory visible to color attachment to modify. + .srcAccessMask = {}, + .dstAccessMask = vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite}; // Finally, create the renderpass. - vk::RenderPassCreateInfo rp_info({}, attachment, subpass, dependency); + vk::RenderPassCreateInfo rp_info{ + .attachmentCount = 1, .pAttachments = &attachment, .subpassCount = 1, .pSubpasses = &subpass, .dependencyCount = 1, .pDependencies = &dependency}; return device.createRenderPass(rp_info); } /** - * @brief Helper function to load a shader module. + * @brief Helper function to load a shader module from an offline-compiled SPIR-V file. * @param path The path for the shader (relative to the assets directory). * @returns A vk::ShaderModule handle. Aborts execution if shader creation fails. */ -vk::ShaderModule HPPHelloTriangle::create_shader_module(const char *path) +vk::ShaderModule HPPHelloTriangle::create_shader_module(std::string const &path) { - static const std::map shader_stage_map = {{"comp", vk::ShaderStageFlagBits::eCompute}, - {"frag", vk::ShaderStageFlagBits::eFragment}, - {"geom", vk::ShaderStageFlagBits::eGeometry}, - {"tesc", vk::ShaderStageFlagBits::eTessellationControl}, - {"tese", vk::ShaderStageFlagBits::eTessellationEvaluation}, - {"vert", vk::ShaderStageFlagBits::eVertex}}; - vkb::HPPGLSLCompiler glsl_compiler; - - auto buffer = vkb::fs::read_shader_binary(path); + auto spirv = vkb::fs::read_shader_binary_u32(path); - std::string file_ext = path; - - // Extract extension name from the glsl shader file - file_ext = file_ext.substr(file_ext.find_last_of(".") + 1); - - std::vector spirvCode; - std::string info_log; - - // Compile the GLSL source - auto stageIt = shader_stage_map.find(file_ext); - if (stageIt == shader_stage_map.end()) - { - throw std::runtime_error("File extension `" + file_ext + "` does not have a vulkan shader stage."); - } - if (!glsl_compiler.compile_to_spirv(stageIt->second, buffer, "main", {}, spirvCode, info_log)) - { - LOGE("Failed to compile shader, Error: {}", info_log.c_str()); - return nullptr; - } + vk::ShaderModuleCreateInfo shader_module_create_info{.codeSize = spirv.size() * sizeof(uint32_t), .pCode = spirv.data()}; - return device.createShaderModule({{}, spirvCode}); + return device.createShaderModule(shader_module_create_info); } vk::SwapchainKHR @@ -661,25 +635,80 @@ vk::SwapchainKHR // FIFO must be supported by all implementations. vk::PresentModeKHR swapchain_present_mode = vk::PresentModeKHR::eFifo; - vk::SwapchainCreateInfoKHR swapchain_create_info; - swapchain_create_info.surface = surface; - swapchain_create_info.minImageCount = desired_swapchain_images; - swapchain_create_info.imageFormat = surface_format.format; - swapchain_create_info.imageColorSpace = surface_format.colorSpace; - swapchain_create_info.imageExtent.width = swapchain_extent.width; - swapchain_create_info.imageExtent.height = swapchain_extent.height; - swapchain_create_info.imageArrayLayers = 1; - swapchain_create_info.imageUsage = vk::ImageUsageFlagBits::eColorAttachment; - swapchain_create_info.imageSharingMode = vk::SharingMode::eExclusive; - swapchain_create_info.preTransform = pre_transform; - swapchain_create_info.compositeAlpha = composite; - swapchain_create_info.presentMode = swapchain_present_mode; - swapchain_create_info.clipped = true; - swapchain_create_info.oldSwapchain = old_swapchain; + vk::SwapchainCreateInfoKHR swapchain_create_info{ + .surface = surface, + .minImageCount = desired_swapchain_images, + .imageFormat = surface_format.format, + .imageColorSpace = surface_format.colorSpace, + .imageExtent = swapchain_extent, + .imageArrayLayers = 1, + .imageUsage = vk::ImageUsageFlagBits::eColorAttachment, + .imageSharingMode = vk::SharingMode::eExclusive, + .preTransform = pre_transform, + .compositeAlpha = composite, + .presentMode = swapchain_present_mode, + .clipped = true, + .oldSwapchain = old_swapchain}; return device.createSwapchainKHR(swapchain_create_info); } +std::pair HPPHelloTriangle::create_vertex_buffer() +{ + // Vertex data for a single colored triangle + const std::vector vertices = { + {{0.5f, -0.5f, 0.5f}, {1.0f, 0.0f, 0.0f}}, + {{0.5f, 0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, + {{-0.5f, 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}}; + + const vk::DeviceSize buffer_size = sizeof(vertices[0]) * vertices.size(); + + // Copy Vertex data to a buffer accessible by the device + + vk::BufferCreateInfo buffer_create_info{.size = buffer_size, .usage = vk::BufferUsageFlagBits::eVertexBuffer}; + + // We use the Vulkan Memory Allocator to find a memory type that can be written and mapped from the host + // On most setups this will return a memory type that resides in VRAM and is accessible from the host + VmaAllocationCreateInfo allocation_create_info{ + .flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, + .usage = VMA_MEMORY_USAGE_AUTO, + .requiredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT}; + + vk::Buffer vertex_buffer; + VmaAllocation vertex_buffer_allocation; + VmaAllocationInfo allocation_info{}; + vmaCreateBuffer(vma_allocator, reinterpret_cast(&buffer_create_info), &allocation_create_info, reinterpret_cast(&vertex_buffer), &vertex_buffer_allocation, &allocation_info); + if (allocation_info.pMappedData) + { + memcpy(allocation_info.pMappedData, vertices.data(), buffer_size); + } + else + { + throw std::runtime_error("Could not map vertex buffer."); + } + + return {vertex_buffer, vertex_buffer_allocation}; +} + +VmaAllocator HPPHelloTriangle::create_vma_allocator() +{ + // This sample uses the Vulkan Memory Alloctor (VMA), which needs to be set up + VmaVulkanFunctions vma_vulkan_functions{ + .vkGetInstanceProcAddr = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr, + .vkGetDeviceProcAddr = VULKAN_HPP_DEFAULT_DISPATCHER.vkGetDeviceProcAddr}; + + VmaAllocatorCreateInfo allocator_info{.physicalDevice = gpu, .device = device, .pVulkanFunctions = &vma_vulkan_functions, .instance = instance}; + + VmaAllocator allocator; + VkResult result = vmaCreateAllocator(&allocator_info, &allocator); + if (result != VK_SUCCESS) + { + throw std::runtime_error("Could not create allocator for VMA allocator"); + } + + return allocator; +} + /** * @brief Initializes the Vulkan framebuffers. */ @@ -745,8 +774,8 @@ void HPPHelloTriangle::init_swapchain() for (size_t frame = 0; frame < image_count; frame++) { auto &pfd = per_frame_data[frame]; - pfd.queue_submit_fence = device.createFence({vk::FenceCreateFlagBits::eSignaled}); - pfd.primary_command_pool = device.createCommandPool({vk::CommandPoolCreateFlagBits::eTransient, graphics_queue_index}); + pfd.queue_submit_fence = device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled}); + pfd.primary_command_pool = device.createCommandPool({.flags = vk::CommandPoolCreateFlagBits::eTransient, .queueFamilyIndex = graphics_queue_index}); pfd.primary_command_buffer = vkb::common::allocate_command_buffer(device, pfd.primary_command_pool); } @@ -770,7 +799,7 @@ void HPPHelloTriangle::render_triangle(uint32_t swapchain_index) vk::CommandBuffer cmd = per_frame_data[swapchain_index].primary_command_buffer; // We will only submit this once before it's recycled. - vk::CommandBufferBeginInfo begin_info(vk::CommandBufferUsageFlagBits::eOneTimeSubmit); + vk::CommandBufferBeginInfo begin_info{.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit}; // Begin command recording cmd.begin(begin_info); @@ -779,22 +808,29 @@ void HPPHelloTriangle::render_triangle(uint32_t swapchain_index) clear_value.color = vk::ClearColorValue(std::array({{0.01f, 0.01f, 0.033f, 1.0f}})); // Begin the render pass. - vk::RenderPassBeginInfo rp_begin(render_pass, framebuffer, {{0, 0}, {swapchain_data.extent.width, swapchain_data.extent.height}}, - clear_value); + vk::RenderPassBeginInfo rp_begin{.renderPass = render_pass, + .framebuffer = framebuffer, + .renderArea = {{0, 0}, {swapchain_data.extent.width, swapchain_data.extent.height}}, + .clearValueCount = 1, + .pClearValues = &clear_value}; // We will add draw commands in the same command buffer. cmd.beginRenderPass(rp_begin, vk::SubpassContents::eInline); // Bind the graphics pipeline. cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); - vk::Viewport vp(0.0f, 0.0f, static_cast(swapchain_data.extent.width), static_cast(swapchain_data.extent.height), 0.0f, 1.0f); + vk::Viewport vp{0.0f, 0.0f, static_cast(swapchain_data.extent.width), static_cast(swapchain_data.extent.height), 0.0f, 1.0f}; // Set viewport dynamically cmd.setViewport(0, vp); - vk::Rect2D scissor({0, 0}, {swapchain_data.extent.width, swapchain_data.extent.height}); + vk::Rect2D scissor{{0, 0}, {swapchain_data.extent.width, swapchain_data.extent.height}}; // Set scissor dynamically cmd.setScissor(0, scissor); + // Bind the vertex buffer to source the draw calls from. + vk::DeviceSize offset = {0}; + cmd.bindVertexBuffers(0, vertex_buffer, offset); + // Draw three vertices with one instance. cmd.draw(3, 1, 0, 0); @@ -812,8 +848,13 @@ void HPPHelloTriangle::render_triangle(uint32_t swapchain_index) vk::PipelineStageFlags wait_stage{VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; - vk::SubmitInfo info(per_frame_data[swapchain_index].swapchain_acquire_semaphore, wait_stage, cmd, - per_frame_data[swapchain_index].swapchain_release_semaphore); + vk::SubmitInfo info{.waitSemaphoreCount = 1, + .pWaitSemaphores = &per_frame_data[swapchain_index].swapchain_acquire_semaphore, + .pWaitDstStageMask = &wait_stage, + .commandBufferCount = 1, + .pCommandBuffers = &cmd, + .signalSemaphoreCount = 1, + .pSignalSemaphores = &per_frame_data[swapchain_index].swapchain_release_semaphore}; // Submit command buffer to graphics queue queue.submit(info, per_frame_data[swapchain_index].queue_submit_fence); } diff --git a/samples/api/hpp_hello_triangle/hpp_hello_triangle.h b/samples/api/hpp_hello_triangle/hpp_hello_triangle.h index 95f6f45f99..e798d94743 100644 --- a/samples/api/hpp_hello_triangle/hpp_hello_triangle.h +++ b/samples/api/hpp_hello_triangle/hpp_hello_triangle.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2023, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -51,6 +51,13 @@ class HPPHelloTriangle : public vkb::Application vk::Semaphore swapchain_release_semaphore; }; + /// Properties of the vertices used in this sample. + struct Vertex + { + glm::vec3 position; + glm::vec3 color; + }; + public: HPPHelloTriangle(); virtual ~HPPHelloTriangle(); @@ -61,35 +68,40 @@ class HPPHelloTriangle : public vkb::Application virtual bool resize(const uint32_t width, const uint32_t height) override; virtual void update(float delta_time) override; - std::pair acquire_next_image(); - vk::Device create_device(const std::vector &required_device_extensions); - vk::Pipeline create_graphics_pipeline(); - vk::ImageView create_image_view(vk::Image image); - vk::Instance create_instance(std::vector const &required_instance_extensions, std::vector const &required_validation_layers); - vk::RenderPass create_render_pass(); - vk::ShaderModule create_shader_module(const char *path); - vk::SwapchainKHR create_swapchain(vk::Extent2D const &swapchain_extent, vk::SurfaceFormatKHR surface_format, vk::SwapchainKHR old_swapchain); - void init_framebuffers(); - void init_swapchain(); - void render_triangle(uint32_t swapchain_index); - void select_physical_device_and_surface(); - void teardown_framebuffers(); - void teardown_per_frame(FrameData &per_frame_data); + std::pair acquire_next_image(); + vk::Device create_device(const std::vector &required_device_extensions); + vk::Pipeline create_graphics_pipeline(); + vk::ImageView create_image_view(vk::Image image); + vk::Instance create_instance(std::vector const &required_instance_extensions, std::vector const &required_validation_layers); + vk::RenderPass create_render_pass(); + vk::ShaderModule create_shader_module(std::string const &path); + vk::SwapchainKHR create_swapchain(vk::Extent2D const &swapchain_extent, vk::SurfaceFormatKHR surface_format, vk::SwapchainKHR old_swapchain); + std::pair create_vertex_buffer(); + VmaAllocator create_vma_allocator(); + void init_framebuffers(); + void init_swapchain(); + void render_triangle(uint32_t swapchain_index); + void select_physical_device_and_surface(); + void teardown_framebuffers(); + void teardown_per_frame(FrameData &per_frame_data); private: - vk::Instance instance; // The Vulkan instance. - vk::PhysicalDevice gpu; // The Vulkan physical device. - vk::Device device; // The Vulkan device. - vk::Queue queue; // The Vulkan device queue. - SwapchainData swapchain_data; // The swapchain state. - vk::SurfaceKHR surface; // The surface we will render to. - uint32_t graphics_queue_index; // The queue family index where graphics work will be submitted. - vk::RenderPass render_pass; // The renderpass description. - vk::PipelineLayout pipeline_layout; // The pipeline layout for resources. - vk::Pipeline pipeline; // The graphics pipeline. - vk::DebugUtilsMessengerEXT debug_utils_messenger; // The debug utils messenger. - std::vector recycled_semaphores; // A set of semaphores that can be reused. - std::vector per_frame_data; // A set of per-frame data. + vk::Instance instance; // The Vulkan instance. + vk::PhysicalDevice gpu; // The Vulkan physical device. + vk::Device device; // The Vulkan device. + vk::Queue queue; // The Vulkan device queue. + SwapchainData swapchain_data; // The swapchain state. + vk::SurfaceKHR surface; // The surface we will render to. + uint32_t graphics_queue_index; // The queue family index where graphics work will be submitted. + vk::RenderPass render_pass; // The renderpass description. + vk::PipelineLayout pipeline_layout; // The pipeline layout for resources. + vk::Pipeline pipeline; // The graphics pipeline. + vk::DebugUtilsMessengerEXT debug_utils_messenger; // The debug utils messenger. + std::vector recycled_semaphores; // A set of semaphores that can be reused. + std::vector per_frame_data; // A set of per-frame data. + vk::Buffer vertex_buffer; // The Vulkan buffer object that holds the vertex data for the triangle. + VmaAllocation vertex_buffer_allocation = VK_NULL_HANDLE; // Vulkan Memory Allocator (VMA) allocation info for the vertex buffer. + VmaAllocator vma_allocator; // The VMA allocator for memory management. #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) vk::DebugUtilsMessengerCreateInfoEXT debug_utils_create_info; diff --git a/samples/api/hpp_hello_triangle_1_3/CMakeLists.txt b/samples/api/hpp_hello_triangle_1_3/CMakeLists.txt new file mode 100644 index 0000000000..bc9521c352 --- /dev/null +++ b/samples/api/hpp_hello_triangle_1_3/CMakeLists.txt @@ -0,0 +1,41 @@ +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 the "License"; +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(CMAKE_CXX_EXTENSIONS OFF) + +get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) +get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) +get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) + +add_sample( + ID ${FOLDER_NAME} + CATEGORY ${CATEGORY_NAME} + AUTHOR "Huawei Technologies Co., Ltd." + NAME "Vulkan 1.3 HPP Hello Triangle" + DESCRIPTION "An introduction into Vulkan using Vulkan 1.3 using Vulkan-Hpp" + SHADER_FILES_GLSL + "hello_triangle_1_3/glsl/triangle.vert" + "hello_triangle_1_3/glsl/triangle.frag" + SHADER_FILES_HLSL + "hello_triangle_1_3/hlsl/triangle.vert.hlsl" + "hello_triangle_1_3/hlsl/triangle.frag.hlsl" + SHADER_FILES_SLANG + "hello_triangle_1_3/slang/triangle.vert.slang" + "hello_triangle_1_3/slang/triangle.frag.slang") + +if(${VKB_${FOLDER_NAME}}) + target_compile_definitions(${FOLDER_NAME} PUBLIC VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1) +endif() \ No newline at end of file diff --git a/samples/api/hpp_hello_triangle_1_3/README.adoc b/samples/api/hpp_hello_triangle_1_3/README.adoc new file mode 100644 index 0000000000..e1c38cd7ea --- /dev/null +++ b/samples/api/hpp_hello_triangle_1_3/README.adoc @@ -0,0 +1,212 @@ +//// + * Copyright (c) 2025, The Khronos Group + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +//// += Hello Triangle with Vulkan 1.3 Features using Vulkan-Hpp + +ifdef::site-gen-antora[] +TIP: The source for this sample can be found in the https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/api/hpp_hello_triangle_1_3[Khronos Vulkan samples github repository]. +endif::[] + +NOTE: A transcoded version of the API sample https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/api/hello_triangle_1_3[Hello Triangle 1.3] that illustrates the usage of the C{pp} bindings of Vulkan provided by Vulkan-Hpp. + +This sample demonstrates how to render a simple triangle using Vulkan 1.3 core features. It modernizes the traditional "Hello Triangle" Vulkan sample by incorporating: + +- **Dynamic Rendering** +- **Synchronization2** +- **Extended Dynamic State** +- **Vertex Buffers** + +## Overview + +The sample renders a colored triangle to the screen using Vulkan 1.3. It showcases how to: + +- Initialize Vulkan with Vulkan 1.3 features enabled. +- Use dynamic rendering to simplify the rendering pipeline. +- Employ the Synchronization2 API for improved synchronization. +- Utilize extended dynamic states to reduce pipeline complexity. +- Manage vertex data using vertex buffers instead of hard-coded vertices. + +## Key Features + +### 1. Dynamic Rendering + +**What is Dynamic Rendering?** + +Dynamic Rendering is a feature introduced in Vulkan 1.3 that allows rendering without pre-defined render passes and framebuffers. It simplifies the rendering process by enabling you to specify rendering states directly during command buffer recording. + +**How It's Used in the Sample:** + +- **No Render Passes or Framebuffers:** The sample does not create `vk::RenderPass` or `vk::Framebuffer` objects. +- **`vk::CommandBuffer::beginRendering()` and `vk::CommandBuffer::endRendering()`:** These functions are used to begin and end rendering operations dynamically. +- **Pipeline Creation:** Uses `vk::PipelineRenderingCreateInfo` during pipeline creation to specify rendering details. + +**Benefits:** + +- Simplifies code by reducing boilerplate associated with render passes and framebuffers. +- Increases flexibility by allowing rendering to different attachments without recreating render passes. + +### 2. Synchronization2 + +**What is Synchronization2?** + +Synchronization2 is an improved synchronization API introduced in Vulkan 1.3. It provides more granular control over synchronization primitives and simplifies the synchronization process. + +**How It's Used in the Sample:** + +- **`vk::CommandBuffer::pipelineBarrier2()`:** Replaces the older `vk::CommandBuffer::pipelineBarrier()` for more detailed synchronization. +- **`vk::DependencyInfo` and `vk::ImageMemoryBarrier2`:** Used to specify precise memory dependencies and image layout transitions. + +**Example Usage:** + +```cpp +vk::ImageMemoryBarrier2 image_barrier = { + // ... members ... +}; + +vk::DependencyInfo dependency_info = { + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &image_barrier, +}; + +cmd.pipelineBarrier2(dependency_info); +``` + +**Benefits:** + +- Provides more expressive and flexible synchronization. +- Reduces the potential for synchronization errors. +- Simplifies the specification of pipeline stages and access masks. + +### 3. Extended Dynamic State + +**What is Extended Dynamic State?** + +Extended Dynamic State allows more pipeline states to be set dynamically at command buffer recording time rather than during pipeline creation. This reduces the number of pipeline objects needed. + +**How It's Used in the Sample:** + +- **Dynamic States Enabled:** The sample enables dynamic states like `vk::DynamicState::eCullMode`, `vk::DynamicState::eFrontFace`, and `vk::DynamicState::ePrimitiveTopology`. +- **Dynamic State Commands:** Uses `vk::CommandBuffer::setCullMode()`, `vk::CommandBuffer::setFrontFace()`, and `vk::CommandBuffer::setPrimitiveTopology()` to set these states dynamically. + +**Example Usage:** + +```cpp +cmd.setCullMode(vk::DynamicState::eCullMode); +cmd.setFrontFace(vk::FrontFace::eClockwise); +cmd.setPrimitiveTopology(vk::PrimitiveTopology::eTriangleList); +``` + +**Benefits:** + +- Reduces the need to create multiple pipelines for different state configurations. +- Enhances flexibility by allowing state changes without pipeline recreation. + +### 4. Vertex Buffers + +**What Changed?** + +Unlike the original sample, which used hard-coded vertices in the shader, this sample uses a vertex buffer to store vertex data. + +**How It's Used in the Sample:** + +- **Vertex Structure Defined:** + +```cpp + struct Vertex { + glm::vec2 position; + glm::vec3 color; + }; +``` + +- **Vertex Data Stored in a Buffer:** + +```cpp + std::vector vertices = { + {{0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, // Red Vertex + // ... other vertices ... + }; +``` + +- **Buffer Creation and Memory Allocation:** + +```cpp + vk::BufferCreateInfo buffer_info = { /* ... */ }; + vertex_buffer = device.createBuffer(buffer_info); + + vk::MemoryAllocateInfo alloc_info = { /* ... */ }; + vertex_buffer_memory = device.allocateMemory(alloc_info); +``` + +- **Binding the Vertex Buffer:** + +```cpp + cmd.bindVertexBuffers(0, vertex_buffer, offset); +``` + +**Benefits:** + +- **Flexibility:** Easier to modify vertex data without changing shaders. +- **Performance:** Potentially better performance due to efficient memory usage. +- **Scalability:** Simplifies rendering more complex geometries. + +## How the Sample Works + +1. **Initialization:** + + - **Instance Creation:** Initializes a Vulkan instance with Vulkan 1.3 API version and required extensions. + - **Device Selection:** Chooses a physical device that supports Vulkan 1.3 and required features. + - **Logical Device Creation:** Creates a logical device with enabled Vulkan 1.3 features like dynamic rendering, synchronization2, and extended dynamic state. + - **Surface and Swapchain Creation:** Sets up the window surface and initializes the swapchain for presenting images. + +2. **Vertex Buffer Setup:** + + - **Vertex Data Definition:** Defines vertices with positions and colors. + - **Buffer Creation:** Creates a buffer to store vertex data. + - **Memory Allocation:** Allocates memory for the buffer and maps the vertex data into it. + +3. **Pipeline Setup:** + + - **Shader Modules:** Loads and compiles vertex and fragment shaders. + - **Pipeline Layout:** Creates a pipeline layout (empty in this case as no descriptors are used). + - **Dynamic States Specification:** Specifies which states will be dynamic. + - **Graphics Pipeline Creation:** Creates the graphics pipeline with dynamic rendering info and dynamic states enabled. + +4. **Rendering Loop:** + + - **Acquire Swapchain Image:** Gets the next available image from the swapchain. + - **Command Buffer Recording:** + + - **Begin Rendering:** Uses `vk::CommandBuffer::beginRendering()` with dynamic rendering info. + - **Set Dynamic States:** Sets viewport, scissor, cull mode, front face, and primitive topology dynamically. + - **Bind Pipeline and Vertex Buffer:** Binds the graphics pipeline and the vertex buffer. + - **Draw Call:** Issues a draw call to render the triangle. + - **End Rendering:** Uses `vk::CommandBuffer::endRendering()` to finish rendering. + - **Image Layout Transition:** Transitions the swapchain image layout for presentation using `vk::CommandBuffer::pipelineBarrier2()`. + + - **Queue Submission:** Submits the command buffer to the graphics queue. + - **Present Image:** Presents the rendered image to the screen. + +5. **Cleanup:** + + - **Resource Destruction:** Cleans up Vulkan resources like pipelines, buffers, and swapchain images upon application exit. + +## Dependencies and Requirements + +- **Vulkan SDK 1.3 or Later:** Ensure you have the Vulkan SDK that supports Vulkan 1.3. +- **Hardware Support:** A GPU that supports Vulkan 1.3 features, including dynamic rendering, synchronization2, and extended dynamic state. +- **GLM Library:** Used for vector and matrix operations. +- **Shader Compiler:** GLSL shaders are compiled at runtime using a GLSL compiler. \ No newline at end of file diff --git a/samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.cpp b/samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.cpp new file mode 100644 index 0000000000..415dc1cc55 --- /dev/null +++ b/samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.cpp @@ -0,0 +1,1160 @@ +/* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "hpp_hello_triangle_1_3.h" + +#include "common/hpp_vk_common.h" +#include "filesystem/legacy.h" +#include "platform/window.h" + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) +/// @brief A debug callback called from Vulkan validation layers. +static VKAPI_ATTR vk::Bool32 VKAPI_CALL debug_callback(vk::DebugUtilsMessageSeverityFlagBitsEXT message_severity, + vk::DebugUtilsMessageTypeFlagsEXT message_types, + vk::DebugUtilsMessengerCallbackDataEXT const *callback_data, + void *user_data) +{ + if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) + { + LOGE("{} Validation Layer: Error: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) + { + LOGW("{} Validation Layer: Warning: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo) + { + LOGI("{} Validation Layer: Information: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_types & vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance) + { + LOGI("{} Validation Layer: Performance warning: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + else if (message_severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose) + { + LOGD("{} Validation Layer: Verbose: {}: {}", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage); + } + return false; +} +#endif + +HPPHelloTriangleV13::~HPPHelloTriangleV13() +{ + // Don't release anything until the GPU is completely idle. + if (context.device) + { + context.device.waitIdle(); + } + + for (auto &per_frame : context.per_frame) + { + teardown_per_frame(per_frame); + } + + context.per_frame.clear(); + + for (auto semaphore : context.recycled_semaphores) + { + context.device.destroySemaphore(semaphore); + } + + if (context.pipeline) + { + context.device.destroyPipeline(context.pipeline); + } + + if (context.pipeline_layout) + { + context.device.destroyPipelineLayout(context.pipeline_layout); + } + + for (vk::ImageView image_view : context.swapchain_image_views) + { + context.device.destroyImageView(image_view); + } + + if (context.swapchain) + { + context.device.destroySwapchainKHR(context.swapchain); + } + + if (context.surface) + { + context.instance.destroySurfaceKHR(context.surface); + } + + if (context.vertex_buffer) + { + context.device.destroyBuffer(context.vertex_buffer); + } + + if (context.vertex_buffer_memory) + { + context.device.freeMemory(context.vertex_buffer_memory); + } + + if (context.device) + { + context.device.destroy(); + } + + if (context.debug_callback) + { + context.instance.destroyDebugUtilsMessengerEXT(context.debug_callback); + } +} + +bool HPPHelloTriangleV13::prepare(const vkb::ApplicationOptions &options) +{ + // Headless is not supported to keep this sample as simple as possible + assert(options.window != nullptr); + assert(options.window->get_window_mode() != vkb::Window::Mode::Headless); + + bool prepared = Application::prepare(options); + if (prepared) + { + init_instance(); + + select_physical_device_and_surface(options.window); + + auto &extent = options.window->get_extent(); + context.swapchain_dimensions.width = extent.width; + context.swapchain_dimensions.height = extent.height; + + init_device(); + + init_vertex_buffer(); + + init_swapchain(); + + // Create the necessary objects for rendering. + init_pipeline(); + } + + return prepared; +} + +bool HPPHelloTriangleV13::resize(const uint32_t, const uint32_t) +{ + if (context.device == VK_NULL_HANDLE) + { + return false; + } + + vk::SurfaceCapabilitiesKHR surface_properties = context.gpu.getSurfaceCapabilitiesKHR(context.surface); + + // Only rebuild the swapchain if the dimensions have changed + bool dimensions_changed = (surface_properties.currentExtent.width != context.swapchain_dimensions.width || + surface_properties.currentExtent.height != context.swapchain_dimensions.height); + if (dimensions_changed) + { + context.device.waitIdle(); + + init_swapchain(); + } + return dimensions_changed; +} + +/** + * @brief Select a physical device. + */ +void HPPHelloTriangleV13::select_physical_device_and_surface(vkb::Window *window) +{ + std::vector gpus = context.instance.enumeratePhysicalDevices(); + + for (const auto &physical_device : gpus) + { + // Check if the device supports Vulkan 1.3 + vk::PhysicalDeviceProperties device_properties = physical_device.getProperties(); + if (device_properties.apiVersion < vk::ApiVersion13) + { + LOGW("Physical device '{}' does not support Vulkan 1.3, skipping.", device_properties.deviceName.data()); + continue; + } + + if (context.surface) + { + context.instance.destroySurfaceKHR(context.surface); + } + + context.surface = static_cast(window->create_surface(static_cast(context.instance), static_cast(physical_device))); + if (!context.surface) + { + throw std::runtime_error("Failed to create window surface."); + } + + // Find a queue family that supports graphics and presentation + std::vector queue_family_properties = physical_device.getQueueFamilyProperties(); + + auto qfpIt = std::ranges::find_if(queue_family_properties, + [&physical_device, surface = context.surface](vk::QueueFamilyProperties const &qfp) { + static uint32_t index = 0; + return (qfp.queueFlags & vk::QueueFlagBits::eGraphics) && physical_device.getSurfaceSupportKHR(index++, surface); + }); + if (qfpIt != queue_family_properties.end()) + { + context.graphics_queue_index = std::distance(queue_family_properties.begin(), qfpIt); + context.gpu = physical_device; + break; + } + } + + if (context.graphics_queue_index < 0) + { + throw std::runtime_error("Failed to find a suitable GPU with Vulkan 1.3 support."); + } +} + +void HPPHelloTriangleV13::update(float delta_time) +{ + uint32_t index; + + auto res = acquire_next_swapchain_image(&index); + + // Handle outdated error in acquire. + if (res == vk::Result::eSuboptimalKHR || res == vk::Result::eErrorOutOfDateKHR) + { + if (!resize(context.swapchain_dimensions.width, context.swapchain_dimensions.height)) + { + LOGI("Resize failed"); + } + res = acquire_next_swapchain_image(&index); + } + + if (res != vk::Result::eSuccess) + { + context.queue.waitIdle(); + return; + } + + render_triangle(index); + res = present_image(index); + + // Handle Outdated error in present. + if (res == vk::Result::eSuboptimalKHR || res == vk::Result::eErrorOutOfDateKHR) + { + if (!resize(context.swapchain_dimensions.width, context.swapchain_dimensions.height)) + { + LOGI("Resize failed"); + } + } + else if (res != vk::Result::eSuccess) + { + LOGE("Failed to present swapchain image."); + } +} + +/** + * @brief Acquires an image from the swapchain. + * @param[out] image The swapchain index for the acquired image. + * @returns Vulkan result code + */ +vk::Result HPPHelloTriangleV13::acquire_next_swapchain_image(uint32_t *image) +{ + vk::Semaphore acquire_semaphore; + if (context.recycled_semaphores.empty()) + { + acquire_semaphore = context.device.createSemaphore({}); + } + else + { + acquire_semaphore = context.recycled_semaphores.back(); + context.recycled_semaphores.pop_back(); + } + + vk::Result result; + try + { + std::tie(result, *image) = context.device.acquireNextImageKHR(context.swapchain, UINT64_MAX, acquire_semaphore); + } + catch (vk::OutOfDateKHRError &) + { + result = vk::Result::eErrorOutOfDateKHR; + } + + if (result != vk::Result::eSuccess) + { + context.recycled_semaphores.push_back(acquire_semaphore); + } + else + { + assert(*image < context.per_frame.size()); + + // If we have outstanding fences for this swapchain image, wait for them to complete first. + // After begin frame returns, it is safe to reuse or delete resources which + // were used previously. + // + // We wait for fences which completes N frames earlier, so we do not stall, + // waiting for all GPU work to complete before this returns. + // Normally, this doesn't really block at all, + // since we're waiting for old frames to have been completed, but just in case. + if (context.per_frame[*image].queue_submit_fence) + { + result = context.device.waitForFences(context.per_frame[*image].queue_submit_fence, true, UINT64_MAX); + assert(result == vk::Result::eSuccess); + context.device.resetFences(context.per_frame[*image].queue_submit_fence); + } + + if (context.per_frame[*image].primary_command_pool) + { + context.device.resetCommandPool(context.per_frame[*image].primary_command_pool); + } + + // Recycle the old semaphore back into the semaphore manager. + vk::Semaphore old_semaphore = context.per_frame[*image].swapchain_acquire_semaphore; + + if (old_semaphore) + { + context.recycled_semaphores.push_back(old_semaphore); + } + + context.per_frame[*image].swapchain_acquire_semaphore = acquire_semaphore; + } + return result; +} + +/** + * @brief Finds a suitable memory type index for allocating memory. + * + * This function searches through the physical device's memory types to find one that matches + * the requirements specified by `type_filter` and `properties`. It's typically used when allocating + * memory for buffers or images, ensuring that the memory type supports the desired properties. + * + * @param physical_device The Vulkan physical device to query for memory properties. + * @param type_filter A bitmask specifying the acceptable memory types. + * This is usually obtained from `VkMemoryRequirements::memoryTypeBits`. + * @param properties A bitmask specifying the desired memory properties, + * such as `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` or `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`. + * @return The index of a suitable memory type. + * @throws std::runtime_error if no suitable memory type is found. + */ +uint32_t HPPHelloTriangleV13::find_memory_type(vk::PhysicalDevice physical_device, uint32_t type_filter, vk::MemoryPropertyFlags properties) +{ + // Structure to hold the physical device's memory properties + vk::PhysicalDeviceMemoryProperties mem_properties = physical_device.getMemoryProperties(); + + // Iterate over all memory types available on the physical device + for (uint32_t i = 0; i < mem_properties.memoryTypeCount; i++) + { + // Check if the current memory type is acceptable based on the type_filter + // The type_filter is a bitmask where each bit represents a memory type that is suitable + if (type_filter & (1 << i)) + { + // Check if the memory type has all the desired property flags + // properties is a bitmask of the required memory properties + if ((mem_properties.memoryTypes[i].propertyFlags & properties) == properties) + { + // Found a suitable memory type; return its index + return i; + } + } + } + + // If no suitable memory type was found, throw an exception + throw std::runtime_error("Failed to find suitable memory type."); +} + +/** + * @brief Initializes the Vulkan physical device and logical device. + */ +void HPPHelloTriangleV13::init_device() +{ + LOGI("Initializing Vulkan device."); + + std::vector device_extensions = context.gpu.enumerateDeviceExtensionProperties(); + + // Since this sample has visual output, the device needs to support the swapchain extension + std::vector required_device_extensions{VK_KHR_SWAPCHAIN_EXTENSION_NAME}; + + if (!validate_extensions(required_device_extensions, device_extensions)) + { + throw std::runtime_error("Required device extensions are missing"); + } + +#if (defined(VKB_ENABLE_PORTABILITY)) + // VK_KHR_portability_subset must be enabled if present in the implementation (e.g on macOS/iOS with beta extensions enabled) + if (std::ranges::any_of(device_extensions, + [](vk::ExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0; })) + { + required_device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + } +#endif + + // Query for Vulkan 1.3 features + auto supported_features_chain = + context.gpu.getFeatures2(); + + // Check if Physical device supports Vulkan 1.3 features + if (!supported_features_chain.get().dynamicRendering) + { + throw std::runtime_error("Dynamic Rendering feature is missing"); + } + + if (!supported_features_chain.get().synchronization2) + { + throw std::runtime_error("Synchronization2 feature is missing"); + } + + if (!supported_features_chain.get().extendedDynamicState) + { + throw std::runtime_error("Extended Dynamic State feature is missing"); + } + + // Enable only specific Vulkan 1.3 features + vk::StructureChain + enabled_features_chain = {{}, {.synchronization2 = true, .dynamicRendering = true}, {.extendedDynamicState = true}}; + + // Create the logical device + float queue_priority = 0.5f; + + // Create one queue + vk::DeviceQueueCreateInfo queue_info{.queueFamilyIndex = static_cast(context.graphics_queue_index), + .queueCount = 1, + .pQueuePriorities = &queue_priority}; + + vk::DeviceCreateInfo device_info{.pNext = &enabled_features_chain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &queue_info, + .enabledExtensionCount = static_cast(required_device_extensions.size()), + .ppEnabledExtensionNames = required_device_extensions.data()}; + + context.device = context.gpu.createDevice(device_info); + + // initialize function pointers for device + VULKAN_HPP_DEFAULT_DISPATCHER.init(context.device); + + context.queue = context.device.getQueue(context.graphics_queue_index, 0); +} + +/** + * @brief Initializes the Vulkan instance. + */ +void HPPHelloTriangleV13::init_instance() +{ + LOGI("Initializing Vulkan instance."); + +#if defined(_HPP_VULKAN_LIBRARY) + static vk::detail::DynamicLoader dl(_HPP_VULKAN_LIBRARY); +#else + static vk::detail::DynamicLoader dl; +#endif + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); + VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); + + std::vector available_instance_extensions = vk::enumerateInstanceExtensionProperties(); + + std::vector required_instance_extensions{VK_KHR_SURFACE_EXTENSION_NAME}; + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + bool has_debug_utils = std::ranges::any_of( + available_instance_extensions, + [](auto const &ep) { return strncmp(ep.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME, strlen(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) == 0; }); + if (has_debug_utils) + { + required_instance_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + else + { + LOGW("{} is not available; disabling debug utils messenger", VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } +#endif + +#if (defined(VKB_ENABLE_PORTABILITY)) + required_instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + bool portability_enumeration_available = std::ranges::any_of( + available_instance_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; }); + if (portability_enumeration_available) + { + required_instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + } +#endif + +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + required_instance_extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_WIN32_KHR) + required_instance_extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_METAL_EXT) + required_instance_extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_XCB_KHR) + required_instance_extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_XLIB_KHR) + required_instance_extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) + required_instance_extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); +#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) + required_instance_extensions.push_back(VK_KHR_DISPLAY_EXTENSION_NAME); +#else +# pragma error Platform not supported +#endif + + if (!validate_extensions(required_instance_extensions, available_instance_extensions)) + { + throw std::runtime_error("Required instance extensions are missing."); + } + + std::vector requested_instance_layers{}; + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + char const *validationLayer = "VK_LAYER_KHRONOS_validation"; + + std::vector supported_instance_layers = vk::enumerateInstanceLayerProperties(); + + if (std::ranges::any_of(supported_instance_layers, [&validationLayer](auto const &lp) { return strcmp(lp.layerName, validationLayer) == 0; })) + { + requested_instance_layers.push_back(validationLayer); + LOGI("Enabled Validation Layer {}", validationLayer); + } + else + { + LOGW("Validation Layer {} is not available", validationLayer); + } +#endif + + vk::ApplicationInfo app{.pApplicationName = "Hello Triangle V1.3", .pEngineName = "Vulkan Samples", .apiVersion = VK_MAKE_VERSION(1, 3, 0)}; + + vk::InstanceCreateInfo instance_info{.pApplicationInfo = &app, + .enabledLayerCount = static_cast(requested_instance_layers.size()), + .ppEnabledLayerNames = requested_instance_layers.data(), + .enabledExtensionCount = static_cast(required_instance_extensions.size()), + .ppEnabledExtensionNames = required_instance_extensions.data()}; + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + vk::DebugUtilsMessengerCreateInfoEXT debug_messenger_create_info; + if (has_debug_utils) + { + debug_messenger_create_info.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning; + debug_messenger_create_info.messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation; + debug_messenger_create_info.pfnUserCallback = debug_callback; + + instance_info.pNext = &debug_messenger_create_info; + } +#endif + +#if defined(VKB_ENABLE_PORTABILITY) + if (portability_enumeration_available) + { + instance_info.flags |= vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR; + } +#endif + + // Create the Vulkan instance + context.instance = vk::createInstance(instance_info); + + // initialize function pointers for instance + VULKAN_HPP_DEFAULT_DISPATCHER.init(context.instance); + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + if (has_debug_utils) + { + context.debug_callback = context.instance.createDebugUtilsMessengerEXT(debug_messenger_create_info); + } +#endif + +#if defined(VK_USE_PLATFORM_DISPLAY_KHR) || defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(VK_USE_PLATFORM_METAL_EXT) + // we need some additional initializing for this platform! + if (volkInitialize()) + { + throw std::runtime_error("Failed to initialize volk."); + } + volkLoadInstance(context.instance); +#endif +} + +/** + * @brief Initializes per frame data. + * @param per_frame The data of a frame. + */ +void HPPHelloTriangleV13::init_per_frame(PerFrame &per_frame) +{ + per_frame.queue_submit_fence = context.device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled}); + + vk::CommandPoolCreateInfo cmd_pool_info{.flags = vk::CommandPoolCreateFlagBits::eTransient, + .queueFamilyIndex = static_cast(context.graphics_queue_index)}; + per_frame.primary_command_pool = context.device.createCommandPool(cmd_pool_info); + + vk::CommandBufferAllocateInfo cmd_buf_info{.commandPool = per_frame.primary_command_pool, + .level = vk::CommandBufferLevel::ePrimary, + .commandBufferCount = 1}; + per_frame.primary_command_buffer = context.device.allocateCommandBuffers(cmd_buf_info)[0]; +} + +/** + * @brief Initializes the Vulkan pipeline. + */ +void HPPHelloTriangleV13::init_pipeline() +{ + // Create a blank pipeline layout. + // We are not binding any resources to the pipeline in this first sample. + context.pipeline_layout = context.device.createPipelineLayout({}); + + // Define the vertex input binding description + vk::VertexInputBindingDescription binding_description{.binding = 0, .stride = sizeof(Vertex), .inputRate = vk::VertexInputRate::eVertex}; + + // Define the vertex input attribute descriptions + std::array attribute_descriptions = {{ + {.location = 0, .binding = 0, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(Vertex, position)}, // position + {.location = 1, .binding = 0, .format = vk::Format::eR32G32B32Sfloat, .offset = offsetof(Vertex, color)} // color + }}; + + // Create the vertex input state + vk::PipelineVertexInputStateCreateInfo vertex_input{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &binding_description, + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; + + // Specify we will use triangle lists to draw geometry. + vk::PipelineInputAssemblyStateCreateInfo input_assembly{.topology = vk::PrimitiveTopology::eTriangleList}; + + // Specify rasterization state. + vk::PipelineRasterizationStateCreateInfo raster{.polygonMode = vk::PolygonMode::eFill, .lineWidth = 1.0f}; + + // Specify that these states will be dynamic, i.e. not part of pipeline state object. + std::vector dynamic_states = { + vk::DynamicState::eViewport, vk::DynamicState::eScissor, vk::DynamicState::eCullMode, vk::DynamicState::eFrontFace, vk::DynamicState::ePrimitiveTopology}; + + // Our attachment will write to all color channels, but no blending is enabled. + vk::PipelineColorBlendAttachmentState blend_attachment{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; + + vk::PipelineColorBlendStateCreateInfo blend{.attachmentCount = 1, .pAttachments = &blend_attachment}; + + // We will have one viewport and scissor box. + vk::PipelineViewportStateCreateInfo viewport{.viewportCount = 1, .scissorCount = 1}; + + // Disable all depth testing. + vk::PipelineDepthStencilStateCreateInfo depth_stencil{.depthCompareOp = vk::CompareOp::eAlways}; + + // No multisampling. + vk::PipelineMultisampleStateCreateInfo multisample{.rasterizationSamples = vk::SampleCountFlagBits::e1}; + + vk::PipelineDynamicStateCreateInfo dynamic_state_info{.dynamicStateCount = static_cast(dynamic_states.size()), + .pDynamicStates = dynamic_states.data()}; + + // Load our SPIR-V shaders. + + // Samples support different shading languages, all of which are offline compiled to SPIR-V, the shader format that Vulkan uses. + // The shading language to load for can be selected via command line + std::string shader_folder{""}; + switch (get_shading_language()) + { + case vkb::ShadingLanguage::HLSL: + shader_folder = "hlsl"; + break; + case vkb::ShadingLanguage::SLANG: + shader_folder = "slang"; + break; + default: + shader_folder = "glsl"; + } + + std::array shader_stages = {{ + {.stage = vk::ShaderStageFlagBits::eVertex, + .module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.vert.spv", vk::ShaderStageFlagBits::eVertex), + .pName = "main"}, // Vertex shader stage + {.stage = vk::ShaderStageFlagBits::eFragment, + .module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.frag.spv", vk::ShaderStageFlagBits::eFragment), + .pName = "main"} // Fragment shader stage + }}; + + // Pipeline rendering info (for dynamic rendering). + vk::PipelineRenderingCreateInfo pipeline_rendering_info{.colorAttachmentCount = 1, .pColorAttachmentFormats = &context.swapchain_dimensions.format}; + + // Create the graphics pipeline. + vk::GraphicsPipelineCreateInfo pipeline_create_info{ + .pNext = &pipeline_rendering_info, + .stageCount = static_cast(shader_stages.size()), + .pStages = shader_stages.data(), + .pVertexInputState = &vertex_input, + .pInputAssemblyState = &input_assembly, + .pViewportState = &viewport, + .pRasterizationState = &raster, + .pMultisampleState = &multisample, + .pDepthStencilState = &depth_stencil, + .pColorBlendState = &blend, + .pDynamicState = &dynamic_state_info, + .layout = context.pipeline_layout, // We need to specify the pipeline layout description up front as well. + .renderPass = VK_NULL_HANDLE, // Since we are using dynamic rendering this will set as null + .subpass = 0, + }; + + vk::Result result; + std::tie(result, context.pipeline) = context.device.createGraphicsPipeline(nullptr, pipeline_create_info); + assert(result == vk::Result::eSuccess); + + // Pipeline is baked, we can delete the shader modules now. + for (auto &shader_stage : shader_stages) + { + context.device.destroyShaderModule(shader_stage.module); + } +} + +/** + * @brief Initializes the Vulkan swapchain. + */ +void HPPHelloTriangleV13::init_swapchain() +{ + vk::SurfaceCapabilitiesKHR surface_properties = context.gpu.getSurfaceCapabilitiesKHR(context.surface); + + vk::SurfaceFormatKHR format = vkb::common::select_surface_format(context.gpu, context.surface); + + vk::Extent2D swapchain_size; + if (surface_properties.currentExtent.width == 0xFFFFFFFF) + { + swapchain_size.width = context.swapchain_dimensions.width; + swapchain_size.height = context.swapchain_dimensions.height; + } + else + { + swapchain_size = surface_properties.currentExtent; + } + + // FIFO must be supported by all implementations. + vk::PresentModeKHR swapchain_present_mode = vk::PresentModeKHR::eFifo; + + // Determine the number of VkImage's to use in the swapchain. + // Ideally, we desire to own 1 image at a time, the rest of the images can + // either be rendered to and/or being queued up for display. + uint32_t desired_swapchain_images = surface_properties.minImageCount + 1; + if ((surface_properties.maxImageCount > 0) && (desired_swapchain_images > surface_properties.maxImageCount)) + { + // Application must settle for fewer images than desired. + desired_swapchain_images = surface_properties.maxImageCount; + } + + // Figure out a suitable surface transform. + vk::SurfaceTransformFlagBitsKHR pre_transform; + if (surface_properties.supportedTransforms & vk::SurfaceTransformFlagBitsKHR::eIdentity) + { + pre_transform = vk::SurfaceTransformFlagBitsKHR::eIdentity; + } + else + { + pre_transform = surface_properties.currentTransform; + } + + vk::SwapchainKHR old_swapchain = context.swapchain; + + // one bitmask needs to be set according to the priority of presentation engine + vk::CompositeAlphaFlagBitsKHR composite = vk::CompositeAlphaFlagBitsKHR::eOpaque; + if (surface_properties.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::eOpaque) + { + composite = vk::CompositeAlphaFlagBitsKHR::eOpaque; + } + else if (surface_properties.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::eInherit) + { + composite = vk::CompositeAlphaFlagBitsKHR::eInherit; + } + else if (surface_properties.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::ePreMultiplied) + { + composite = vk::CompositeAlphaFlagBitsKHR::ePreMultiplied; + } + else if (surface_properties.supportedCompositeAlpha & vk::CompositeAlphaFlagBitsKHR::ePostMultiplied) + { + composite = vk::CompositeAlphaFlagBitsKHR::ePostMultiplied; + } + + vk::SwapchainCreateInfoKHR info{ + .surface = context.surface, // The surface onto which images will be presented + .minImageCount = desired_swapchain_images, // Minimum number of images in the swapchain (number of buffers) + .imageFormat = format.format, // Format of the swapchain images (e.g., VK_FORMAT_B8G8R8A8_SRGB) + .imageColorSpace = format.colorSpace, // Color space of the images (e.g., VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) + .imageExtent = swapchain_size, // Resolution of the swapchain images (width and height) + .imageArrayLayers = 1, // Number of layers in each image (usually 1 unless stereoscopic) + .imageUsage = vk::ImageUsageFlagBits::eColorAttachment, // How the images will be used (as color attachments) + .imageSharingMode = vk::SharingMode::eExclusive, // Access mode of the images (exclusive to one queue family) + .preTransform = pre_transform, // Transform to apply to images (e.g., rotation) + .compositeAlpha = composite, // Alpha blending to apply (e.g., opaque, pre-multiplied) + .presentMode = swapchain_present_mode, // Presentation mode (e.g., vsync settings) + .clipped = true, // Whether to clip obscured pixels (improves performance) + .oldSwapchain = old_swapchain // Handle to the old swapchain, if replacing an existing one + }; + + context.swapchain = context.device.createSwapchainKHR(info); + + if (old_swapchain) + { + for (vk::ImageView image_view : context.swapchain_image_views) + { + context.device.destroyImageView(image_view); + } + context.swapchain_image_views.clear(); + + for (auto &per_frame : context.per_frame) + { + teardown_per_frame(per_frame); + } + + context.device.destroySwapchainKHR(old_swapchain); + } + + context.swapchain_dimensions = {swapchain_size.width, swapchain_size.height, format.format}; + + /// The swapchain images. + context.swapchain_images = context.device.getSwapchainImagesKHR(context.swapchain); + + // Initialize per-frame resources. + // Every swapchain image has its own command pool and fence manager. + // This makes it very easy to keep track of when we can reset command buffers and such. + context.per_frame.clear(); + context.per_frame.resize(context.swapchain_images.size()); + + for (auto &per_frame : context.per_frame) + { + init_per_frame(per_frame); + } + + for (auto const &swapchain_image : context.swapchain_images) + { + // Create an image view which we can render into. + vk::ImageViewCreateInfo view_info{ + .image = swapchain_image, + .viewType = vk::ImageViewType::e2D, + .format = context.swapchain_dimensions.format, + .subresourceRange = {.aspectMask = vk::ImageAspectFlagBits::eColor, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, .layerCount = 1}}; + + context.swapchain_image_views.push_back(context.device.createImageView(view_info)); + } +} + +/** + * @brief Initializes the vertex buffer by creating it, allocating memory, binding the memory, and uploading vertex data. + * @note This function must be called after the Vulkan device has been initialized. + * @throws std::runtime_error if any Vulkan operation fails. + */ +void HPPHelloTriangleV13::init_vertex_buffer() +{ + vk::DeviceSize buffer_size = sizeof(vertices[0]) * vertices.size(); + + // Create the vertex buffer + vk::BufferCreateInfo vertex_buffer_info{.size = buffer_size, .usage = vk::BufferUsageFlagBits::eVertexBuffer, .sharingMode = vk::SharingMode::eExclusive}; + + context.vertex_buffer = context.device.createBuffer(vertex_buffer_info); + + // Get memory requirements + vk::MemoryRequirements memory_requirements = context.device.getBufferMemoryRequirements(context.vertex_buffer); + + // Allocate memory for the buffer + vk::MemoryAllocateInfo alloc_info{ + .allocationSize = memory_requirements.size, + .memoryTypeIndex = + find_memory_type(context.gpu, memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent)}; + + context.vertex_buffer_memory = context.device.allocateMemory(alloc_info); + + // Bind the buffer with the allocated memory + context.device.bindBufferMemory(context.vertex_buffer, context.vertex_buffer_memory, 0); + + // Map the memory and copy the vertex data + void *data = context.device.mapMemory(context.vertex_buffer_memory, 0, buffer_size); + memcpy(data, vertices.data(), static_cast(buffer_size)); + context.device.unmapMemory(context.vertex_buffer_memory); +} + +/** + * @brief Helper function to load a shader module. + * @param path The path for the shader (relative to the assets directory). + * @param shader_stage The shader stage flag specifying the type of shader (e.g., vk::ShaderStageFlagBits::eVertex). + * @returns A VkShaderModule handle. Aborts execution if shader creation fails. + */ +vk::ShaderModule HPPHelloTriangleV13::load_shader_module(const std::string &path, vk::ShaderStageFlagBits shader_stage) +{ + auto spirv = vkb::fs::read_shader_binary_u32(path); + + vk::ShaderModuleCreateInfo module_info{.codeSize = spirv.size() * sizeof(uint32_t), .pCode = spirv.data()}; + + return context.device.createShaderModule(module_info); +} + +/** + * @brief Presents an image to the swapchain. + * @param index The swapchain index previously obtained from @ref acquire_next_swapchain_image. + * @returns Vulkan result code + */ +vk::Result HPPHelloTriangleV13::present_image(uint32_t index) +{ + vk::PresentInfoKHR present{ + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context.per_frame[index].swapchain_release_semaphore, + .swapchainCount = 1, + .pSwapchains = &context.swapchain, + .pImageIndices = &index, + }; + + // Present swapchain image + vk::Result result; + try + { + result = context.queue.presentKHR(present); + } + catch (vk::OutOfDateKHRError &) + { + result = vk::Result::eErrorOutOfDateKHR; + } + return result; +} + +/** + * @brief Renders a triangle to the specified swapchain image. + * @param swapchain_index The swapchain index for the image being rendered. + */ +void HPPHelloTriangleV13::render_triangle(uint32_t swapchain_index) +{ + // Allocate or re-use a primary command buffer. + vk::CommandBuffer cmd = context.per_frame[swapchain_index].primary_command_buffer; + + // We will only submit this once before it's recycled. + vk::CommandBufferBeginInfo begin_info{.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit}; + + // Begin command recording + cmd.begin(begin_info); + + // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL + transition_image_layout(cmd, + context.swapchain_images[swapchain_index], + vk::ImageLayout::eUndefined, + vk::ImageLayout::eColorAttachmentOptimal, + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + ); + + // Set clear color values. + vk::ClearValue clear_value; + clear_value.color = std::array({{0.01f, 0.01f, 0.033f, 1.0f}}); + + // Set up the rendering attachment info + vk::RenderingAttachmentInfo color_attachment{.imageView = context.swapchain_image_views[swapchain_index], + .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + .clearValue = clear_value}; + + // Begin rendering + vk::RenderingInfo rendering_info{ + .renderArea = { // Initialize the nested `VkRect2D` structure + .offset = {0, 0}, // Initialize the `VkOffset2D` inside `renderArea` + .extent = { // Initialize the `VkExtent2D` inside `renderArea` + .width = context.swapchain_dimensions.width, + .height = context.swapchain_dimensions.height}}, + .layerCount = 1, + .colorAttachmentCount = 1, + .pColorAttachments = &color_attachment}; + + cmd.beginRendering(rendering_info); + + // Bind the graphics pipeline. + cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, context.pipeline); + + // Set dynamic states + + // Set viewport dynamically + vk::Viewport vp{.width = static_cast(context.swapchain_dimensions.width), + .height = static_cast(context.swapchain_dimensions.height), + .minDepth = 0.0f, + .maxDepth = 1.0f}; + + cmd.setViewport(0, vp); + + // Set scissor dynamically + vk::Rect2D scissor{.extent = {.width = context.swapchain_dimensions.width, .height = context.swapchain_dimensions.height}}; + + cmd.setScissor(0, scissor); + + // Since we declared VK_DYNAMIC_STATE_CULL_MODE as dynamic in the pipeline, + // we need to set the cull mode here. VK_CULL_MODE_NONE disables face culling, + // meaning both front and back faces will be rendered. + cmd.setCullMode(vk::CullModeFlagBits::eNone); + + // Since we declared VK_DYNAMIC_STATE_FRONT_FACE as dynamic, + // we need to specify the winding order considered as the front face. + // VK_FRONT_FACE_CLOCKWISE indicates that vertices defined in clockwise order + // are considered front-facing. + cmd.setFrontFace(vk::FrontFace::eClockwise); + + // Since we declared VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY as dynamic, + // we need to set the primitive topology here. VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST + // tells Vulkan that the input vertex data should be interpreted as a list of triangles. + cmd.setPrimitiveTopology(vk::PrimitiveTopology::eTriangleList); + + // Bind the vertex buffer + cmd.bindVertexBuffers(0, context.vertex_buffer, {0}); + + // Draw three vertices with one instance. + cmd.draw(vertices.size(), 1, 0, 0); + + // Complete rendering. + cmd.endRendering(); + + // After rendering , transition the swapchain image to PRESENT_SRC + transition_image_layout(cmd, + context.swapchain_images[swapchain_index], + vk::ImageLayout::eColorAttachmentOptimal, + vk::ImageLayout::ePresentSrcKHR, + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + ); + + // Complete the command buffer. + cmd.end(); + + // Submit it to the queue with a release semaphore. + if (!context.per_frame[swapchain_index].swapchain_release_semaphore) + { + context.per_frame[swapchain_index].swapchain_release_semaphore = context.device.createSemaphore({}); + } + + // Using TopOfPipe here to ensure that the command buffer does not begin executing any pipeline stages + // (including the layout transition) until the swapchain image is actually acquired (signaled by the semaphore). + // This prevents the GPU from starting operations too early and guarantees that the image is ready + // before any rendering commands run. + vk::PipelineStageFlags wait_stage = {vk::PipelineStageFlagBits::eTopOfPipe}; + + vk::SubmitInfo info{.waitSemaphoreCount = 1, + .pWaitSemaphores = &context.per_frame[swapchain_index].swapchain_acquire_semaphore, + .pWaitDstStageMask = &wait_stage, + .commandBufferCount = 1, + .pCommandBuffers = &cmd, + .signalSemaphoreCount = 1, + .pSignalSemaphores = &context.per_frame[swapchain_index].swapchain_release_semaphore}; + + // Submit command buffer to graphics queue + context.queue.submit(info, context.per_frame[swapchain_index].queue_submit_fence); +} + +/** + * @brief Tears down the frame data. + * @param per_frame The data of a frame. + */ +void HPPHelloTriangleV13::teardown_per_frame(PerFrame &per_frame) +{ + if (per_frame.queue_submit_fence) + { + context.device.destroyFence(per_frame.queue_submit_fence); + } + + if (per_frame.primary_command_buffer) + { + context.device.freeCommandBuffers(per_frame.primary_command_pool, per_frame.primary_command_buffer); + } + + if (per_frame.primary_command_pool) + { + context.device.destroyCommandPool(per_frame.primary_command_pool); + } + + if (per_frame.swapchain_acquire_semaphore) + { + context.device.destroySemaphore(per_frame.swapchain_acquire_semaphore); + } + + if (per_frame.swapchain_release_semaphore) + { + context.device.destroySemaphore(per_frame.swapchain_release_semaphore); + } +} + +/** + * @brief Transitions an image layout in a Vulkan command buffer. + * @param cmd The command buffer to record the barrier into. + * @param image The Vulkan image to transition. + * @param oldLayout The current layout of the image. + * @param newLayout The desired new layout of the image. + * @param srcAccessMask The source access mask, specifying which access types are being transitioned from. + * @param dstAccessMask The destination access mask, specifying which access types are being transitioned to. + * @param srcStage The pipeline stage that must happen before the transition. + * @param dstStage The pipeline stage that must happen after the transition. + */ +void HPPHelloTriangleV13::transition_image_layout(vk::CommandBuffer cmd, + vk::Image image, + vk::ImageLayout oldLayout, + vk::ImageLayout newLayout, + vk::AccessFlags2 srcAccessMask, + vk::AccessFlags2 dstAccessMask, + vk::PipelineStageFlags2 srcStage, + vk::PipelineStageFlags2 dstStage) +{ + // Initialize the VkImageMemoryBarrier2 structure + vk::ImageMemoryBarrier2 image_barrier{ + // Specify the pipeline stages and access masks for the barrier + .srcStageMask = srcStage, // Source pipeline stage mask + .srcAccessMask = srcAccessMask, // Source access mask + .dstStageMask = dstStage, // Destination pipeline stage mask + .dstAccessMask = dstAccessMask, // Destination access mask + + // Specify the old and new layouts of the image + .oldLayout = oldLayout, // Current layout of the image + .newLayout = newLayout, // Target layout of the image + + // We are not changing the ownership between queues + .srcQueueFamilyIndex = vk::QueueFamilyIgnored, + .dstQueueFamilyIndex = vk::QueueFamilyIgnored, + + // Specify the image to be affected by this barrier + .image = image, + + // Define the subresource range (which parts of the image are affected) + .subresourceRange = { + .aspectMask = vk::ImageAspectFlagBits::eColor, // Affects the color aspect of the image + .baseMipLevel = 0, // Start at mip level 0 + .levelCount = 1, // Number of mip levels affected + .baseArrayLayer = 0, // Start at array layer 0 + .layerCount = 1 // Number of array layers affected + }}; + + // Initialize the VkDependencyInfo structure + vk::DependencyInfo dependency_info{ + .dependencyFlags = {}, // No special dependency flags + .imageMemoryBarrierCount = 1, // Number of image memory barriers + .pImageMemoryBarriers = &image_barrier // Pointer to the image memory barrier(s) + }; + + // Record the pipeline barrier into the command buffer + cmd.pipelineBarrier2(dependency_info); +} + +/** + * @brief Validates a list of required extensions, comparing it with the available ones. + * + * @param required A vector containing required extension names. + * @param available A VkExtensionProperties object containing available extensions. + * @return true if all required extensions are available + * @return false otherwise + */ +bool HPPHelloTriangleV13::validate_extensions(const std::vector &required, + const std::vector &available) +{ + return std::ranges::all_of(required, + [&available](auto const &extension_name) { + bool found = std::ranges::any_of( + available, [&extension_name](auto const &ep) { return strcmp(ep.extensionName, extension_name) == 0; }); + if (!found) + { + // Output an error message for the missing extension + LOGE("Error: Required extension not found: {}", extension_name); + } + return found; + }); +} + +std::unique_ptr create_hpp_hello_triangle_1_3() +{ + return std::make_unique(); +} diff --git a/samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.h b/samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.h new file mode 100644 index 0000000000..9ad6926a64 --- /dev/null +++ b/samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.h @@ -0,0 +1,170 @@ +/* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "platform/application.h" +#include "platform/window.h" + +#include + +/** + * @brief A self-contained (minimal use of framework) sample that illustrates + * the rendering of a triangle + */ +class HPPHelloTriangleV13 : public vkb::Application +{ + // Define the Vertex structure + struct Vertex + { + glm::vec2 position; + glm::vec3 color; + }; + + // Define the vertex data + const std::vector vertices = { + {{0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, // Vertex 1: Red + {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, // Vertex 2: Green + {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}} // Vertex 3: Blue + }; + + /** + * @brief Swapchain state + */ + struct SwapchainDimensions + { + /// Width of the swapchain. + uint32_t width = 0; + + /// Height of the swapchain. + uint32_t height = 0; + + /// Pixel format of the swapchain. + vk::Format format = vk::Format::eUndefined; + }; + + /** + * @brief Per-frame data + */ + struct PerFrame + { + vk::Fence queue_submit_fence = nullptr; + vk::CommandPool primary_command_pool = nullptr; + vk::CommandBuffer primary_command_buffer = nullptr; + vk::Semaphore swapchain_acquire_semaphore = nullptr; + vk::Semaphore swapchain_release_semaphore = nullptr; + }; + + /** + * @brief Vulkan objects and global state + */ + struct Context + { + /// The Vulkan instance. + vk::Instance instance = nullptr; + + /// The Vulkan physical device. + vk::PhysicalDevice gpu = nullptr; + + /// The Vulkan device. + vk::Device device = nullptr; + + /// The Vulkan device queue. + vk::Queue queue = nullptr; + + /// The swapchain. + vk::SwapchainKHR swapchain = nullptr; + + /// The swapchain dimensions. + SwapchainDimensions swapchain_dimensions; + + /// The surface we will render to. + vk::SurfaceKHR surface = nullptr; + + /// The queue family index where graphics work will be submitted. + int32_t graphics_queue_index = -1; + + /// The image view for each swapchain image. + std::vector swapchain_image_views; + + /// The handles to the images in the swapchain. + std::vector swapchain_images; + + /// The graphics pipeline. + vk::Pipeline pipeline = nullptr; + + /** + * The pipeline layout for resources. + * Not used in this sample, but we still need to provide a dummy one. + */ + vk::PipelineLayout pipeline_layout = nullptr; + + /// The debug utility messenger callback. + vk::DebugUtilsMessengerEXT debug_callback = nullptr; + + /// A set of semaphores that can be reused. + std::vector recycled_semaphores; + + /// A set of per-frame data. + std::vector per_frame; + + /// The Vulkan buffer object that holds the vertex data for the triangle. + vk::Buffer vertex_buffer = nullptr; + + /// The device memory allocated for the vertex buffer. + vk::DeviceMemory vertex_buffer_memory = nullptr; + }; + + public: + HPPHelloTriangleV13() = default; + + virtual ~HPPHelloTriangleV13(); + + private: + // from vkb::Application + virtual bool prepare(const vkb::ApplicationOptions &options) override; + virtual bool resize(const uint32_t width, const uint32_t height) override; + virtual void update(float delta_time) override; + + vk::Result acquire_next_swapchain_image(uint32_t *image); + uint32_t find_memory_type(vk::PhysicalDevice physical_device, uint32_t type_filter, vk::MemoryPropertyFlags properties); + void init_device(); + void init_instance(); + void init_per_frame(PerFrame &per_frame); + void init_pipeline(); + void init_swapchain(); + void init_vertex_buffer(); + vk::ShaderModule load_shader_module(const std::string &path, vk::ShaderStageFlagBits shader_stage); + vk::Result present_image(uint32_t index); + void render_triangle(uint32_t swapchain_index); + void select_physical_device_and_surface(vkb::Window *window); + void teardown_per_frame(PerFrame &per_frame); + void transition_image_layout(vk::CommandBuffer cmd, + vk::Image image, + vk::ImageLayout oldLayout, + vk::ImageLayout newLayout, + vk::AccessFlags2 srcAccessMask, + vk::AccessFlags2 dstAccessMask, + vk::PipelineStageFlags2 srcStage, + vk::PipelineStageFlags2 dstStage); + bool validate_extensions(const std::vector &required, const std::vector &available); + + private: + Context context; +}; + +std::unique_ptr create_hpp_hello_triangle_1_3(); diff --git a/samples/api/hpp_hlsl_shaders/README.adoc b/samples/api/hpp_hlsl_shaders/README.adoc deleted file mode 100644 index 3bef69ddf0..0000000000 --- a/samples/api/hpp_hlsl_shaders/README.adoc +++ /dev/null @@ -1,136 +0,0 @@ -//// -- Copyright (c) 2022-2023, The Khronos Group -- -- SPDX-License-Identifier: Apache-2.0 -- -- Licensed under the Apache License, Version 2.0 the "License"; -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. -- -//// -= Using HLSL shaders in Vulkan with Vulkan-Hpp - -ifdef::site-gen-antora[] -TIP: The source for this sample can be found in the https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/api/hpp_hlsl_shaders[Khronos Vulkan samples github repository]. -endif::[] - -NOTE: This is a transcoded version of the API sample that illustrates the usage of the C{pp} bindings of vulkan provided by vulkan.hpp. - -This tutorial, along with the accompanying example code, shows how to use shaders written in the High Level Shading Language (HLSL) in Vulkan at runtime, using Vulkan-Hpp. - -Vulkan does not directly consume shaders in a human-readable text format, but instead uses SPIR-V as an intermediate representation. -This opens the option to use shader languages other than e.g. -GLSL, as long as they can target the Vulkan SPIR-V environment. -One such language is Microsoft's HLSL, which is the shading language for DirectX. - -Details on how HLSL fits into the Vulkan ecosystem can be found in this https://github.com/KhronosGroup/Vulkan-Guide/blob/main/chapters/hlsl.adoc[Vulkan guide chapter]. - -== HLSL Syntax - -HLSL is a bit more object-oriented than GLSL, but the general structure of a shader is similar Vulkan-specific functions are marked with the https://github.com/microsoft/DirectXShaderCompiler/blob/main/docs/SPIR-V.rst#the-implicit-vk-namespace[implicit `vk` namespace]: - -[,hlsl] ----- -struct VSInput -{ -[[vk::location(0)]] float3 Pos : POSITION0; -[[vk::location(1)]] float2 UV : TEXCOORD0; -[[vk::location(2)]] float3 Normal : NORMAL0; -}; - -struct UBO -{ - float4x4 projection; - float4x4 model; - float4 viewPos; -}; - -cbuffer ubo : register(b0, space0) { UBO ubo; } - -struct VSOutput -{ - float4 Pos : SV_POSITION; -[[vk::location(0)]] float2 UV : TEXCOORD0; -}; - -VSOutput main(VSInput input) -{ - VSOutput output = (VSOutput)0; - output.UV = input.UV; - output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); - return output; -} ----- - -== Glslang - -The Vulkan samples use https://github.com/KhronosGroup/glslang[Glslang] for converting shaders to SPIR-V at runtime. -Glslang is the reference GLSL validator and translator, but also supports HLSL as an input language. - -HLSL support in Glslang limited though and for a more feature complete HLSL to SPIR-V compiler, you can also use the https://github.com/microsoft/DirectXShaderCompiler[DirectX shader compiler]. - -For the basic shader in this tutorial, we can go with Glslang though, as it supports all features we require. - -== Converting HLSL to SPIR-V - -Loading HLSL with Glslang is similar to loading GLSL, but requires different parameters. -Here are the relevant parts that differ from loading HLSL from the `HlslShaders::load_hlsl_shader` function of the sample: - -[,cpp] ----- -std::vector spirvCode; - -// Use HLSL parsing rules and semantics (EShMsgReadHlsl) -EShMessages messages = static_cast(EShMsgReadHlsl | ...); -... - -// Language needs to be selected based on the shader stage -EShLanguage language = EShLangVertex; -glslang::TShader shader(language); -... - -// Set the source language to HLSL -shader.setEnvInput(glslang::EShSourceHlsl, language, glslang::EShClientVulkan, 1); -... - -// Parse the HLSL input -if (!shader.parse(&glslang::DefaultTBuiltInResource, 100, false, messages)) -{ - ... -} - -// Add shader to new program object. -glslang::TProgram program; -program.addShader(&shader); - -// Link program. -if (!program.link(messages)) -{ - ... -} -... - -// Translate to SPIRV -glslang::TIntermediate *intermediate = program.getIntermediate(language); -... -glslang::GlslangToSpv(*intermediate, spirvCode, &logger); -... ----- - -=== Creating the shader module - -The call to `glslang::GlslangToSpv` will generate the SPIR-V bytecode that we can use to create the Vulkan shader module from: - -[,cpp] ----- -vk::ShaderModuleCreateInfo module_create_info({}, spirvCode); -vk::ShaderModule shader_module = get_device()->get_handle().createShaderModule(module_create_info); ----- diff --git a/samples/api/hpp_hlsl_shaders/hpp_hlsl_shaders.cpp b/samples/api/hpp_hlsl_shaders/hpp_hlsl_shaders.cpp deleted file mode 100644 index 8b2b0ef562..0000000000 --- a/samples/api/hpp_hlsl_shaders/hpp_hlsl_shaders.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Using HLSL shaders in Vulkan with the glslang library, using vulkan.hpp - */ - -#include "hpp_hlsl_shaders.h" - -#include -#include - -HPPHlslShaders::HPPHlslShaders() -{ - title = "HPP HLSL shaders"; - - zoom = -2.0f; - rotation = {0.0f, 0.0f, 0.0f}; -} - -HPPHlslShaders::~HPPHlslShaders() -{ - if (has_device() && get_device().get_handle()) - { - // Clean up used Vulkan resources - // Note : Inherited destructor cleans up resources stored in base class - - vk::Device device = get_device().get_handle(); - device.destroyPipeline(pipeline); - device.destroyPipelineLayout(pipeline_layout); - device.destroyDescriptorSetLayout(base_descriptor_set_layout); - device.destroyDescriptorSetLayout(sampler_descriptor_set_layout); - // Delete the implicitly created sampler for the texture loaded via the framework - device.destroySampler(texture.sampler); - } -} - -bool HPPHlslShaders::prepare(const vkb::ApplicationOptions &options) -{ - assert(!prepared); - - if (HPPApiVulkanSample::prepare(options)) - { - load_assets(); - generate_quad(); - - // Vertex shader uniform buffer block - uniform_buffer_vs = std::make_unique(get_device(), - sizeof(ubo_vs), - vk::BufferUsageFlagBits::eUniformBuffer, - VMA_MEMORY_USAGE_CPU_TO_GPU); - update_uniform_buffers(); - - // We separate the descriptor sets for the uniform buffer + image and samplers, so we don't need to duplicate the descriptors for the former - base_descriptor_set_layout = create_base_descriptor_set_layout(); - sampler_descriptor_set_layout = create_sampler_descriptor_set_layout(); - - pipeline_layout = create_pipeline_layout(); - shader_modules.push_back(create_shader_module("hlsl_shaders/hlsl_shader.vert", vk::ShaderStageFlagBits::eVertex)); - shader_modules.push_back(create_shader_module("hlsl_shaders/hlsl_shader.frag", vk::ShaderStageFlagBits::eFragment)); - pipeline = create_pipeline(); - descriptor_pool = create_descriptor_pool(); - base_descriptor_set = vkb::common::allocate_descriptor_set(get_device().get_handle(), descriptor_pool, base_descriptor_set_layout); - update_descriptor_sets(); - build_command_buffers(); - - prepared = true; - } - - return prepared; -} - -// Enable physical device features required for this example -void HPPHlslShaders::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) -{ - // Enable anisotropic filtering if supported - if (gpu.get_features().samplerAnisotropy) - { - gpu.get_mutable_requested_features().samplerAnisotropy = true; - } -} - -void HPPHlslShaders::build_command_buffers() -{ - vk::CommandBufferBeginInfo command_buffer_begin_info; - - std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue(0.0f, 0)}}; - - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); - - for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) - { - // Set target frame buffer - render_pass_begin_info.framebuffer = framebuffers[i]; - - auto command_buffer = draw_cmd_buffers[i]; - command_buffer.begin(command_buffer_begin_info); - - command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); - command_buffer.setViewport(0, viewport); - - vk::Rect2D scissor({0, 0}, extent); - command_buffer.setScissor(0, scissor); - - // Bind the uniform buffer and sampled image to set 0 - command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline_layout, 0, base_descriptor_set, {}); - command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); - - vk::DeviceSize offset = 0; - command_buffer.bindVertexBuffers(0, vertex_buffer->get_handle(), offset); - command_buffer.bindIndexBuffer(index_buffer->get_handle(), 0, vk::IndexType::eUint32); - - command_buffer.drawIndexed(static_cast(index_buffer->get_size() / sizeof(uint32_t)), 1, 0, 0, 0); - - draw_ui(command_buffer); - - command_buffer.endRenderPass(); - - command_buffer.end(); - } -} - -void HPPHlslShaders::render(float delta_time) -{ - if (prepared) - { - draw(); - } -} - -void HPPHlslShaders::view_changed() -{ - update_uniform_buffers(); -} - -vk::DescriptorSetLayout HPPHlslShaders::create_base_descriptor_set_layout() -{ - std::array base_set_layout_bindings = { - {{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}, // Binding 0 : Vertex shader uniform buffer - {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; // Binding 1 : Fragment shader combined sampler - - return get_device().get_handle().createDescriptorSetLayout({{}, base_set_layout_bindings}); -} - -vk::DescriptorPool HPPHlslShaders::create_descriptor_pool() -{ - std::array pool_sizes = { - {{vk::DescriptorType::eUniformBuffer, 1}, {vk::DescriptorType::eCombinedImageSampler, 1}, {vk::DescriptorType::eSampler, 2}}}; - return get_device().get_handle().createDescriptorPool({{}, 3, pool_sizes}); -} - -vk::Pipeline HPPHlslShaders::create_pipeline() -{ - size_t vertex_shader_index = shader_modules.size() - 2; - std::vector shader_stages{{{}, vk::ShaderStageFlagBits::eVertex, shader_modules[vertex_shader_index], "main"}, - {{}, vk::ShaderStageFlagBits::eFragment, shader_modules[vertex_shader_index + 1], "main"}}; - - // Vertex bindings and attributes - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(VertexStructure), vk::VertexInputRate::eVertex); - std::array vertex_input_attributes = { - {{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexStructure, pos)}, // Location 0 : Position - {1, 0, vk::Format::eR32G32Sfloat, offsetof(VertexStructure, uv)}, // Location 1: Texture Coordinates - {2, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexStructure, normal)}}}; // Location 2 : Normal - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); - - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - - // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state({}, true, true, vk::CompareOp::eGreater); - depth_stencil_state.back.compareOp = vk::CompareOp::eAlways; - - return vkb::common::create_graphics_pipeline(get_device().get_handle(), - pipeline_cache, - shader_stages, - vertex_input_state, - vk::PrimitiveTopology::eTriangleList, - 0, - vk::PolygonMode::eFill, - vk::CullModeFlagBits::eNone, - vk::FrontFace::eCounterClockwise, - {blend_attachment_state}, - depth_stencil_state, - pipeline_layout, - render_pass); -} - -vk::PipelineLayout HPPHlslShaders::create_pipeline_layout() -{ - // Set layout for the base descriptors in set 0 and set layout for the sampler descriptors in set 1 - std::array set_layouts = {{base_descriptor_set_layout, sampler_descriptor_set_layout}}; - return get_device().get_handle().createPipelineLayout({{}, set_layouts}); -} - -vk::DescriptorSetLayout HPPHlslShaders::create_sampler_descriptor_set_layout() -{ - vk::DescriptorSetLayoutBinding sampler_set_layout_binding(0, vk::DescriptorType::eSampler, 1, vk::ShaderStageFlagBits::eFragment); // Binding 0: Fragment shader sampler - - return get_device().get_handle().createDescriptorSetLayout({{}, sampler_set_layout_binding}); -} - -vk::ShaderModule HPPHlslShaders::create_shader_module(const std::string &file, vk::ShaderStageFlagBits stage) -{ - std::string info_log; - - // Compile HLSL to SPIR-V - - // Initialize glslang library - glslang::InitializeProcess(); - - auto messages = static_cast(EShMsgReadHlsl | EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); - - EShLanguage language{}; - switch (stage) - { - case vk::ShaderStageFlagBits::eVertex: - language = EShLangVertex; - break; - case vk::ShaderStageFlagBits::eFragment: - language = EShLangFragment; - break; - default: - assert(false); - } - - std::string source = vkb::fs::read_shader(file); - const char *shader_source = source.data(); - - glslang::TShader shader(language); - shader.setStringsWithLengths(&shader_source, nullptr, 1); - shader.setEnvInput(glslang::EShSourceHlsl, language, glslang::EShClientVulkan, 1); - shader.setEntryPoint("main"); - shader.setSourceEntryPoint("main"); - shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_0); - shader.setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetSpv_1_0); - - if (!shader.parse(GetDefaultResources(), 100, false, messages)) - { - LOGE("Failed to parse HLSL shader, Error: {}", std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog())); - throw std::runtime_error("Failed to parse HLSL shader"); - } - - // Add shader to new program object - glslang::TProgram program; - program.addShader(&shader); - - // Link program - if (!program.link(messages)) - { - LOGE("Failed to compile HLSL shader, Error: {}", std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog())); - throw std::runtime_error("Failed to compile HLSL shader"); - } - - if (shader.getInfoLog()) - { - info_log += std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()) + "\n"; - } - if (program.getInfoLog()) - { - info_log += std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog()); - } - - // Translate to SPIRV - glslang::TIntermediate *intermediate = program.getIntermediate(language); - if (!intermediate) - { - LOGE("Failed to get shared intermediate code."); - throw std::runtime_error("Failed to compile HLSL shader"); - } - - spv::SpvBuildLogger logger; - - std::vector spirvCode; - glslang::GlslangToSpv(*intermediate, spirvCode, &logger); - - info_log += logger.getAllMessages() + "\n"; - - glslang::FinalizeProcess(); - - // Create shader module from generated SPIR-V - return get_device().get_handle().createShaderModule({{}, spirvCode}); -} - -void HPPHlslShaders::draw() -{ - HPPApiVulkanSample::prepare_frame(); - - // Command buffer to be submitted to the queue - submit_info.setCommandBuffers(draw_cmd_buffers[current_buffer]); - - // Submit to queue - queue.submit(submit_info); - - HPPApiVulkanSample::submit_frame(); -} - -void HPPHlslShaders::generate_quad() -{ - // Setup vertices for a single uv-mapped quad made from two triangles - std::vector vertices = - { - {{1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 0.0f, 1.0f}}, - {{-1.0f, 1.0f, 0.0f}, {0.0f, 1.0f}, {0.0f, 0.0f, 1.0f}}, - {{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}}, - {{1.0f, -1.0f, 0.0f}, {1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}}}; - - // Setup indices - std::vector indices = {0, 1, 2, 2, 3, 0}; - - auto vertex_buffer_size = vkb::to_u32(vertices.size() * sizeof(VertexStructure)); - auto index_buffer_size = vkb::to_u32(indices.size() * sizeof(uint32_t)); - - // Create buffers - // For the sake of simplicity we won't stage the vertex data to the gpu memory - // Vertex buffer - vertex_buffer = std::make_unique(get_device(), - vertex_buffer_size, - vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, - VMA_MEMORY_USAGE_CPU_TO_GPU); - vertex_buffer->update(vertices.data(), vertex_buffer_size); - - index_buffer = std::make_unique(get_device(), - index_buffer_size, - vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, - VMA_MEMORY_USAGE_CPU_TO_GPU); - - index_buffer->update(indices.data(), index_buffer_size); -} - -void HPPHlslShaders::load_assets() -{ - texture = load_texture("textures/metalplate01_rgba.ktx", vkb::scene_graph::components::HPPImage::Color); -} - -void HPPHlslShaders::update_descriptor_sets() -{ - vk::DescriptorBufferInfo buffer_descriptor(uniform_buffer_vs->get_handle(), 0, VK_WHOLE_SIZE); - - // Combined image descriptor for the texture - vk::DescriptorImageInfo image_descriptor( - texture.sampler, - texture.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, texture.image->get_vk_image_view().get_format())); - - std::array write_descriptor_sets = { - {{base_descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer - {base_descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, image_descriptor}}}; // Binding 1 : Color map - - get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); -} - -void HPPHlslShaders::update_uniform_buffers() -{ - // Vertex shader - ubo_vs.projection = glm::perspective(glm::radians(60.0f), static_cast(extent.width) / static_cast(extent.height), 0.001f, 256.0f); - glm::mat4 view_matrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, zoom)); - - ubo_vs.model = view_matrix * glm::translate(glm::mat4(1.0f), camera_pos); - ubo_vs.model = glm::rotate(ubo_vs.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - ubo_vs.model = glm::rotate(ubo_vs.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); - ubo_vs.model = glm::rotate(ubo_vs.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - - ubo_vs.view_pos = glm::vec4(0.0f, 0.0f, -zoom, 0.0f); - - uniform_buffer_vs->convert_and_update(ubo_vs); -} - -std::unique_ptr create_hpp_hlsl_shaders() -{ - return std::make_unique(); -} diff --git a/samples/api/hpp_hlsl_shaders/hpp_hlsl_shaders.h b/samples/api/hpp_hlsl_shaders/hpp_hlsl_shaders.h deleted file mode 100644 index 0885174448..0000000000 --- a/samples/api/hpp_hlsl_shaders/hpp_hlsl_shaders.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Using HLSL shaders in Vulkan with the glslang library, using vulkan.hpp - */ - -#pragma once - -#include - -class HPPHlslShaders : public HPPApiVulkanSample -{ - public: - HPPHlslShaders(); - ~HPPHlslShaders() override; - - private: - struct UBOVS - { - glm::mat4 projection; - glm::mat4 model; - glm::vec4 view_pos; - }; - - // Vertex layout for this example - struct VertexStructure - { - float pos[3]; - float uv[2]; - float normal[3]; - }; - - private: - // from vkb::Application - bool prepare(const vkb::ApplicationOptions &options) override; - - // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; - - // from HPPApiVulkanSample - void build_command_buffers() override; - void render(float delta_time) override; - void view_changed() override; - - vk::DescriptorSetLayout create_base_descriptor_set_layout(); - vk::DescriptorPool create_descriptor_pool(); - vk::Pipeline create_pipeline(); - vk::PipelineLayout create_pipeline_layout(); - vk::DescriptorSetLayout create_sampler_descriptor_set_layout(); - vk::ShaderModule create_shader_module(const std::string &file, vk::ShaderStageFlagBits stage); - void draw(); - void generate_quad(); - void load_assets(); - void update_descriptor_sets(); - void update_uniform_buffers(); - - private: - vk::DescriptorSet base_descriptor_set; - vk::DescriptorSetLayout base_descriptor_set_layout; - std::unique_ptr index_buffer; - vk::Pipeline pipeline; - vk::PipelineLayout pipeline_layout; - vk::DescriptorSetLayout sampler_descriptor_set_layout; - HPPTexture texture; - UBOVS ubo_vs; - std::unique_ptr uniform_buffer_vs; - std::unique_ptr vertex_buffer; -}; - -std::unique_ptr create_hpp_hlsl_shaders(); diff --git a/samples/api/hpp_instancing/CMakeLists.txt b/samples/api/hpp_instancing/CMakeLists.txt index 93efe7a8a4..d3841fcee1 100644 --- a/samples/api/hpp_instancing/CMakeLists.txt +++ b/samples/api/hpp_instancing/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "instancing/hlsl/planet.vert.hlsl" "instancing/hlsl/planet.frag.hlsl" "instancing/hlsl/starfield.vert.hlsl" - "instancing/hlsl/starfield.frag.hlsl") + "instancing/hlsl/starfield.frag.hlsl" + SHADER_FILES_SLANG + "instancing/slang/instancing.vert.slang" + "instancing/slang/instancing.frag.slang" + "instancing/slang/planet.vert.slang" + "instancing/slang/planet.frag.slang" + "instancing/slang/starfield.vert.slang" + "instancing/slang/starfield.frag.slang") \ No newline at end of file diff --git a/samples/api/hpp_instancing/hpp_instancing.cpp b/samples/api/hpp_instancing/hpp_instancing.cpp index 00ebf030d0..874642fa96 100644 --- a/samples/api/hpp_instancing/hpp_instancing.cpp +++ b/samples/api/hpp_instancing/hpp_instancing.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -55,7 +55,7 @@ bool HPPInstancing::prepare(const vkb::ApplicationOptions &options) prepare_uniform_buffers(); vk::Device device = get_device().get_handle(); descriptor_set_layout = create_descriptor_set_layout(); - pipeline_layout = device.createPipelineLayout({{}, descriptor_set_layout}); + pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}); descriptor_pool = create_descriptor_pool(); // setup planet @@ -86,7 +86,7 @@ bool HPPInstancing::resize(const uint32_t width, const uint32_t height) return true; } -void HPPInstancing::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPInstancing::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { auto &requested_features = gpu.get_mutable_requested_features(); auto const &features = gpu.get_features(); @@ -117,9 +117,12 @@ void HPPInstancing::build_command_buffers() std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.033f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; + vk::ClearDepthStencilValue{0.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -131,10 +134,10 @@ void HPPInstancing::build_command_buffers() command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); vk::DeviceSize offset = 0; @@ -195,8 +198,10 @@ vk::DescriptorPool HPPInstancing::create_descriptor_pool() { // Example uses one ubo std::array pool_sizes = {{{vk::DescriptorType::eUniformBuffer, 2}, {vk::DescriptorType::eCombinedImageSampler, 2}}}; + vk::DescriptorPoolCreateInfo descriptor_pool_create_info{.maxSets = 2, + .poolSizeCount = static_cast(pool_sizes.size()), + .pPoolSizes = pool_sizes.data()}; - vk::DescriptorPoolCreateInfo descriptor_pool_create_info({}, 2, pool_sizes); return get_device().get_handle().createDescriptorPool(descriptor_pool_create_info); } @@ -206,17 +211,18 @@ vk::DescriptorSetLayout HPPInstancing::create_descriptor_set_layout() {{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}, // Binding 0 : Vertex shader uniform buffer {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; // Binding 1 : Fragment shader combined sampler - return get_device().get_handle().createDescriptorSetLayout({{}, set_layout_bindings}); + return get_device().get_handle().createDescriptorSetLayout( + {.bindingCount = static_cast(set_layout_bindings.size()), .pBindings = set_layout_bindings.data()}); } vk::Pipeline HPPInstancing::create_planet_pipeline() { // Planet rendering pipeline - std::vector shader_stages = {load_shader("instancing", "planet.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("instancing", "planet.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("instancing", "planet.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("instancing", "planet.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex input bindings - vk::VertexInputBindingDescription binding_description(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription binding_description{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; // Vertex attribute bindings std::array attribute_descriptions = { @@ -227,11 +233,13 @@ vk::Pipeline HPPInstancing::create_planet_pipeline() {2, 0, vk::Format::eR32G32Sfloat, 6 * sizeof(float)}}}; // Location 2: Texture coordinates // Use all input bindings and attribute descriptions - vk::PipelineVertexInputStateCreateInfo input_state({}, binding_description, attribute_descriptions); + vk::PipelineVertexInputStateCreateInfo input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &binding_description, + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -258,8 +266,8 @@ vk::Pipeline HPPInstancing::create_planet_pipeline() vk::Pipeline HPPInstancing::create_rocks_pipeline() { - std::vector shader_stages{load_shader("instancing", "instancing.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("instancing", "instancing.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("instancing", "instancing.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("instancing", "instancing.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex input bindings // The instancing pipeline uses a vertex input state with two bindings @@ -287,11 +295,13 @@ vk::Pipeline HPPInstancing::create_rocks_pipeline() {6, 1, vk::Format::eR32Sint, 7 * sizeof(float)}}}; // Location 6: Texture array layer index // Use all input bindings and attribute descriptions - vk::PipelineVertexInputStateCreateInfo input_state({}, binding_descriptions, attribute_descriptions); + vk::PipelineVertexInputStateCreateInfo input_state{.vertexBindingDescriptionCount = static_cast(binding_descriptions.size()), + .pVertexBindingDescriptions = binding_descriptions.data(), + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -319,11 +329,11 @@ vk::Pipeline HPPInstancing::create_rocks_pipeline() vk::Pipeline HPPInstancing::create_starfield_pipeline() { // Starfield rendering pipeline - std::vector shader_stages = {load_shader("instancing", "starfield.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("instancing", "starfield.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("instancing", "starfield.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("instancing", "starfield.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex input bindings - vk::VertexInputBindingDescription binding_description(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription binding_description{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; // Vertex attribute bindings std::array attribute_descriptions = { @@ -334,11 +344,13 @@ vk::Pipeline HPPInstancing::create_starfield_pipeline() {2, 0, vk::Format::eR32G32Sfloat, 6 * sizeof(float)}}}; // Location 2: Texture coordinates // Use all input bindings and attribute descriptions - vk::PipelineVertexInputStateCreateInfo input_state({}, binding_description, attribute_descriptions); + vk::PipelineVertexInputStateCreateInfo input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &binding_description, + .vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()), + .pVertexAttributeDescriptions = attribute_descriptions.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -448,7 +460,7 @@ void HPPInstancing::prepare_instance_data() // Copy to staging buffer vk::CommandBuffer copy_command = get_device().create_command_buffer(vk::CommandBufferLevel::ePrimary, true); - vk::BufferCopy copy_region(0, 0, instance_buffer.size); + vk::BufferCopy copy_region{.size = instance_buffer.size}; copy_command.copyBuffer(staging_buffer.get_handle(), instance_buffer.buffer->get_handle(), copy_region); get_device().flush_command_buffer(copy_command, queue, true); @@ -482,27 +494,41 @@ void HPPInstancing::update_uniform_buffer(float delta_time) void HPPInstancing::update_planet_descriptor_set() { - vk::DescriptorBufferInfo buffer_descriptor(uniform_buffers.scene->get_handle(), 0, VK_WHOLE_SIZE); + vk::DescriptorBufferInfo buffer_descriptor{uniform_buffers.scene->get_handle(), 0, vk::WholeSize}; vk::DescriptorImageInfo image_descriptor{planet.texture.sampler, planet.texture.image->get_vk_image_view().get_handle(), descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, planet.texture.image->get_vk_image_view().get_format())}; - std::array write_descriptor_sets = { - {{planet.descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer - {planet.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, image_descriptor}}}; // Binding 1 : Color map + std::array write_descriptor_sets = {{{.dstSet = planet.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer + {.dstSet = planet.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &image_descriptor}}}; // Binding 1 : Color map get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } void HPPInstancing::update_rocks_descriptor_set() { - vk::DescriptorBufferInfo buffer_descriptor(uniform_buffers.scene->get_handle(), 0, VK_WHOLE_SIZE); - vk::DescriptorImageInfo image_descriptor( - rocks.texture.sampler, - rocks.texture.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, rocks.texture.image->get_vk_image_view().get_format())); - std::array write_descriptor_sets = { - {{rocks.descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer - {rocks.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, image_descriptor}}}; // Binding 1 : Color map + vk::DescriptorBufferInfo buffer_descriptor{uniform_buffers.scene->get_handle(), 0, vk::WholeSize}; + vk::DescriptorImageInfo image_descriptor{rocks.texture.sampler, + rocks.texture.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + rocks.texture.image->get_vk_image_view().get_format())}; + std::array write_descriptor_sets = {{{.dstSet = rocks.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer + {.dstSet = rocks.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &image_descriptor}}}; // Binding 1 : Color map get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_instancing/hpp_instancing.h b/samples/api/hpp_instancing/hpp_instancing.h index 7516d5db08..96abcd6c8e 100644 --- a/samples/api/hpp_instancing/hpp_instancing.h +++ b/samples/api/hpp_instancing/hpp_instancing.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -88,7 +88,7 @@ class HPPInstancing : public HPPApiVulkanSample bool resize(const uint32_t width, const uint32_t height) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.cpp b/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.cpp index 69c6e7857f..435c877294 100644 --- a/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.cpp +++ b/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2024, Google - * Copyright (c) 2024, NVIDIA +/* Copyright (c) 2024-2025, Google + * Copyright (c) 2024-2025, NVIDIA * * SPDX-License-Identifier: Apache-2.0 * @@ -76,7 +76,7 @@ bool HPPOITDepthPeeling::resize(const uint32_t width, const uint32_t height) return HPPApiVulkanSample::resize(width, height); } -void HPPOITDepthPeeling::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPOITDepthPeeling::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { if (gpu.get_features().samplerAnisotropy) { @@ -93,11 +93,13 @@ void HPPOITDepthPeeling::build_command_buffers() vk::CommandBufferBeginInfo command_buffer_begin_info; std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; + vk::ClearDepthStencilValue{0.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info({}, {}, {{0, 0}, extent}, clear_values); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); - vk::Rect2D scissor({0, 0}, extent); + vk::RenderPassBeginInfo render_pass_begin_info{.renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; + vk::Rect2D scissor{{0, 0}, extent}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -233,16 +235,16 @@ void HPPOITDepthPeeling::render(float delta_time) void HPPOITDepthPeeling::create_background_pipeline() { - std::vector shader_stages = {load_shader("oit_depth_peeling/fullscreen.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("oit_depth_peeling/background.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("oit_depth_peeling/fullscreen.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("oit_depth_peeling/background.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)}, {1, 0, vk::Format::eR32G32Sfloat, offsetof(HPPVertex, uv)}}}; - vk::PipelineColorBlendAttachmentState blend_attachment_state(false, {}, {}, {}, {}, {}, {}, vk::FlagTraits::allFlags); + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::FlagTraits::allFlags}; - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state({}, false, false, vk::CompareOp::eGreater, {}, {}, {}, {{}, {}, {}, vk::CompareOp::eAlways}); + vk::PipelineDepthStencilStateCreateInfo depth_stencil_state{.depthCompareOp = vk::CompareOp::eGreater, .back = {.compareOp = vk::CompareOp::eAlways}}; background.pipeline = vkb::common::create_graphics_pipeline(get_device().get_handle(), pipeline_cache, @@ -267,34 +269,34 @@ void HPPOITDepthPeeling::create_combine_pass() {{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment}, {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, {2, vk::DescriptorType::eCombinedImageSampler, kLayerMaxCount, vk::ShaderStageFlagBits::eFragment}}}; - combinePass.descriptor_set_layout = device.createDescriptorSetLayout({{}, set_layout_bindings}); + combinePass.descriptor_set_layout = device.createDescriptorSetLayout({.bindingCount = static_cast(set_layout_bindings.size()), .pBindings = set_layout_bindings.data()}); combinePass.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, combinePass.descriptor_set_layout); - combinePass.pipeline_layout = device.createPipelineLayout({{}, combinePass.descriptor_set_layout}); + combinePass.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &combinePass.descriptor_set_layout}); create_combine_pass_pipeline(); } void HPPOITDepthPeeling::create_combine_pass_pipeline() { - std::vector shader_stages = {load_shader("oit_depth_peeling/fullscreen.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("oit_depth_peeling/combine.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("oit_depth_peeling/fullscreen.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("oit_depth_peeling/combine.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)}, {1, 0, vk::Format::eR32G32Sfloat, offsetof(HPPVertex, uv)}}}; - vk::PipelineColorBlendAttachmentState blend_attachment_state(true, + vk::PipelineColorBlendAttachmentState blend_attachment_state{true, vk::BlendFactor::eSrcAlpha, vk::BlendFactor::eOneMinusSrcColor, vk::BlendOp::eAdd, vk::BlendFactor::eOne, vk::BlendFactor::eZero, vk::BlendOp::eAdd, - vk::FlagTraits::allFlags); + vk::FlagTraits::allFlags}; - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state({}, false, false, vk::CompareOp::eGreater, {}, {}, {}, {{}, {}, {}, vk::CompareOp::eAlways}); + vk::PipelineDepthStencilStateCreateInfo depth_stencil_state{.depthCompareOp = vk::CompareOp::eGreater, .back = {.compareOp = vk::CompareOp::eAlways}}; combinePass.pipeline = vkb::common::create_graphics_pipeline(get_device().get_handle(), pipeline_cache, @@ -326,7 +328,9 @@ void HPPOITDepthPeeling::create_descriptor_pool() const uint32_t num_gather_descriptor_sets = 2; const uint32_t num_combine_descriptor_sets = 1; const uint32_t num_descriptor_sets = num_gather_descriptor_sets + num_combine_descriptor_sets; - vk::DescriptorPoolCreateInfo descriptor_pool_create_info({}, num_descriptor_sets, pool_sizes); + vk::DescriptorPoolCreateInfo descriptor_pool_create_info{.maxSets = num_descriptor_sets, + .poolSizeCount = static_cast(pool_sizes.size()), + .pPoolSizes = pool_sizes.data()}; descriptor_pool = get_device().get_handle().createDescriptorPool(descriptor_pool_create_info); } @@ -337,7 +341,7 @@ void HPPOITDepthPeeling::create_gather_pass() create_gather_pass_render_pass(); create_gather_pass_depth_descriptor_sets(); create_gather_pass_framebuffers(extent.width, extent.height); - gatherPass.pipeline_layout = get_device().get_handle().createPipelineLayout({{}, gatherPass.descriptor_set_layout}); + gatherPass.pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &gatherPass.descriptor_set_layout}); create_gather_pass_pipelines(); } @@ -355,13 +359,14 @@ void HPPOITDepthPeeling::create_gather_pass_descriptor_set_layout() std::array set_layout_bindings = { {{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment}, {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - gatherPass.descriptor_set_layout = get_device().get_handle().createDescriptorSetLayout({{}, set_layout_bindings}); + gatherPass.descriptor_set_layout = get_device().get_handle().createDescriptorSetLayout( + {.bindingCount = static_cast(set_layout_bindings.size()), .pBindings = set_layout_bindings.data()}); } void HPPOITDepthPeeling::create_gather_pass_framebuffers(const uint32_t width, const uint32_t height) { vk::Device device = get_device().get_handle(); - vk::FramebufferCreateInfo framebuffer_create_info({}, {}, {}, width, height, 1); + vk::FramebufferCreateInfo framebuffer_create_info{.width = width, .height = height, .layers = 1}; for (uint32_t i = 0; i < kLayerMaxCount; ++i) { if (layers[i].gather_framebuffer) @@ -379,17 +384,21 @@ void HPPOITDepthPeeling::create_gather_pass_pipelines() { vk::Device device = get_device().get_handle(); - std::vector shader_stages = {load_shader("oit_depth_peeling/gather.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("oit_depth_peeling/gather_first.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("oit_depth_peeling/gather.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("oit_depth_peeling/gather_first.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)}, {1, 0, vk::Format::eR32G32Sfloat, offsetof(HPPVertex, uv)}}}; - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state(false, {}, {}, {}, {}, {}, {}, vk::FlagTraits::allFlags); + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::FlagTraits::allFlags}; - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state({}, true, true, vk::CompareOp::eGreater, {}, {}, {}, {{}, {}, {}, vk::CompareOp::eAlways}); + vk::PipelineDepthStencilStateCreateInfo depth_stencil_state{ + .depthTestEnable = true, .depthWriteEnable = true, .depthCompareOp = vk::CompareOp::eGreater, .back = {.compareOp = vk::CompareOp::eAlways}}; gatherPass.first_pipeline = vkb::common::create_graphics_pipeline(device, pipeline_cache, @@ -405,7 +414,7 @@ void HPPOITDepthPeeling::create_gather_pass_pipelines() gatherPass.pipeline_layout, gatherPass.render_pass); - shader_stages[1] = load_shader("oit_depth_peeling/gather.frag", vk::ShaderStageFlagBits::eFragment); + shader_stages[1] = load_shader("oit_depth_peeling/gather.frag.spv", vk::ShaderStageFlagBits::eFragment); gatherPass.pipeline = vkb::common::create_graphics_pipeline(device, pipeline_cache, @@ -443,12 +452,19 @@ void HPPOITDepthPeeling::create_gather_pass_render_pass() vk::ImageLayout::eUndefined, vk::ImageLayout::eDepthStencilAttachmentOptimal}}}; - vk::AttachmentReference color_attachment_reference(0, vk::ImageLayout::eColorAttachmentOptimal); - vk::AttachmentReference depth_attachment_reference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal); + vk::AttachmentReference color_attachment_reference{0, vk::ImageLayout::eColorAttachmentOptimal}; + vk::AttachmentReference depth_attachment_reference{1, vk::ImageLayout::eDepthStencilAttachmentOptimal}; - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics, {}, color_attachment_reference, {}, &depth_attachment_reference); + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, + .colorAttachmentCount = 1, + .pColorAttachments = &color_attachment_reference, + .pDepthStencilAttachment = &depth_attachment_reference}; + + vk::RenderPassCreateInfo render_pass_create_info{.attachmentCount = static_cast(attachment_descriptions.size()), + .pAttachments = attachment_descriptions.data(), + .subpassCount = 1, + .pSubpasses = &subpass}; - vk::RenderPassCreateInfo render_pass_create_info({}, attachment_descriptions, subpass); gatherPass.render_pass = get_device().get_handle().createRenderPass(render_pass_create_info); } @@ -508,21 +524,30 @@ void HPPOITDepthPeeling::update_descriptors() { vk::Device device = get_device().get_handle(); - vk::DescriptorBufferInfo scene_constants_descriptor(scene_constants->get_handle(), 0, VK_WHOLE_SIZE); + vk::DescriptorBufferInfo scene_constants_descriptor{scene_constants->get_handle(), 0, vk::WholeSize}; for (uint32_t i = 0; i < kDepthCount; ++i) { - vk::DescriptorImageInfo depth_texture_descriptor( - point_sampler, depths[(i + 1) % kDepthCount].image_view->get_handle(), vk::ImageLayout::eDepthStencilReadOnlyOptimal); - - std::array write_descriptor_sets = { - {{depths[i].gather_descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, scene_constants_descriptor}, - {depths[i].gather_descriptor_set, 1, {}, vk::DescriptorType::eCombinedImageSampler, depth_texture_descriptor}}}; + vk::DescriptorImageInfo depth_texture_descriptor{point_sampler, + depths[(i + 1) % kDepthCount].image_view->get_handle(), + vk::ImageLayout::eDepthStencilReadOnlyOptimal}; + + std::array write_descriptor_sets = {{{.dstSet = depths[i].gather_descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &scene_constants_descriptor}, + {.dstSet = depths[i].gather_descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &depth_texture_descriptor}}}; device.updateDescriptorSets(write_descriptor_sets, {}); } - vk::DescriptorImageInfo background_texture_descriptor( - background.texture.sampler, background.texture.image->get_vk_image_view().get_handle(), vk::ImageLayout::eShaderReadOnlyOptimal); + vk::DescriptorImageInfo background_texture_descriptor{background.texture.sampler, + background.texture.image->get_vk_image_view().get_handle(), + vk::ImageLayout::eShaderReadOnlyOptimal}; std::array layer_texture_descriptor; for (uint32_t i = 0; i < kLayerMaxCount; ++i) @@ -532,10 +557,21 @@ void HPPOITDepthPeeling::update_descriptors() layer_texture_descriptor[i].imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal; } - std::array write_descriptor_sets = { - {{combinePass.descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, scene_constants_descriptor}, - {combinePass.descriptor_set, 1, {}, vk::DescriptorType::eCombinedImageSampler, background_texture_descriptor}, - {combinePass.descriptor_set, 2, {}, vk::DescriptorType::eCombinedImageSampler, layer_texture_descriptor}}}; + std::array write_descriptor_sets = {{{.dstSet = combinePass.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &scene_constants_descriptor}, + {.dstSet = combinePass.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &background_texture_descriptor}, + {.dstSet = combinePass.descriptor_set, + .dstBinding = 2, + .descriptorCount = static_cast(layer_texture_descriptor.size()), + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = layer_texture_descriptor.data()}}}; device.updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.h b/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.h index 32da683270..c0a21abb37 100644 --- a/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.h +++ b/samples/api/hpp_oit_depth_peeling/hpp_oit_depth_peeling.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2024, Google - * Copyright (c) 2024, NVIDIA +/* Copyright (c) 2024-2025, Google + * Copyright (c) 2024-2025, NVIDIA * * SPDX-License-Identifier: Apache-2.0 * @@ -32,7 +32,7 @@ class HPPOITDepthPeeling : public HPPApiVulkanSample bool resize(const uint32_t width, const uint32_t height) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.cpp b/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.cpp index 29bf3635ef..f03f286b0c 100644 --- a/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.cpp +++ b/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA +/* Copyright (c) 2023-2025, NVIDIA * * SPDX-License-Identifier: Apache-2.0 * @@ -75,7 +75,7 @@ bool HPPOITLinkedLists::resize(const uint32_t width, const uint32_t height) return HPPApiVulkanSample::resize(width, height); } -void HPPOITLinkedLists::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPOITLinkedLists::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { auto &requested_features = gpu.get_mutable_requested_features(); auto const &features = gpu.get_features(); @@ -100,15 +100,20 @@ void HPPOITLinkedLists::build_command_buffers() { vk::CommandBufferBeginInfo command_buffer_begin_info; - vk::RenderPassBeginInfo gather_render_pass_begin_info(gather_render_pass, gather_framebuffer, {{0, 0}, extent}); + vk::RenderPassBeginInfo gather_render_pass_begin_info{.renderPass = gather_render_pass, + .framebuffer = gather_framebuffer, + .renderArea = {{0, 0}, extent}}; std::array combine_clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; - vk::RenderPassBeginInfo combine_render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, combine_clear_values); + vk::ClearDepthStencilValue{0.0f, 0}}}; + vk::RenderPassBeginInfo combine_render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(combine_clear_values.size()), + .pClearValues = combine_clear_values.data()}; - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); - vk::Rect2D scissor({0, 0}, extent); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; + vk::Rect2D scissor{{0, 0}, extent}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -195,7 +200,7 @@ void HPPOITLinkedLists::clear_sized_resources() { command_buffer.fillBuffer(fragment_counter->get_handle(), 0, sizeof(glm::uint), 0); - vk::ImageSubresourceRange subresource_range(vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1); + vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}; vkb::common::image_layout_transition(command_buffer, linked_list_head_image->get_handle(), vk::PipelineStageFlagBits::eBottomOfPipe, @@ -212,7 +217,7 @@ void HPPOITLinkedLists::clear_sized_resources() command_buffer.end(); { - vk::SubmitInfo submit_info({}, {}, command_buffer); + vk::SubmitInfo submit_info{.commandBufferCount = 1, .pCommandBuffers = &command_buffer}; queue.submit(submit_info); queue.waitIdle(); } @@ -235,7 +240,9 @@ vk::DescriptorPool HPPOITLinkedLists::create_descriptor_pool() {vk::DescriptorType::eStorageBuffer, 2}, {vk::DescriptorType::eCombinedImageSampler, 1}}}; - vk::DescriptorPoolCreateInfo descriptor_pool_create_info({}, 1, pool_sizes); + vk::DescriptorPoolCreateInfo descriptor_pool_create_info{.maxSets = 1, + .poolSizeCount = static_cast(pool_sizes.size()), + .pPoolSizes = pool_sizes.data()}; return get_device().get_handle().createDescriptorPool(descriptor_pool_create_info); } @@ -248,7 +255,8 @@ vk::DescriptorSetLayout HPPOITLinkedLists::create_descriptor_set_layout() {3, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment}, {4, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment}, {5, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - return get_device().get_handle().createDescriptorSetLayout({{}, set_layout_bindings}); + return get_device().get_handle().createDescriptorSetLayout( + {.bindingCount = static_cast(set_layout_bindings.size()), .pBindings = set_layout_bindings.data()}); } void HPPOITLinkedLists::create_descriptors() @@ -260,7 +268,7 @@ void HPPOITLinkedLists::create_descriptors() void HPPOITLinkedLists::create_fragment_resources(vk::Extent2D const &extent) { - const vk::Extent3D image_extent{extent, 1}; + const vk::Extent3D image_extent{extent.width, extent.height, 1}; const vk::Format image_format{vk::Format::eR32Uint}; linked_list_head_image = std::make_unique(get_device(), image_extent, @@ -281,19 +289,18 @@ void HPPOITLinkedLists::create_fragment_resources(vk::Extent2D const &extent) void HPPOITLinkedLists::create_gather_pass_objects(vk::Extent2D const &extent) { - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics); - gather_render_pass = get_device().get_handle().createRenderPass({{}, nullptr, subpass}); + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics}; + gather_render_pass = get_device().get_handle().createRenderPass({.subpassCount = 1, .pSubpasses = &subpass}); gather_framebuffer = vkb::common::create_framebuffer(get_device().get_handle(), gather_render_pass, {}, extent); } void HPPOITLinkedLists::create_pipelines() { - pipeline_layout = get_device().get_handle().createPipelineLayout({{}, descriptor_set_layout}); + pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}); - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; depth_stencil_state.depthCompareOp = vk::CompareOp::eGreater; @@ -302,12 +309,15 @@ void HPPOITLinkedLists::create_pipelines() depth_stencil_state.back.compareOp = vk::CompareOp::eAlways; depth_stencil_state.front = depth_stencil_state.back; - std::vector gather_shader_stages = {load_shader("oit_linked_lists/gather.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("oit_linked_lists/gather.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector gather_shader_stages = {load_shader("oit_linked_lists/gather.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("oit_linked_lists/gather.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::VertexInputBindingDescription gather_vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); - vk::VertexInputAttributeDescription gather_vertex_input_attribute(0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)); - vk::PipelineVertexInputStateCreateInfo gather_vertex_input_state({}, gather_vertex_input_binding, gather_vertex_input_attribute); + vk::VertexInputBindingDescription gather_vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; + vk::VertexInputAttributeDescription gather_vertex_input_attribute{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)}; + vk::PipelineVertexInputStateCreateInfo gather_vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &gather_vertex_input_binding, + .vertexAttributeDescriptionCount = 1, + .pVertexAttributeDescriptions = &gather_vertex_input_attribute}; gather_pipeline = vkb::common::create_graphics_pipeline(get_device().get_handle(), pipeline_cache, @@ -323,8 +333,8 @@ void HPPOITLinkedLists::create_pipelines() pipeline_layout, gather_render_pass); - std::vector background_shader_stages = {load_shader("oit_linked_lists/fullscreen.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("oit_linked_lists/background.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector background_shader_stages = {load_shader("oit_linked_lists/fullscreen.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("oit_linked_lists/background.frag.spv", vk::ShaderStageFlagBits::eFragment)}; vk::PipelineVertexInputStateCreateInfo vertex_input_state; background_pipeline = vkb::common::create_graphics_pipeline(get_device().get_handle(), @@ -341,10 +351,10 @@ void HPPOITLinkedLists::create_pipelines() pipeline_layout, render_pass); - std::vector combine_shader_stages = {load_shader("oit_linked_lists/combine.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("oit_linked_lists/combine.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector combine_shader_stages = {load_shader("oit_linked_lists/combine.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("oit_linked_lists/combine.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::PipelineColorBlendAttachmentState combine_blend_attachment_state(true, + vk::PipelineColorBlendAttachmentState combine_blend_attachment_state{true, vk::BlendFactor::eSrcAlpha, vk::BlendFactor::eOneMinusSrcAlpha, vk::BlendOp::eAdd, @@ -352,7 +362,7 @@ void HPPOITLinkedLists::create_pipelines() vk::BlendFactor::eZero, vk::BlendOp::eAdd, vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | - vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA); + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; combine_pipeline = vkb::common::create_graphics_pipeline(get_device().get_handle(), pipeline_cache, @@ -432,23 +442,46 @@ void HPPOITLinkedLists::load_assets() void HPPOITLinkedLists::update_descriptors() { - vk::DescriptorBufferInfo scene_constants_descriptor(scene_constants->get_handle(), 0, vk::WholeSize); - vk::DescriptorBufferInfo instance_data_descriptor(instance_data->get_handle(), 0, vk::WholeSize); - vk::DescriptorImageInfo linked_list_head_image_view_descriptor(nullptr, linked_list_head_image_view->get_handle(), vk::ImageLayout::eGeneral); - vk::DescriptorBufferInfo fragment_buffer_descriptor(fragment_buffer->get_handle(), 0, vk::WholeSize); - vk::DescriptorBufferInfo fragment_counter_descriptor(fragment_counter->get_handle(), 0, vk::WholeSize); - vk::DescriptorImageInfo background_texture_descriptor( - background_texture.sampler, - background_texture.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, background_texture.image->get_vk_image_view().get_format())); - - std::array write_descriptor_sets = { - {{descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, scene_constants_descriptor}, - {descriptor_set, 1, 0, vk::DescriptorType::eUniformBuffer, {}, instance_data_descriptor}, - {descriptor_set, 2, 0, vk::DescriptorType::eStorageImage, linked_list_head_image_view_descriptor}, - {descriptor_set, 3, 0, vk::DescriptorType::eStorageBuffer, {}, fragment_buffer_descriptor}, - {descriptor_set, 4, 0, vk::DescriptorType::eStorageBuffer, {}, fragment_counter_descriptor}, - {descriptor_set, 5, 0, vk::DescriptorType::eCombinedImageSampler, background_texture_descriptor}}}; + vk::DescriptorBufferInfo scene_constants_descriptor{scene_constants->get_handle(), 0, vk::WholeSize}; + vk::DescriptorBufferInfo instance_data_descriptor{instance_data->get_handle(), 0, vk::WholeSize}; + vk::DescriptorImageInfo linked_list_head_image_view_descriptor{nullptr, linked_list_head_image_view->get_handle(), vk::ImageLayout::eGeneral}; + vk::DescriptorBufferInfo fragment_buffer_descriptor{fragment_buffer->get_handle(), 0, vk::WholeSize}; + vk::DescriptorBufferInfo fragment_counter_descriptor{fragment_counter->get_handle(), 0, vk::WholeSize}; + vk::DescriptorImageInfo background_texture_descriptor{background_texture.sampler, + background_texture.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + background_texture.image->get_vk_image_view().get_format())}; + + std::array write_descriptor_sets = {{{.dstSet = descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &scene_constants_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &instance_data_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageImage, + .pImageInfo = &linked_list_head_image_view_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 3, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .pBufferInfo = &fragment_buffer_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 4, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .pBufferInfo = &fragment_counter_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 5, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &background_texture_descriptor}}}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.h b/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.h index c5cc7c5c1c..abc3856d87 100644 --- a/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.h +++ b/samples/api/hpp_oit_linked_lists/hpp_oit_linked_lists.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA +/* Copyright (c) 2023-2025, NVIDIA * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ class HPPOITLinkedLists : public HPPApiVulkanSample bool resize(const uint32_t width, const uint32_t height) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; @@ -100,16 +100,16 @@ class HPPOITLinkedLists : public HPPApiVulkanSample glm::uint fragment_max_count = 0U; vk::RenderPass gather_render_pass = nullptr; - vk::Framebuffer gather_framebuffer; + vk::Framebuffer gather_framebuffer = nullptr; vk::DescriptorSetLayout descriptor_set_layout = nullptr; vk::DescriptorPool descriptor_pool = nullptr; vk::DescriptorSet descriptor_set = nullptr; - vk::PipelineLayout pipeline_layout = nullptr; - vk::Pipeline gather_pipeline; - vk::Pipeline background_pipeline; - vk::Pipeline combine_pipeline; + vk::PipelineLayout pipeline_layout = nullptr; + vk::Pipeline gather_pipeline = nullptr; + vk::Pipeline background_pipeline = nullptr; + vk::Pipeline combine_pipeline = nullptr; bool sort_fragments = true; bool camera_auto_rotation = false; diff --git a/samples/api/hpp_separate_image_sampler/CMakeLists.txt b/samples/api/hpp_separate_image_sampler/CMakeLists.txt index fec60fa5a9..2a3077d39e 100644 --- a/samples/api/hpp_separate_image_sampler/CMakeLists.txt +++ b/samples/api/hpp_separate_image_sampler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "separate_image_sampler/glsl/separate_image_sampler.frag" SHADER_FILES_HLSL "separate_image_sampler/hlsl/separate_image_sampler.vert.hlsl" - "separate_image_sampler/hlsl/separate_image_sampler.frag.hlsl") \ No newline at end of file + "separate_image_sampler/hlsl/separate_image_sampler.frag.hlsl" + SHADER_FILES_SLANG + "separate_image_sampler/slang/separate_image_sampler.vert.slang" + "separate_image_sampler/slang/separate_image_sampler.frag.slang") \ No newline at end of file diff --git a/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.cpp b/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.cpp index 8e8a5e21ed..af69bf3797 100644 --- a/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.cpp +++ b/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -94,7 +94,7 @@ bool HPPSeparateImageSampler::prepare(const vkb::ApplicationOptions &options) } // Enable physical device features required for this example -void HPPSeparateImageSampler::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPSeparateImageSampler::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -106,9 +106,12 @@ void HPPSeparateImageSampler::request_gpu_features(vkb::core::HPPPhysicalDevice void HPPSeparateImageSampler::build_command_buffers() { vk::CommandBufferBeginInfo command_buffer_begin_info; - std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue(0.0f, 0)}}; + std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue{0.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -120,10 +123,10 @@ void HPPSeparateImageSampler::build_command_buffers() command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); // Bind the uniform buffer and sampled image to set 0 @@ -179,7 +182,8 @@ vk::DescriptorSetLayout HPPSeparateImageSampler::create_base_descriptor_set_layo {1, vk::DescriptorType::eSampledImage, 1, vk::ShaderStageFlagBits::eFragment} // Binding 1 : Fragment shader sampled image }}; - vk::DescriptorSetLayoutCreateInfo descriptor_layout_create_info({}, set_layout_bindings_buffer_and_image); + vk::DescriptorSetLayoutCreateInfo descriptor_layout_create_info{.bindingCount = static_cast(set_layout_bindings_buffer_and_image.size()), + .pBindings = set_layout_bindings_buffer_and_image.data()}; return get_device().get_handle().createDescriptorSetLayout(descriptor_layout_create_info); } @@ -189,7 +193,9 @@ vk::DescriptorPool HPPSeparateImageSampler::create_descriptor_pool() std::array pool_sizes = { {{vk::DescriptorType::eUniformBuffer, 1}, {vk::DescriptorType::eSampledImage, 1}, {vk::DescriptorType::eSampler, 2}}}; - vk::DescriptorPoolCreateInfo descriptor_pool_create_info({}, 3, pool_sizes); + vk::DescriptorPoolCreateInfo descriptor_pool_create_info{.maxSets = 3, + .poolSizeCount = static_cast(pool_sizes.size()), + .pPoolSizes = pool_sizes.data()}; return get_device().get_handle().createDescriptorPool(descriptor_pool_create_info); } @@ -198,20 +204,22 @@ vk::Pipeline HPPSeparateImageSampler::create_graphics_pipeline() { // Load shaders std::vector shader_stages = { - load_shader("separate_image_sampler", "separate_image_sampler.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("separate_image_sampler", "separate_image_sampler.frag", vk::ShaderStageFlagBits::eFragment)}; + load_shader("separate_image_sampler", "separate_image_sampler.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("separate_image_sampler", "separate_image_sampler.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex bindings and attributes - vk::VertexInputBindingDescription input_binding(0, sizeof(VertexStructure), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription input_binding{0, sizeof(VertexStructure), vk::VertexInputRate::eVertex}; std::array input_attributes = { {{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexStructure, pos)}, // Location 0 : Position - {1, 0, vk::Format::eR32G32Sfloat, offsetof(VertexStructure, uv)}, // Location 1: Texture Coordinates + {1, 0, vk::Format::eR32G32Sfloat, offsetof(VertexStructure, uv)}, // Location 1 : Texture Coordinates {2, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexStructure, normal)}}}; // Location 2 : Normal - vk::PipelineVertexInputStateCreateInfo input_state({}, input_binding, input_attributes); + vk::PipelineVertexInputStateCreateInfo input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &input_binding, + .vertexAttributeDescriptionCount = static_cast(input_attributes.size()), + .pVertexAttributeDescriptions = input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -237,7 +245,9 @@ vk::Pipeline HPPSeparateImageSampler::create_graphics_pipeline() vk::PipelineLayout HPPSeparateImageSampler::create_pipeline_layout(std::vector const &descriptor_set_layouts) { - vk::PipelineLayoutCreateInfo pipeline_layout_create_info({}, descriptor_set_layouts); + vk::PipelineLayoutCreateInfo pipeline_layout_create_info{.setLayoutCount = static_cast(descriptor_set_layouts.size()), + .pSetLayouts = descriptor_set_layouts.data()}; + return get_device().get_handle().createPipelineLayout(pipeline_layout_create_info); } @@ -256,9 +266,9 @@ vk::Sampler HPPSeparateImageSampler::create_sampler(vk::Filter filter) vk::DescriptorSetLayout HPPSeparateImageSampler::create_sampler_descriptor_set_layout() { // Set layout for the samplers - vk::DescriptorSetLayoutBinding set_layout_binding_sampler(0, vk::DescriptorType::eSampler, 1, vk::ShaderStageFlagBits::eFragment); + vk::DescriptorSetLayoutBinding set_layout_binding_sampler{0, vk::DescriptorType::eSampler, 1, vk::ShaderStageFlagBits::eFragment}; - vk::DescriptorSetLayoutCreateInfo descriptor_layout_create_info({}, set_layout_binding_sampler); + vk::DescriptorSetLayoutCreateInfo descriptor_layout_create_info{.bindingCount = 1, .pBindings = &set_layout_binding_sampler}; return get_device().get_handle().createDescriptorSetLayout(descriptor_layout_create_info); } @@ -326,18 +336,25 @@ void HPPSeparateImageSampler::prepare_uniform_buffers() void HPPSeparateImageSampler::update_base_descriptor_set() { - vk::DescriptorBufferInfo buffer_descriptor(uniform_buffer_vs->get_handle(), 0, VK_WHOLE_SIZE); + vk::DescriptorBufferInfo buffer_descriptor{uniform_buffer_vs->get_handle(), 0, vk::WholeSize}; // Image info only references the image - vk::DescriptorImageInfo image_info({}, texture.image->get_vk_image_view().get_handle(), vk::ImageLayout::eShaderReadOnlyOptimal); + vk::DescriptorImageInfo image_info{{}, texture.image->get_vk_image_view().get_handle(), vk::ImageLayout::eShaderReadOnlyOptimal}; // Sampled image descriptor - vk::WriteDescriptorSet image_write_descriptor_set(base_descriptor_set, 1, 0, vk::DescriptorType::eSampledImage, image_info); - - std::array write_descriptor_sets = {{ - {base_descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer - image_write_descriptor_set // Binding 1 : Fragment shader sampled image - }}; + std::array write_descriptor_sets = { + { + {.dstSet = base_descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer + {.dstSet = base_descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampledImage, + .pImageInfo = &image_info} // Binding 1 : Fragment shader sampled image + }}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } @@ -346,9 +363,10 @@ void HPPSeparateImageSampler::update_sampler_descriptor_set(size_t index) assert((index < samplers.size()) && (index < sampler_descriptor_sets.size())); // Descriptor info only references the sampler - vk::DescriptorImageInfo sampler_info(samplers[index]); + vk::DescriptorImageInfo sampler_info{samplers[index]}; - vk::WriteDescriptorSet sampler_write_descriptor_set(sampler_descriptor_sets[index], 0, 0, vk::DescriptorType::eSampler, sampler_info); + vk::WriteDescriptorSet sampler_write_descriptor_set{ + .dstSet = sampler_descriptor_sets[index], .dstBinding = 0, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eSampler, .pImageInfo = &sampler_info}; get_device().get_handle().updateDescriptorSets(sampler_write_descriptor_set, {}); } diff --git a/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.h b/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.h index 4c10b3f6eb..34a597d186 100644 --- a/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.h +++ b/samples/api/hpp_separate_image_sampler/hpp_separate_image_sampler.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -50,7 +50,7 @@ class HPPSeparateImageSampler : public HPPApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_terrain_tessellation/CMakeLists.txt b/samples/api/hpp_terrain_tessellation/CMakeLists.txt index b4c07fca39..9e82256198 100644 --- a/samples/api/hpp_terrain_tessellation/CMakeLists.txt +++ b/samples/api/hpp_terrain_tessellation/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "terrain_tessellation/hlsl/terrain.tesc.hlsl" "terrain_tessellation/hlsl/terrain.tese.hlsl" "terrain_tessellation/hlsl/skysphere.vert.hlsl" - "terrain_tessellation/hlsl/skysphere.frag.hlsl") + "terrain_tessellation/hlsl/skysphere.frag.hlsl" + SHADER_FILES_SLANG + "terrain_tessellation/slang/terrain.vert.slang" + "terrain_tessellation/slang/terrain.frag.slang" + "terrain_tessellation/slang/terrain.tesc.slang" + "terrain_tessellation/slang/terrain.tese.slang" + "terrain_tessellation/slang/skysphere.vert.slang" + "terrain_tessellation/slang/skysphere.frag.slang") diff --git a/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.cpp b/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.cpp index 73c90c9a71..459ac27850 100644 --- a/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.cpp +++ b/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,9 +20,8 @@ */ #include "hpp_terrain_tessellation.h" - -#include -#include +#include "core/command_pool.h" +#include "heightmap.h" HPPTerrainTessellation::HPPTerrainTessellation() { @@ -67,7 +66,7 @@ bool HPPTerrainTessellation::prepare(const vkb::ApplicationOptions &options) return prepared; } -void HPPTerrainTessellation::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPTerrainTessellation::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Tessellation shader support is required for this example auto &available_features = gpu.get_features(); @@ -96,9 +95,12 @@ void HPPTerrainTessellation::request_gpu_features(vkb::core::HPPPhysicalDevice & void HPPTerrainTessellation::build_command_buffers() { vk::CommandBufferBeginInfo command_buffer_begin_info; - std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue(0.0f, 0)}}; + std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue{0.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -113,10 +115,10 @@ void HPPTerrainTessellation::build_command_buffers() render_pass_begin_info.framebuffer = framebuffers[i]; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); vk::DeviceSize offset = 0; @@ -200,7 +202,9 @@ void HPPTerrainTessellation::view_changed() vk::DescriptorPool HPPTerrainTessellation::create_descriptor_pool() { std::array pool_sizes = {{{vk::DescriptorType::eUniformBuffer, 3}, {vk::DescriptorType::eCombinedImageSampler, 3}}}; - return get_device().get_handle().createDescriptorPool({{}, 2, pool_sizes}); + + return get_device().get_handle().createDescriptorPool( + {.maxSets = 2, .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data()}); } vk::DescriptorSetLayout HPPTerrainTessellation::create_sky_sphere_descriptor_set_layout() @@ -208,31 +212,34 @@ vk::DescriptorSetLayout HPPTerrainTessellation::create_sky_sphere_descriptor_set std::array layout_bindings = { {{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}, {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; + vk::DescriptorSetLayoutCreateInfo skysphere_descriptor_layout{.bindingCount = static_cast(layout_bindings.size()), + .pBindings = layout_bindings.data()}; - vk::DescriptorSetLayoutCreateInfo skysphere_descriptor_layout({}, layout_bindings); return get_device().get_handle().createDescriptorSetLayout(skysphere_descriptor_layout); } vk::Pipeline HPPTerrainTessellation::create_sky_sphere_pipeline() { std::vector shader_stages = { - load_shader("terrain_tessellation", "skysphere.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("terrain_tessellation", "skysphere.frag", vk::ShaderStageFlagBits::eFragment)}; + load_shader("terrain_tessellation", "skysphere.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("terrain_tessellation", "skysphere.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex bindings an attributes // Binding description - std::array vertex_input_bindings = {{{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}}}; + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; // Attribute descriptions std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32B32Sfloat, 0}, // Position {1, 0, vk::Format::eR32G32B32Sfloat, sizeof(float) * 3}, // Normal {2, 0, vk::Format::eR32G32Sfloat, sizeof(float) * 6}}}; // UV - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_bindings, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -269,7 +276,8 @@ vk::DescriptorSetLayout HPPTerrainTessellation::create_terrain_descriptor_set_la vk::ShaderStageFlagBits::eTessellationControl | vk::ShaderStageFlagBits::eTessellationEvaluation | vk::ShaderStageFlagBits::eFragment}, {2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - vk::DescriptorSetLayoutCreateInfo terrain_descriptor_layout({}, layout_bindings); + vk::DescriptorSetLayoutCreateInfo terrain_descriptor_layout{.bindingCount = static_cast(layout_bindings.size()), + .pBindings = layout_bindings.data()}; return get_device().get_handle().createDescriptorSetLayout(terrain_descriptor_layout); } @@ -277,19 +285,20 @@ vk::Pipeline HPPTerrainTessellation::create_terrain_pipeline(vk::PolygonMode pol { // Vertex bindings an attributes // Binding description - std::array vertex_input_bindings = { - {{0, sizeof(HPPTerrainTessellation::Vertex), vk::VertexInputRate::eVertex}}}; + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPTerrainTessellation::Vertex), vk::VertexInputRate::eVertex}; // Attribute descriptions std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32B32Sfloat, 0}, // Position {1, 0, vk::Format::eR32G32B32Sfloat, sizeof(float) * 3}, // Normal {2, 0, vk::Format::eR32G32Sfloat, sizeof(float) * 6}}}; // UV - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_bindings, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -458,7 +467,7 @@ void HPPTerrainTessellation::prepare_camera() void HPPTerrainTessellation::prepare_sky_sphere() { sky_sphere.descriptor_set_layout = create_sky_sphere_descriptor_set_layout(); - sky_sphere.pipeline_layout = get_device().get_handle().createPipelineLayout({{}, sky_sphere.descriptor_set_layout}); + sky_sphere.pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &sky_sphere.descriptor_set_layout}); sky_sphere.pipeline = create_sky_sphere_pipeline(); sky_sphere.descriptor_set = vkb::common::allocate_descriptor_set(get_device().get_handle(), descriptor_pool, {sky_sphere.descriptor_set_layout}); update_sky_sphere_descriptor_set(); @@ -479,13 +488,13 @@ void HPPTerrainTessellation::prepare_statistics() void HPPTerrainTessellation::prepare_terrain() { - terrain.shader_stages = {load_shader("terrain_tessellation", "terrain.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("terrain_tessellation", "terrain.frag", vk::ShaderStageFlagBits::eFragment), - load_shader("terrain_tessellation", "terrain.tesc", vk::ShaderStageFlagBits::eTessellationControl), - load_shader("terrain_tessellation", "terrain.tese", vk::ShaderStageFlagBits::eTessellationEvaluation)}; + terrain.shader_stages = {load_shader("terrain_tessellation", "terrain.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("terrain_tessellation", "terrain.frag.spv", vk::ShaderStageFlagBits::eFragment), + load_shader("terrain_tessellation", "terrain.tesc.spv", vk::ShaderStageFlagBits::eTessellationControl), + load_shader("terrain_tessellation", "terrain.tese.spv", vk::ShaderStageFlagBits::eTessellationEvaluation)}; terrain.descriptor_set_layout = create_terrain_descriptor_set_layout(); - terrain.pipeline_layout = get_device().get_handle().createPipelineLayout({{}, terrain.descriptor_set_layout}); + terrain.pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &terrain.descriptor_set_layout}); terrain.pipeline = create_terrain_pipeline(vk::PolygonMode::eFill); terrain.descriptor_set = vkb::common::allocate_descriptor_set(get_device().get_handle(), descriptor_pool, {terrain.descriptor_set_layout}); update_terrain_descriptor_set(); @@ -546,38 +555,56 @@ void HPPTerrainTessellation::update_uniform_buffers() void HPPTerrainTessellation::update_sky_sphere_descriptor_set() { - vk::DescriptorBufferInfo skysphere_buffer_descriptor(sky_sphere.transform_buffer->get_handle(), 0, VK_WHOLE_SIZE); - - vk::DescriptorImageInfo skysphere_image_descriptor( - sky_sphere.texture.sampler, - sky_sphere.texture.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, sky_sphere.texture.image->get_vk_image_view().get_format())); - - std::array skysphere_write_descriptor_sets = { - {{sky_sphere.descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, skysphere_buffer_descriptor}, - {sky_sphere.descriptor_set, 1, {}, vk::DescriptorType::eCombinedImageSampler, skysphere_image_descriptor}}}; + vk::DescriptorBufferInfo skysphere_buffer_descriptor{sky_sphere.transform_buffer->get_handle(), 0, vk::WholeSize}; + + vk::DescriptorImageInfo skysphere_image_descriptor{sky_sphere.texture.sampler, + sky_sphere.texture.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + sky_sphere.texture.image->get_vk_image_view().get_format())}; + + std::array skysphere_write_descriptor_sets = {{{.dstSet = sky_sphere.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &skysphere_buffer_descriptor}, + {.dstSet = sky_sphere.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &skysphere_image_descriptor}}}; get_device().get_handle().updateDescriptorSets(skysphere_write_descriptor_sets, {}); } void HPPTerrainTessellation::update_terrain_descriptor_set() { - vk::DescriptorBufferInfo terrain_buffer_descriptor(terrain.tessellation_buffer->get_handle(), 0, VK_WHOLE_SIZE); - - vk::DescriptorImageInfo heightmap_image_descriptor( - terrain.height_map.sampler, - terrain.height_map.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, terrain.height_map.image->get_vk_image_view().get_format())); - - vk::DescriptorImageInfo terrainmap_image_descriptor( - terrain.terrain_array.sampler, - terrain.terrain_array.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, terrain.terrain_array.image->get_vk_image_view().get_format())); - - std::array terrain_write_descriptor_sets = { - {{terrain.descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, terrain_buffer_descriptor}, - {terrain.descriptor_set, 1, {}, vk::DescriptorType::eCombinedImageSampler, heightmap_image_descriptor}, - {terrain.descriptor_set, 2, {}, vk::DescriptorType::eCombinedImageSampler, terrainmap_image_descriptor}}}; + vk::DescriptorBufferInfo terrain_buffer_descriptor{terrain.tessellation_buffer->get_handle(), 0, vk::WholeSize}; + + vk::DescriptorImageInfo heightmap_image_descriptor{terrain.height_map.sampler, + terrain.height_map.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + terrain.height_map.image->get_vk_image_view().get_format())}; + + vk::DescriptorImageInfo terrainmap_image_descriptor{terrain.terrain_array.sampler, + terrain.terrain_array.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + terrain.terrain_array.image->get_vk_image_view().get_format())}; + + std::array terrain_write_descriptor_sets = {{{.dstSet = terrain.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &terrain_buffer_descriptor}, + {.dstSet = terrain.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &heightmap_image_descriptor}, + {.dstSet = terrain.descriptor_set, + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &terrainmap_image_descriptor}}}; get_device().get_handle().updateDescriptorSets(terrain_write_descriptor_sets, {}); } diff --git a/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.h b/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.h index e147740e89..8418d515a4 100644 --- a/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.h +++ b/samples/api/hpp_terrain_tessellation/hpp_terrain_tessellation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -145,7 +145,7 @@ class HPPTerrainTessellation : public HPPApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_texture_loading/CMakeLists.txt b/samples/api/hpp_texture_loading/CMakeLists.txt index c1e6262c37..5b478fe3f0 100644 --- a/samples/api/hpp_texture_loading/CMakeLists.txt +++ b/samples/api/hpp_texture_loading/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "texture_loading/glsl/texture.frag" SHADER_FILES_HLSL "texture_loading/hlsl/texture.vert.hlsl" - "texture_loading/hlsl/texture.frag.hlsl") \ No newline at end of file + "texture_loading/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_loading/slang/texture.vert.slang" + "texture_loading/slang/texture.frag.slang") \ No newline at end of file diff --git a/samples/api/hpp_texture_loading/hpp_texture_loading.cpp b/samples/api/hpp_texture_loading/hpp_texture_loading.cpp index d5d24343c0..98770dc07a 100644 --- a/samples/api/hpp_texture_loading/hpp_texture_loading.cpp +++ b/samples/api/hpp_texture_loading/hpp_texture_loading.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,8 +20,8 @@ */ #include "hpp_texture_loading.h" -#include -#include +#include "common/ktx_common.h" +#include "core/command_pool.h" HPPTextureLoading::HPPTextureLoading() { @@ -60,7 +60,7 @@ bool HPPTextureLoading::prepare(const vkb::ApplicationOptions &options) generate_quad(); prepare_uniform_buffers(); descriptor_set_layout = create_descriptor_set_layout(); - pipeline_layout = get_device().get_handle().createPipelineLayout({{}, descriptor_set_layout}); + pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}); pipeline = create_pipeline(); descriptor_pool = create_descriptor_pool(); descriptor_set = vkb::common::allocate_descriptor_set(get_device().get_handle(), descriptor_pool, {descriptor_set_layout}); @@ -74,7 +74,7 @@ bool HPPTextureLoading::prepare(const vkb::ApplicationOptions &options) } // Enable physical device features required for this example -void HPPTextureLoading::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPTextureLoading::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -89,7 +89,7 @@ void HPPTextureLoading::build_command_buffers() vk::ClearValue clear_values[2]; clear_values[0].color = default_clear_color; - clear_values[1].depthStencil = vk::ClearDepthStencilValue(0.0f, 0); + clear_values[1].depthStencil = vk::ClearDepthStencilValue{0.0f, 0}; vk::RenderPassBeginInfo render_pass_begin_info; render_pass_begin_info.renderPass = render_pass; @@ -110,10 +110,10 @@ void HPPTextureLoading::build_command_buffers() command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline_layout, 0, descriptor_set, {}); @@ -162,7 +162,8 @@ vk::DescriptorPool HPPTextureLoading::create_descriptor_pool() // Example uses one ubo and one image sampler std::array pool_sizes = {{{vk::DescriptorType::eUniformBuffer, 1}, {vk::DescriptorType::eCombinedImageSampler, 1}}}; - return get_device().get_handle().createDescriptorPool({{}, 2, pool_sizes}); + return get_device().get_handle().createDescriptorPool( + {.maxSets = 2, .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data()}); } vk::DescriptorSetLayout HPPTextureLoading::create_descriptor_set_layout() @@ -171,26 +172,29 @@ vk::DescriptorSetLayout HPPTextureLoading::create_descriptor_set_layout() {{0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}, {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - return get_device().get_handle().createDescriptorSetLayout({{}, set_layout_bindings}); + return get_device().get_handle().createDescriptorSetLayout( + {.bindingCount = static_cast(set_layout_bindings.size()), .pBindings = set_layout_bindings.data()}); } vk::Pipeline HPPTextureLoading::create_pipeline() { // Load shaders - std::vector shader_stages = {{load_shader("texture_loading", "texture.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("texture_loading", "texture.frag", vk::ShaderStageFlagBits::eFragment)}}; + std::vector shader_stages = {{load_shader("texture_loading", "texture.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("texture_loading", "texture.frag.spv", vk::ShaderStageFlagBits::eFragment)}}; // Vertex bindings and attributes - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(Vertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(Vertex), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = { {{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, pos)}, // Location 0 : Position {1, 0, vk::Format::eR32G32Sfloat, offsetof(Vertex, uv)}, // Location 1: Texture Coordinates {2, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, normal)}}}; // Location 2 : Normal - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -281,7 +285,7 @@ void HPPTextureLoading::load_texture() ktxTexture *ktx_texture = vkb::ktx::load_texture(filename); - texture.extent = vk::Extent2D(ktx_texture->baseWidth, ktx_texture->baseHeight); + texture.extent = vk::Extent2D{ktx_texture->baseWidth, ktx_texture->baseHeight}; texture.mip_levels = ktx_texture->numLevels; // We prefer using staging to copy the texture data to a device local optimal image @@ -307,7 +311,9 @@ void HPPTextureLoading::load_texture() // Create a host-visible staging buffer that contains the raw image data // This buffer will be the data source for copying texture data to the optimal tiled image on the device // This buffer is used as a transfer source for the buffer copy - vk::BufferCreateInfo buffer_create_info({}, ktx_texture->dataSize, vk::BufferUsageFlagBits::eTransferSrc, vk::SharingMode::eExclusive, {}); + vk::BufferCreateInfo buffer_create_info{.size = ktx_texture->dataSize, + .usage = vk::BufferUsageFlagBits::eTransferSrc, + .sharingMode = vk::SharingMode::eExclusive}; vk::Buffer staging_buffer = device.createBuffer(buffer_create_info); // Get memory requirements for the staging buffer (alignment, memory type bits) @@ -317,7 +323,7 @@ void HPPTextureLoading::load_texture() uint32_t memory_type = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); - vk::MemoryAllocateInfo memory_allocate_info(memory_requirements.size, memory_type); + vk::MemoryAllocateInfo memory_allocate_info{.allocationSize = memory_requirements.size, .memoryTypeIndex = memory_type}; vk::DeviceMemory staging_memory = device.allocateMemory(memory_allocate_info); device.bindBufferMemory(staging_buffer, staging_memory, 0); @@ -344,22 +350,23 @@ void HPPTextureLoading::load_texture() } // Create optimal tiled target image on the device - vk::ImageCreateInfo image_create_info; - image_create_info.imageType = vk::ImageType::e2D; - image_create_info.format = format; - image_create_info.mipLevels = texture.mip_levels; - image_create_info.arrayLayers = 1; - image_create_info.samples = vk::SampleCountFlagBits::e1; - image_create_info.tiling = vk::ImageTiling::eOptimal; - image_create_info.sharingMode = vk::SharingMode::eExclusive; - image_create_info.initialLayout = vk::ImageLayout::eUndefined; // Set initial layout of the image to undefined - image_create_info.extent = vk::Extent3D(texture.extent, 1); - image_create_info.usage = vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled; - texture.image = device.createImage(image_create_info); + vk::ImageCreateInfo image_create_info{ + .imageType = vk::ImageType::e2D, + .format = format, + .extent = {texture.extent.width, texture.extent.height, 1}, + .mipLevels = texture.mip_levels, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eOptimal, + .usage = vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled, + .sharingMode = vk::SharingMode::eExclusive, + .initialLayout = vk::ImageLayout::eUndefined // Set initial layout of the image to undefined + }; + texture.image = device.createImage(image_create_info); memory_requirements = device.getImageMemoryRequirements(texture.image); memory_type = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal); - memory_allocate_info = {memory_requirements.size, memory_type}; + memory_allocate_info = vk::MemoryAllocateInfo{.allocationSize = memory_requirements.size, .memoryTypeIndex = memory_type}; texture.device_memory = device.allocateMemory(memory_allocate_info); device.bindImageMemory(texture.image, texture.device_memory, 0); @@ -369,11 +376,12 @@ void HPPTextureLoading::load_texture() // Image memory barriers for the texture image // The sub resource range describes the regions of the image that will be transitioned using the memory barriers below - vk::ImageSubresourceRange subresource_range; - subresource_range.aspectMask = vk::ImageAspectFlagBits::eColor; // Image contains only color data - subresource_range.baseMipLevel = 0; // Start at first mip level - subresource_range.levelCount = texture.mip_levels; // We will transition on all mip levels - subresource_range.layerCount = 1; // The 2D texture only has one layer + vk::ImageSubresourceRange subresource_range{ + .aspectMask = vk::ImageAspectFlagBits::eColor, // Image contains only color data + .baseMipLevel = 0, // Start at first mip level + .levelCount = texture.mip_levels, // We will transition on all mip levels + .layerCount = 1 // The 2D texture only has one layer + }; // Transition the texture image layout to transfer target, so we can safely copy our buffer data to it. vk::ImageMemoryBarrier image_memory_barrier; @@ -419,18 +427,17 @@ void HPPTextureLoading::load_texture() // Copy data to a linear tiled image // Load mip map level 0 to linear tiling image - vk::ImageCreateInfo image_create_info; - image_create_info.imageType = vk::ImageType::e2D; - image_create_info.format = format; - image_create_info.mipLevels = 1; - image_create_info.arrayLayers = 1; - image_create_info.samples = vk::SampleCountFlagBits::e1; - image_create_info.tiling = vk::ImageTiling::eLinear; - image_create_info.usage = vk::ImageUsageFlagBits::eSampled; - image_create_info.sharingMode = vk::SharingMode::eExclusive; - image_create_info.initialLayout = vk::ImageLayout::ePreinitialized; - image_create_info.extent = vk::Extent3D(texture.extent, 1); - vk::Image mappable_image = device.createImage(image_create_info); + vk::ImageCreateInfo image_create_info{.imageType = vk::ImageType::e2D, + .format = format, + .extent = {texture.extent.width, texture.extent.height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eLinear, + .usage = vk::ImageUsageFlagBits::eSampled, + .sharingMode = vk::SharingMode::eExclusive, + .initialLayout = vk::ImageLayout::ePreinitialized}; + vk::Image mappable_image = device.createImage(image_create_info); // Get memory requirements for this image like size and alignment vk::MemoryRequirements memory_requirements = device.getImageMemoryRequirements(mappable_image); @@ -440,7 +447,7 @@ void HPPTextureLoading::load_texture() vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); // Set memory allocation size to required memory size - vk::MemoryAllocateInfo memory_allocate_info(memory_requirements.size, memory_type); + vk::MemoryAllocateInfo memory_allocate_info{.allocationSize = memory_requirements.size, .memoryTypeIndex = memory_type}; vk::DeviceMemory mappable_memory = device.allocateMemory(memory_allocate_info); device.bindImageMemory(mappable_image, mappable_memory, 0); @@ -460,7 +467,7 @@ void HPPTextureLoading::load_texture() copy_command.begin(vk::CommandBufferBeginInfo()); // The sub resource range describes the regions of the image we will be transition - vk::ImageSubresourceRange subresource_range(vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1); + vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}; // Transition the texture image layout to shader read, so it can be sampled from vk::ImageMemoryBarrier image_memory_barrier; @@ -536,20 +543,28 @@ void HPPTextureLoading::prepare_uniform_buffers() void HPPTextureLoading::update_descriptor_set() { - vk::DescriptorBufferInfo buffer_descriptor(vertex_shader_data_buffer->get_handle(), 0, VK_WHOLE_SIZE); + vk::DescriptorBufferInfo buffer_descriptor{vertex_shader_data_buffer->get_handle(), 0, vk::WholeSize}; // Setup a descriptor image info for the current texture to be used as a combined image sampler - vk::DescriptorImageInfo image_descriptor; - image_descriptor.imageView = texture.image_view; // The image's view (images are never directly accessed by the shader, but rather through views defining subresources) - image_descriptor.sampler = texture.sampler; // The sampler (Telling the pipeline how to sample the texture, including repeat, border, etc.) - image_descriptor.imageLayout = texture.image_layout; // The current layout of the image (Note: Should always fit the actual use, e.g. shader read) - - std::array write_descriptor_sets = { - {// Binding 0 : Vertex shader uniform buffer - {descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}, - // Binding 1 : Fragment shader texture sampler - // Fragment shader: layout (binding = 1) uniform sampler2D samplerColor; - {descriptor_set, 1, {}, vk::DescriptorType::eCombinedImageSampler, image_descriptor}}}; + vk::DescriptorImageInfo image_descriptor{ + texture.sampler, // The sampler (the sampler describes how to sample the image, including repeat, border, etc.) + texture.image_view, // The image view (the image view describes the image and the subresources that can be accessed) + texture.image_layout // The current layout of the image (Note: Should always fit the actual use, e.g. shader read) + }; + + std::array write_descriptor_sets = {{// Binding 0 : Vertex shader uniform buffer + {.dstSet = descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &buffer_descriptor}, + // Binding 1 : Fragment shader texture sampler + // Fragment shader: layout (binding = 1) uniform sampler2D samplerColor; + {.dstSet = descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &image_descriptor}}}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_texture_loading/hpp_texture_loading.h b/samples/api/hpp_texture_loading/hpp_texture_loading.h index 6989641b72..9170c73bb7 100644 --- a/samples/api/hpp_texture_loading/hpp_texture_loading.h +++ b/samples/api/hpp_texture_loading/hpp_texture_loading.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -72,7 +72,7 @@ class HPPTextureLoading : public HPPApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_texture_mipmap_generation/CMakeLists.txt b/samples/api/hpp_texture_mipmap_generation/CMakeLists.txt index 3c4c36d95d..808e6ffd80 100644 --- a/samples/api/hpp_texture_mipmap_generation/CMakeLists.txt +++ b/samples/api/hpp_texture_mipmap_generation/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "texture_mipmap_generation/glsl/texture.frag" SHADER_FILES_HLSL "texture_mipmap_generation/hlsl/texture.vert.hlsl" - "texture_mipmap_generation/hlsl/texture.frag.hlsl") + "texture_mipmap_generation/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_mipmap_generation/slang/texture.vert.slang" + "texture_mipmap_generation/slang/texture.frag.slang") diff --git a/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.cpp b/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.cpp index b99ed3f7fa..166852d05b 100644 --- a/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.cpp +++ b/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,10 +20,10 @@ */ #include "hpp_texture_mipmap_generation.h" -#include -#include -#include -#include +#include "common/hpp_vk_common.h" +#include "common/ktx_common.h" +#include "common/vk_initializers.h" +#include "core/command_pool.h" HPPTextureMipMapGeneration::HPPTextureMipMapGeneration() { @@ -64,7 +64,7 @@ bool HPPTextureMipMapGeneration::prepare(const vkb::ApplicationOptions &options) load_assets(); prepare_uniform_buffers(); descriptor_set_layout = create_descriptor_set_layout(); - pipeline_layout = get_device().get_handle().createPipelineLayout({{}, descriptor_set_layout}); + pipeline_layout = get_device().get_handle().createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}); pipeline = create_pipeline(); descriptor_pool = create_descriptor_pool(); descriptor_set = vkb::common::allocate_descriptor_set(get_device().get_handle(), descriptor_pool, descriptor_set_layout); @@ -78,7 +78,7 @@ bool HPPTextureMipMapGeneration::prepare(const vkb::ApplicationOptions &options) } // Enable physical device features required for this example -void HPPTextureMipMapGeneration::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPTextureMipMapGeneration::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -91,9 +91,12 @@ void HPPTextureMipMapGeneration::build_command_buffers() { vk::CommandBufferBeginInfo command_buffer_begin_info; - std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue(1.0f, 0)}}; + std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue{1.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -105,10 +108,10 @@ void HPPTextureMipMapGeneration::build_command_buffers() command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline_layout, 0, descriptor_set, {}); @@ -178,7 +181,9 @@ vk::DescriptorPool HPPTextureMipMapGeneration::create_descriptor_pool() std::array pool_sizes = { {{vk::DescriptorType::eUniformBuffer, 1}, {vk::DescriptorType::eSampledImage, 1}, {vk::DescriptorType::eSampler, 3}}}; - vk::DescriptorPoolCreateInfo descriptor_pool_create_info({}, 2, pool_sizes); + vk::DescriptorPoolCreateInfo descriptor_pool_create_info{.maxSets = 2, + .poolSizeCount = static_cast(pool_sizes.size()), + .pPoolSizes = pool_sizes.data()}; return get_device().get_handle().createDescriptorPool(descriptor_pool_create_info); } @@ -190,7 +195,8 @@ vk::DescriptorSetLayout HPPTextureMipMapGeneration::create_descriptor_set_layout {1, vk::DescriptorType::eSampledImage, 1, vk::ShaderStageFlagBits::eFragment}, // Binding 1 : Fragment shader image sampler {2, vk::DescriptorType::eSampler, 3, vk::ShaderStageFlagBits::eFragment}}}; // Binding 2 : Sampler array (3 descriptors) - vk::DescriptorSetLayoutCreateInfo descriptor_layout({}, set_layout_bindings); + vk::DescriptorSetLayoutCreateInfo descriptor_layout{.bindingCount = static_cast(set_layout_bindings.size()), + .pBindings = set_layout_bindings.data()}; return get_device().get_handle().createDescriptorSetLayout(descriptor_layout); } @@ -199,20 +205,22 @@ vk::Pipeline HPPTextureMipMapGeneration::create_pipeline() { // Load shaders std::vector shader_stages = { - load_shader("texture_mipmap_generation", "texture.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("texture_mipmap_generation", "texture.frag", vk::ShaderStageFlagBits::eFragment)}; + load_shader("texture_mipmap_generation", "texture.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("texture_mipmap_generation", "texture.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex bindings and attributes - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; std::array vertex_input_attributes = {{ {0, 0, vk::Format::eR32G32B32Sfloat, 0}, // Position {1, 0, vk::Format::eR32G32Sfloat, sizeof(float) * 6}, // UV }}; - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; depth_stencil_state.depthCompareOp = vk::CompareOp::eLessOrEqual; @@ -256,7 +264,7 @@ void HPPTextureMipMapGeneration::load_assets() // Load the base texture containing only the first mip level and generate the whole mip-chain at runtime ktxTexture *ktx_texture = vkb::ktx::load_texture(vkb::fs::path::get(vkb::fs::path::Assets, "textures/checkerboard_rgba.ktx")); - texture.extent = vk::Extent2D(ktx_texture->baseWidth, ktx_texture->baseHeight); + texture.extent = vk::Extent2D{ktx_texture->baseWidth, ktx_texture->baseHeight}; // Calculate number of mip levels as per Vulkan specs: // numLevels = 1 + floor(log2(max(w, h, d))) @@ -273,12 +281,27 @@ void HPPTextureMipMapGeneration::load_assets() ktxTexture_Destroy(ktx_texture); // Create optimal tiled target image on the device - std::tie(texture.image, texture.device_memory) = - get_device().create_image(format, - texture.extent, - texture.mip_levels, - vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eSampled, - vk::MemoryPropertyFlagBits::eDeviceLocal); + auto device = get_device().get_handle(); + + vk::ImageCreateInfo image_create_info{.imageType = vk::ImageType::e2D, + .format = format, + .extent = {.width = texture.extent.width, .height = texture.extent.height, .depth = 1}, + .mipLevels = texture.mip_levels, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eOptimal, + .usage = + vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eSampled, + .sharingMode = vk::SharingMode::eExclusive}; + texture.image = device.createImage(image_create_info); + + vk::MemoryRequirements memory_requirements = device.getImageMemoryRequirements(texture.image); + + vk::MemoryAllocateInfo memory_allocation{.allocationSize = memory_requirements.size, + .memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, + vk::MemoryPropertyFlagBits::eDeviceLocal)}; + texture.device_memory = device.allocateMemory(memory_allocation); + device.bindImageMemory(texture.image, texture.device_memory, 0); vk::CommandBuffer copy_command = vkb::common::allocate_command_buffer(get_device().get_handle(), get_device().get_command_pool().get_handle()); copy_command.begin(vk::CommandBufferBeginInfo()); @@ -287,7 +310,8 @@ void HPPTextureMipMapGeneration::load_assets() vkb::common::image_layout_transition(copy_command, texture.image, vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal); // Copy the first mip of the chain, remaining mips will be generated - vk::BufferImageCopy buffer_copy_region({}, {}, {}, {vk::ImageAspectFlagBits::eColor, 0, 0, 1}, {}, vk::Extent3D(texture.extent, 1)); + vk::BufferImageCopy buffer_copy_region{.imageSubresource = {vk::ImageAspectFlagBits::eColor, 0, 0, 1}, + .imageExtent = {texture.extent.width, texture.extent.height, 1}}; copy_command.copyBufferToImage(staging_buffer.get_handle(), texture.image, vk::ImageLayout::eTransferDstOptimal, buffer_copy_region); // Transition first mip level to transfer source so we can blit(read) from it @@ -305,13 +329,17 @@ void HPPTextureMipMapGeneration::load_assets() // Copy down mips from n-1 to n for (uint32_t i = 1; i < texture.mip_levels; i++) { - vk::ImageBlit image_blit({vk::ImageAspectFlagBits::eColor, i - 1, 0, 1}, - {{{}, {static_cast(texture.extent.width >> (i - 1)), static_cast(texture.extent.height >> (i - 1)), static_cast(1)}}}, - {vk::ImageAspectFlagBits::eColor, i, 0, 1}, - {{{}, {static_cast(texture.extent.width >> i), static_cast(texture.extent.height >> i), static_cast(1)}}}); + vk::ImageBlit image_blit{ + {vk::ImageAspectFlagBits::eColor, i - 1, 0, 1}, + {{{{}, + {static_cast(texture.extent.width >> (i - 1)), + static_cast(texture.extent.height >> (i - 1)), + static_cast(1)}}}}, + {vk::ImageAspectFlagBits::eColor, i, 0, 1}, + {{{{}, {static_cast(texture.extent.width >> i), static_cast(texture.extent.height >> i), static_cast(1)}}}}}; // Prepare current mip level as image blit destination - vk::ImageSubresourceRange image_subresource_range(vk::ImageAspectFlagBits::eColor, i, 1, 0, 1); + vk::ImageSubresourceRange image_subresource_range{vk::ImageAspectFlagBits::eColor, i, 1, 0, 1}; vkb::common::image_layout_transition( blit_command, texture.image, vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, image_subresource_range); @@ -379,19 +407,30 @@ void HPPTextureMipMapGeneration::prepare_uniform_buffers() void HPPTextureMipMapGeneration::update_descriptor_set() { - vk::DescriptorBufferInfo buffer_descriptor(uniform_buffer->get_handle(), 0, VK_WHOLE_SIZE); + vk::DescriptorBufferInfo buffer_descriptor{uniform_buffer->get_handle(), 0, vk::WholeSize}; - vk::DescriptorImageInfo image_descriptor(nullptr, texture.view, vk::ImageLayout::eShaderReadOnlyOptimal); + vk::DescriptorImageInfo image_descriptor{nullptr, texture.view, vk::ImageLayout::eShaderReadOnlyOptimal}; std::array sampler_descriptors = {{{samplers[0], nullptr, vk::ImageLayout::eShaderReadOnlyOptimal}, {samplers[1], nullptr, vk::ImageLayout::eShaderReadOnlyOptimal}, {samplers[2], nullptr, vk::ImageLayout::eShaderReadOnlyOptimal}}}; assert(samplers.size() == sampler_descriptors.size()); - std::array write_descriptor_sets = { - {{descriptor_set, 0, {}, vk::DescriptorType::eUniformBuffer, {}, buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer - {descriptor_set, 1, {}, vk::DescriptorType::eSampledImage, image_descriptor}, // Binding 1 : Fragment shader texture sampler - {descriptor_set, 2, {}, vk::DescriptorType::eSampler, sampler_descriptors}}}; // Binding 2: Sampler array + std::array write_descriptor_sets = {{{.dstSet = descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &buffer_descriptor}, // Binding 0 : Vertex shader uniform buffer + {.dstSet = descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampledImage, + .pImageInfo = &image_descriptor}, // Binding 1 : Fragment shader texture sampler + {.dstSet = descriptor_set, + .dstBinding = 2, + .descriptorCount = static_cast(sampler_descriptors.size()), + .descriptorType = vk::DescriptorType::eSampler, + .pImageInfo = sampler_descriptors.data()}}}; // Binding 2: Sampler array get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.h b/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.h index 1aa2ad0f25..aef5a5eaba 100644 --- a/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.h +++ b/samples/api/hpp_texture_mipmap_generation/hpp_texture_mipmap_generation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -53,7 +53,7 @@ class HPPTextureMipMapGeneration : public HPPApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/api/hpp_timestamp_queries/CMakeLists.txt b/samples/api/hpp_timestamp_queries/CMakeLists.txt index 6ad9ed4192..86a7e19561 100644 --- a/samples/api/hpp_timestamp_queries/CMakeLists.txt +++ b/samples/api/hpp_timestamp_queries/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "hdr/hlsl/bloom.vert.hlsl" "hdr/hlsl/bloom.frag.hlsl" "hdr/hlsl/gbuffer.vert.hlsl" - "hdr/hlsl/gbuffer.frag.hlsl") + "hdr/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "hdr/slang/composition.vert.slang" + "hdr/slang/composition.frag.slang" + "hdr/slang/bloom.vert.slang" + "hdr/slang/bloom.frag.slang" + "hdr/slang/gbuffer.vert.slang" + "hdr/slang/gbuffer.frag.slang") diff --git a/samples/api/hpp_timestamp_queries/README.adoc b/samples/api/hpp_timestamp_queries/README.adoc index cc9afd063f..d1bd215278 100644 --- a/samples/api/hpp_timestamp_queries/README.adoc +++ b/samples/api/hpp_timestamp_queries/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023-2024, The Khronos Group +- Copyright (c) 2023-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -36,8 +36,8 @@ improve performance where needed. == Introduction -Vulkan offers several https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#queries[query types] that allow you to query different types of information from the GPU. -One such query type is the https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#queries-timestamps[timestamp query]. +Vulkan offers several https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#queries[query types] that allow you to query different types of information from the GPU. +One such query type is the https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#queries-timestamps[timestamp query]. This provides your application with a mechanism to time the execution of commands on the GPU. As with the other query types, a query pool is then used to either directly fetch or copy over the results to the host. @@ -274,7 +274,7 @@ float delta_in_ms = float(time_stamps[1] - time_stamps[0]) * device_limits.times == vk::CommandBuffer::writeTimestamp2 -The https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_synchronization2.html[VK_KHR_synchronization2] extension introduced `vk::CommandBuffer::writeTimestamp2`. +The https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html[VK_KHR_synchronization2] extension introduced `vk::CommandBuffer::writeTimestamp2`. This is pretty much the same as the `vk::CommandBuffer::writeTimestamp` function used in this sample, but adds support for some additional pipeline stages using `vk::PipelineStageFlags2`. == Verdict diff --git a/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.cpp b/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.cpp index df61bb05fe..3dd66f587f 100644 --- a/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.cpp +++ b/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -20,6 +20,7 @@ */ #include "hpp_timestamp_queries.h" +#include "core/hpp_queue.h" HPPTimestampQueries::HPPTimestampQueries() { @@ -58,7 +59,7 @@ bool HPPTimestampQueries::prepare(const vkb::ApplicationOptions &options) if (!device_limits.timestampComputeAndGraphics) { // Check if the graphics queue used in this sample supports time stamps - vk::QueueFamilyProperties const &graphics_queue_family_properties = get_device().get_suitable_graphics_queue().get_properties(); + vk::QueueFamilyProperties const &graphics_queue_family_properties = get_device().get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0).get_properties(); if (graphics_queue_family_properties.timestampValidBits == 0) { throw std::runtime_error{"The selected graphics queue family does not support timestamp queries!"}; @@ -89,7 +90,7 @@ bool HPPTimestampQueries::resize(const uint32_t width, const uint32_t height) return true; } -void HPPTimestampQueries::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPTimestampQueries::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -118,14 +119,18 @@ void HPPTimestampQueries::build_command_buffers() std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; - vk::RenderPassBeginInfo render_pass_begin_info(offscreen.render_pass, offscreen.framebuffer, {{0, 0}, offscreen.extent}, clear_values); + vk::ClearDepthStencilValue{0.0f, 0}}}; + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = offscreen.render_pass, + .framebuffer = offscreen.framebuffer, + .renderArea = {{0, 0}, offscreen.extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(offscreen.extent.width), static_cast(offscreen.extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(offscreen.extent.width), static_cast(offscreen.extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, offscreen.extent); + vk::Rect2D scissor{{0, 0}, offscreen.extent}; command_buffer.setScissor(0, scissor); // Skybox @@ -156,13 +161,17 @@ void HPPTimestampQueries::build_command_buffers() // Bloom filter command_buffer.writeTimestamp(vk::PipelineStageFlagBits::eTopOfPipe, time_stamps.query_pool, 2); - vk::RenderPassBeginInfo render_pass_begin_info(filter_pass.render_pass, filter_pass.framebuffer, {{0, 0}, filter_pass.extent}, clear_value); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = filter_pass.render_pass, + .framebuffer = filter_pass.framebuffer, + .renderArea = {{0, 0}, filter_pass.extent}, + .clearValueCount = 1, + .pClearValues = &clear_value}; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(filter_pass.extent.width), static_cast(filter_pass.extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(filter_pass.extent.width), static_cast(filter_pass.extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, filter_pass.extent); + vk::Rect2D scissor{{0, 0}, filter_pass.extent}; command_buffer.setScissor(0, scissor); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, bloom.pipeline_layout, 0, bloom.descriptor_set, {}); @@ -183,18 +192,22 @@ void HPPTimestampQueries::build_command_buffers() */ { std::array clear_values = {{vk::ClearColorValue(std::array({{0.0f, 0.0f, 0.0f, 0.0f}})), - vk::ClearDepthStencilValue(0.0f, 0)}}; + vk::ClearDepthStencilValue{0.0f, 0}}}; // Final composition command_buffer.writeTimestamp(vk::PipelineStageFlagBits::eTopOfPipe, time_stamps.query_pool, bloom.enabled ? 4 : 2); - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, framebuffers[i], {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .framebuffer = framebuffers[i], + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; command_buffer.beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; command_buffer.setViewport(0, viewport); - vk::Rect2D scissor({0, 0}, extent); + vk::Rect2D scissor{{0, 0}, extent}; command_buffer.setScissor(0, scissor); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, composition.pipeline_layout, 0, composition.descriptor_set, {}); @@ -275,8 +288,9 @@ vk::DeviceMemory HPPTimestampQueries::allocate_memory(vk::Image image) { vk::MemoryRequirements memory_requirements = get_device().get_handle().getImageMemoryRequirements(image); - vk::MemoryAllocateInfo memory_allocate_info(memory_requirements.size, - get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal)); + vk::MemoryAllocateInfo memory_allocate_info{.allocationSize = memory_requirements.size, + .memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, + vk::MemoryPropertyFlagBits::eDeviceLocal)}; return get_device().get_handle().allocateMemory(memory_allocate_info); } @@ -295,30 +309,30 @@ HPPTimestampQueries::FramebufferAttachment HPPTimestampQueries::create_attachmen vk::DescriptorPool HPPTimestampQueries::create_descriptor_pool() { std::array pool_sizes = {{{vk::DescriptorType::eUniformBuffer, 4}, {vk::DescriptorType::eCombinedImageSampler, 6}}}; - return get_device().get_handle().createDescriptorPool({{}, 4, pool_sizes}); + return get_device().get_handle().createDescriptorPool( + {.maxSets = 4, .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data()}); } vk::Pipeline HPPTimestampQueries::create_bloom_pipeline(uint32_t direction) { - std::vector shader_stages{load_shader("hdr", "bloom.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("hdr", "bloom.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("hdr", "bloom.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("hdr", "bloom.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Set constant parameters via specialization constants - vk::SpecializationMapEntry specialization_map_entry(0, 0, sizeof(uint32_t)); + vk::SpecializationMapEntry specialization_map_entry{0, 0, sizeof(uint32_t)}; - vk::SpecializationInfo specialization_info(1, &specialization_map_entry, sizeof(uint32_t), &direction); + vk::SpecializationInfo specialization_info{1, &specialization_map_entry, sizeof(uint32_t), &direction}; shader_stages[1].pSpecializationInfo = &specialization_info; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.blendEnable = true; - blend_attachment_state.colorBlendOp = vk::BlendOp::eAdd; - blend_attachment_state.srcColorBlendFactor = vk::BlendFactor::eOne; - blend_attachment_state.dstColorBlendFactor = vk::BlendFactor::eOne; - blend_attachment_state.alphaBlendOp = vk::BlendOp::eAdd; - blend_attachment_state.srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha; - blend_attachment_state.dstAlphaBlendFactor = vk::BlendFactor::eDstAlpha; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.blendEnable = true, + .srcColorBlendFactor = vk::BlendFactor::eOne, + .dstColorBlendFactor = vk::BlendFactor::eOne, + .colorBlendOp = vk::BlendOp::eAdd, + .srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha, + .dstAlphaBlendFactor = vk::BlendFactor::eDstAlpha, + .alphaBlendOp = vk::BlendOp::eAdd, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -344,12 +358,11 @@ vk::Pipeline HPPTimestampQueries::create_bloom_pipeline(uint32_t direction) vk::Pipeline HPPTimestampQueries::create_composition_pipeline() { - std::vector shader_stages{load_shader("hdr", "composition.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("hdr", "composition.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("hdr", "composition.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("hdr", "composition.frag.spv", vk::ShaderStageFlagBits::eFragment)}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; @@ -376,59 +389,60 @@ vk::Pipeline HPPTimestampQueries::create_composition_pipeline() vk::RenderPass HPPTimestampQueries::create_filter_render_pass() { // Set up separate renderpass with references to the color and depth attachments - vk::AttachmentDescription attachment_description; - attachment_description.samples = vk::SampleCountFlagBits::e1; - attachment_description.loadOp = vk::AttachmentLoadOp::eClear; - attachment_description.storeOp = vk::AttachmentStoreOp::eStore; - attachment_description.stencilLoadOp = vk::AttachmentLoadOp::eDontCare; - attachment_description.stencilStoreOp = vk::AttachmentStoreOp::eDontCare; - attachment_description.initialLayout = vk::ImageLayout::eUndefined; - attachment_description.finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal; - attachment_description.format = filter_pass.color.format; - - vk::AttachmentReference color_reference(0, vk::ImageLayout::eColorAttachmentOptimal); - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics, {}, color_reference); + vk::AttachmentDescription attachment_description{.format = filter_pass.color.format, + .samples = vk::SampleCountFlagBits::e1, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + .stencilLoadOp = vk::AttachmentLoadOp::eDontCare, + .stencilStoreOp = vk::AttachmentStoreOp::eDontCare, + .initialLayout = vk::ImageLayout::eUndefined, + .finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal}; + + vk::AttachmentReference color_reference{.attachment = 0, .layout = vk::ImageLayout::eColorAttachmentOptimal}; + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, .colorAttachmentCount = 1, .pColorAttachments = &color_reference}; return create_render_pass({attachment_description}, subpass); } vk::Image HPPTimestampQueries::create_image(vk::Format format, vk::ImageUsageFlagBits usage) { - vk::ImageCreateInfo image_create_info; - image_create_info.imageType = vk::ImageType::e2D; - image_create_info.format = format; - image_create_info.extent = vk::Extent3D(offscreen.extent, 1); - image_create_info.mipLevels = 1; - image_create_info.arrayLayers = 1; - image_create_info.samples = vk::SampleCountFlagBits::e1; - image_create_info.tiling = vk::ImageTiling::eOptimal; - image_create_info.usage = usage | vk::ImageUsageFlagBits::eSampled; + vk::ImageCreateInfo image_create_info{.imageType = vk::ImageType::e2D, + .format = format, + .extent = {offscreen.extent.width, offscreen.extent.height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eOptimal, + .usage = usage | vk::ImageUsageFlagBits::eSampled}; return get_device().get_handle().createImage(image_create_info); } vk::Pipeline HPPTimestampQueries::create_models_pipeline(uint32_t shaderType, vk::CullModeFlagBits cullMode, bool depthTestAndWrite) { - std::vector shader_stages{load_shader("hdr", "gbuffer.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("hdr", "gbuffer.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages{load_shader("hdr", "gbuffer.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("hdr", "gbuffer.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Set constant parameters via specialization constants - vk::SpecializationMapEntry specialization_map_entry(0, 0, sizeof(uint32_t)); + vk::SpecializationMapEntry specialization_map_entry{0, 0, sizeof(uint32_t)}; // Set constant parameters via specialization constants - vk::SpecializationInfo specialization_info = vk::SpecializationInfo(1, &specialization_map_entry, sizeof(uint32_t), &shaderType); - shader_stages[0].pSpecializationInfo = &specialization_info; - shader_stages[1].pSpecializationInfo = &specialization_info; + vk::SpecializationInfo specialization_info{1, &specialization_map_entry, sizeof(uint32_t), &shaderType}; + shader_stages[0].pSpecializationInfo = &specialization_info; + shader_stages[1].pSpecializationInfo = &specialization_info; // Vertex bindings an attributes for model rendering // Binding description - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; // Attribute descriptions std::vector vertex_input_attributes = {{0, 0, vk::Format::eR32G32B32Sfloat, 0}, {1, 0, vk::Format::eR32G32B32Sfloat, 3 * sizeof(float)}}; - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; std::vector blend_attachment_states(2); blend_attachment_states[0].colorWriteMask = @@ -484,9 +498,12 @@ vk::RenderPass HPPTimestampQueries::create_offscreen_render_pass() std::array color_references{{{0, vk::ImageLayout::eColorAttachmentOptimal}, {1, vk::ImageLayout::eColorAttachmentOptimal}}}; - vk::AttachmentReference depth_reference(2, vk::ImageLayout::eDepthStencilAttachmentOptimal); + vk::AttachmentReference depth_reference{2, vk::ImageLayout::eDepthStencilAttachmentOptimal}; - vk::SubpassDescription subpass({}, vk::PipelineBindPoint::eGraphics, nullptr, color_references, nullptr, &depth_reference); + vk::SubpassDescription subpass{.pipelineBindPoint = vk::PipelineBindPoint::eGraphics, + .colorAttachmentCount = static_cast(color_references.size()), + .pColorAttachments = color_references.data(), + .pDepthStencilAttachment = &depth_reference}; return create_render_pass(attachment_descriptions, subpass); } @@ -517,7 +534,12 @@ vk::RenderPass HPPTimestampQueries::create_render_pass(std::vector(attachment_descriptions.size()), + .pAttachments = attachment_descriptions.data(), + .subpassCount = 1, + .pSubpasses = &subpass_description, + .dependencyCount = static_cast(subpass_dependencies.size()), + .pDependencies = subpass_dependencies.data()}; return get_device().get_handle().createRenderPass(render_pass_create_info); } @@ -587,8 +609,8 @@ void HPPTimestampQueries::prepare_bloom() {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; vk::Device device = get_device().get_handle(); - bloom.descriptor_set_layout = device.createDescriptorSetLayout({{}, bindings}); - bloom.pipeline_layout = device.createPipelineLayout({{}, bloom.descriptor_set_layout}); + bloom.descriptor_set_layout = device.createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); + bloom.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &bloom.descriptor_set_layout}); bloom.pipelines[0] = create_bloom_pipeline(1); bloom.pipelines[1] = create_bloom_pipeline(0); bloom.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, bloom.descriptor_set_layout); @@ -610,11 +632,12 @@ void HPPTimestampQueries::prepare_composition() std::array bindings = {{{0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - vk::Device device = get_device().get_handle(); - composition.descriptor_set_layout = device.createDescriptorSetLayout({{}, bindings}); - composition.pipeline_layout = device.createPipelineLayout({{}, composition.descriptor_set_layout}); - composition.pipeline = create_composition_pipeline(); - composition.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, composition.descriptor_set_layout); + vk::Device device = get_device().get_handle(); + composition.descriptor_set_layout = + device.createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); + composition.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &composition.descriptor_set_layout}); + composition.pipeline = create_composition_pipeline(); + composition.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, composition.descriptor_set_layout); update_composition_descriptor_set(); } @@ -625,8 +648,8 @@ void HPPTimestampQueries::prepare_models() {2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eFragment}}}; vk::Device device = get_device().get_handle(); - models.descriptor_set_layout = device.createDescriptorSetLayout({{}, bindings}); - models.pipeline_layout = device.createPipelineLayout({{}, models.descriptor_set_layout}); + models.descriptor_set_layout = device.createDescriptorSetLayout({.bindingCount = static_cast(bindings.size()), .pBindings = bindings.data()}); + models.pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &models.descriptor_set_layout}); models.objects.descriptor_set = vkb::common::allocate_descriptor_set(device, descriptor_pool, models.descriptor_set_layout); update_model_descriptor_set(models.objects.descriptor_set); @@ -715,9 +738,16 @@ void HPPTimestampQueries::update_composition_descriptor_set() std::array color_descriptors = {{{offscreen.sampler, offscreen.color[0].view, vk::ImageLayout::eShaderReadOnlyOptimal}, {offscreen.sampler, filter_pass.color.view, vk::ImageLayout::eShaderReadOnlyOptimal}}}; - std::array sampler_write_descriptor_sets = { - {{composition.descriptor_set, 0, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[0]}, - {composition.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[1]}}}; + std::array sampler_write_descriptor_sets = {{{.dstSet = composition.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[0]}, + {.dstSet = composition.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[1]}}}; get_device().get_handle().updateDescriptorSets(sampler_write_descriptor_sets, {}); } @@ -727,28 +757,46 @@ void HPPTimestampQueries::update_bloom_descriptor_set() std::array color_descriptors = {{{offscreen.sampler, offscreen.color[0].view, vk::ImageLayout::eShaderReadOnlyOptimal}, {offscreen.sampler, offscreen.color[1].view, vk::ImageLayout::eShaderReadOnlyOptimal}}}; - std::array sampler_write_descriptor_sets = { - {{bloom.descriptor_set, 0, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[0]}, - {bloom.descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, color_descriptors[1]}}}; + std::array sampler_write_descriptor_sets = {{{.dstSet = bloom.descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[0]}, + {.dstSet = bloom.descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &color_descriptors[1]}}}; get_device().get_handle().updateDescriptorSets(sampler_write_descriptor_sets, {}); } void HPPTimestampQueries::update_model_descriptor_set(vk::DescriptorSet descriptor_set) { - vk::DescriptorBufferInfo matrix_buffer_descriptor(uniform_buffers.matrices->get_handle(), 0, VK_WHOLE_SIZE); - - vk::DescriptorImageInfo environment_image_descriptor( - textures.envmap.sampler, - textures.envmap.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, textures.envmap.image->get_vk_image_view().get_format())); - - vk::DescriptorBufferInfo params_buffer_descriptor(uniform_buffers.params->get_handle(), 0, VK_WHOLE_SIZE); - - std::array write_descriptor_sets = { - {{descriptor_set, 0, 0, vk::DescriptorType::eUniformBuffer, {}, matrix_buffer_descriptor}, - {descriptor_set, 1, 0, vk::DescriptorType::eCombinedImageSampler, environment_image_descriptor}, - {descriptor_set, 2, 0, vk::DescriptorType::eUniformBuffer, {}, params_buffer_descriptor}}}; + vk::DescriptorBufferInfo matrix_buffer_descriptor{uniform_buffers.matrices->get_handle(), 0, vk::WholeSize}; + + vk::DescriptorImageInfo environment_image_descriptor{textures.envmap.sampler, + textures.envmap.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + textures.envmap.image->get_vk_image_view().get_format())}; + + vk::DescriptorBufferInfo params_buffer_descriptor{uniform_buffers.params->get_handle(), 0, vk::WholeSize}; + + std::array write_descriptor_sets = {{{.dstSet = descriptor_set, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = &matrix_buffer_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &environment_image_descriptor}, + {.dstSet = descriptor_set, + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eUniformBuffer, + .pBufferInfo = ¶ms_buffer_descriptor}}}; get_device().get_handle().updateDescriptorSets(write_descriptor_sets, {}); } diff --git a/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.h b/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.h index 0f4631e6c4..086d75f30b 100644 --- a/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.h +++ b/samples/api/hpp_timestamp_queries/hpp_timestamp_queries.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2023-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -195,7 +195,7 @@ class HPPTimestampQueries : public HPPApiVulkanSample virtual bool resize(const uint32_t width, const uint32_t height) override; // from vkb::VulkanSample - virtual void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample virtual void build_command_buffers() override; diff --git a/samples/api/instancing/CMakeLists.txt b/samples/api/instancing/CMakeLists.txt index 7949ea5689..9085e4fab1 100644 --- a/samples/api/instancing/CMakeLists.txt +++ b/samples/api/instancing/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "instancing/hlsl/planet.vert.hlsl" "instancing/hlsl/planet.frag.hlsl" "instancing/hlsl/starfield.vert.hlsl" - "instancing/hlsl/starfield.frag.hlsl") + "instancing/hlsl/starfield.frag.hlsl" + SHADER_FILES_SLANG + "instancing/slang/instancing.vert.slang" + "instancing/slang/instancing.frag.slang" + "instancing/slang/planet.vert.slang" + "instancing/slang/planet.frag.slang" + "instancing/slang/starfield.vert.slang" + "instancing/slang/starfield.frag.slang") diff --git a/samples/api/instancing/instancing.cpp b/samples/api/instancing/instancing.cpp index 17d2601694..33e7c299d9 100644 --- a/samples/api/instancing/instancing.cpp +++ b/samples/api/instancing/instancing.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -42,7 +42,7 @@ Instancing::~Instancing() } } -void Instancing::request_gpu_features(vkb::PhysicalDevice &gpu) +void Instancing::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { auto &requested_features = gpu.get_mutable_requested_features(); @@ -332,16 +332,16 @@ void Instancing::prepare_pipelines() pipeline_create_info.pVertexInputState = &input_state; // Instancing pipeline - shader_stages[0] = load_shader("instancing", "instancing.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("instancing", "instancing.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("instancing", "instancing.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("instancing", "instancing.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Use all input bindings and attribute descriptions input_state.vertexBindingDescriptionCount = static_cast(binding_descriptions.size()); input_state.vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.instanced_rocks)); // Planet rendering pipeline - shader_stages[0] = load_shader("instancing", "planet.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("instancing", "planet.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("instancing", "planet.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("instancing", "planet.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Only use the non-instanced input bindings and attribute descriptions input_state.vertexBindingDescriptionCount = 1; input_state.vertexAttributeDescriptionCount = 3; @@ -351,8 +351,8 @@ void Instancing::prepare_pipelines() rasterization_state.cullMode = VK_CULL_MODE_NONE; depth_stencil_state.depthWriteEnable = VK_FALSE; depth_stencil_state.depthTestEnable = VK_FALSE; - shader_stages[0] = load_shader("instancing", "starfield.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("instancing", "starfield.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("instancing", "starfield.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("instancing", "starfield.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertices are generated in the vertex shader input_state.vertexBindingDescriptionCount = 0; input_state.vertexAttributeDescriptionCount = 0; diff --git a/samples/api/instancing/instancing.h b/samples/api/instancing/instancing.h index fb8a1bc52b..22c3c2da0a 100644 --- a/samples/api/instancing/instancing.h +++ b/samples/api/instancing/instancing.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -91,7 +91,7 @@ class Instancing : public ApiVulkanSample Instancing(); ~Instancing(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void load_assets(); void setup_descriptor_pool(); diff --git a/samples/api/oit_depth_peeling/oit_depth_peeling.cpp b/samples/api/oit_depth_peeling/oit_depth_peeling.cpp index f9e3c4ae4a..b8da7ab844 100644 --- a/samples/api/oit_depth_peeling/oit_depth_peeling.cpp +++ b/samples/api/oit_depth_peeling/oit_depth_peeling.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Google +/* Copyright (c) 2024-2025, Google * * SPDX-License-Identifier: Apache-2.0 * @@ -106,7 +106,7 @@ void OITDepthPeeling::render(float delta_time) update_scene_constants(); } -void OITDepthPeeling::request_gpu_features(vkb::PhysicalDevice &gpu) +void OITDepthPeeling::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().samplerAnisotropy) { @@ -513,12 +513,12 @@ void OITDepthPeeling::create_pipelines() vertex_input_state.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); - shader_stages[0] = load_shader("oit_depth_peeling/gather.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("oit_depth_peeling/gather_first.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("oit_depth_peeling/gather.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("oit_depth_peeling/gather_first.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &gather_first_pipeline)); - shader_stages[1] = load_shader("oit_depth_peeling/gather.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[1] = load_shader("oit_depth_peeling/gather.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &gather_pipeline)); } @@ -534,8 +534,8 @@ void OITDepthPeeling::create_pipelines() pipeline_create_info.renderPass = render_pass; { - shader_stages[0] = load_shader("oit_depth_peeling/fullscreen.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("oit_depth_peeling/background.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("oit_depth_peeling/fullscreen.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("oit_depth_peeling/background.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &background_pipeline)); } @@ -549,8 +549,8 @@ void OITDepthPeeling::create_pipelines() blend_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; blend_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD; - shader_stages[0] = load_shader("oit_depth_peeling/fullscreen.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("oit_depth_peeling/combine.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("oit_depth_peeling/fullscreen.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("oit_depth_peeling/combine.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &combine_pipeline)); } diff --git a/samples/api/oit_depth_peeling/oit_depth_peeling.h b/samples/api/oit_depth_peeling/oit_depth_peeling.h index 80a1ad801b..98c654648d 100644 --- a/samples/api/oit_depth_peeling/oit_depth_peeling.h +++ b/samples/api/oit_depth_peeling/oit_depth_peeling.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Google +/* Copyright (c) 2024-2025, Google * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ class OITDepthPeeling : public ApiVulkanSample bool resize(const uint32_t width, const uint32_t height) override; void render(float delta_time) override; void build_command_buffers() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; private: @@ -93,12 +93,12 @@ class OITDepthPeeling : public ApiVulkanSample VkDescriptorPool descriptor_pool = VK_NULL_HANDLE; - VkPipelineLayout gather_pipeline_layout; - VkPipeline gather_first_pipeline; - VkPipeline gather_pipeline; - VkPipelineLayout combine_pipeline_layout; - VkPipeline combine_pipeline; - VkPipeline background_pipeline; + VkPipelineLayout gather_pipeline_layout = VK_NULL_HANDLE; + VkPipeline gather_first_pipeline = VK_NULL_HANDLE; + VkPipeline gather_pipeline = VK_NULL_HANDLE; + VkPipelineLayout combine_pipeline_layout = VK_NULL_HANDLE; + VkPipeline combine_pipeline = VK_NULL_HANDLE; + VkPipeline background_pipeline = VK_NULL_HANDLE; int32_t camera_auto_rotation = false; float background_grayscale = 0.3f; diff --git a/samples/api/oit_linked_lists/oit_linked_lists.cpp b/samples/api/oit_linked_lists/oit_linked_lists.cpp index 989016bd14..a854e5225a 100644 --- a/samples/api/oit_linked_lists/oit_linked_lists.cpp +++ b/samples/api/oit_linked_lists/oit_linked_lists.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Google +/* Copyright (c) 2023-2025, Google * * SPDX-License-Identifier: Apache-2.0 * @@ -105,7 +105,7 @@ void OITLinkedLists::render(float delta_time) update_scene_constants(); } -void OITLinkedLists::request_gpu_features(vkb::PhysicalDevice &gpu) +void OITLinkedLists::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().fragmentStoresAndAtomics) { @@ -422,8 +422,8 @@ void OITLinkedLists::create_pipelines() vertex_input_state.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); - shader_stages[0] = load_shader("oit_linked_lists/gather.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("oit_linked_lists/gather.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("oit_linked_lists/gather.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("oit_linked_lists/gather.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.renderPass = gather_render_pass; @@ -436,8 +436,8 @@ void OITLinkedLists::create_pipelines() vertex_input_state.vertexAttributeDescriptionCount = 0; vertex_input_state.pVertexAttributeDescriptions = nullptr; - shader_stages[0] = load_shader("oit_linked_lists/fullscreen.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("oit_linked_lists/background.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("oit_linked_lists/fullscreen.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("oit_linked_lists/background.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.renderPass = render_pass; @@ -458,8 +458,8 @@ void OITLinkedLists::create_pipelines() blend_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; blend_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD; - shader_stages[0] = load_shader("oit_linked_lists/combine.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("oit_linked_lists/combine.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("oit_linked_lists/combine.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("oit_linked_lists/combine.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.renderPass = render_pass; diff --git a/samples/api/oit_linked_lists/oit_linked_lists.h b/samples/api/oit_linked_lists/oit_linked_lists.h index 4c1cc59b7a..543c678357 100644 --- a/samples/api/oit_linked_lists/oit_linked_lists.h +++ b/samples/api/oit_linked_lists/oit_linked_lists.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Google +/* Copyright (c) 2023-2025, Google * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ class OITLinkedLists : public ApiVulkanSample bool resize(const uint32_t width, const uint32_t height) override; void render(float delta_time) override; void build_command_buffers() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; private: @@ -102,10 +102,10 @@ class OITLinkedLists : public ApiVulkanSample VkDescriptorPool descriptor_pool = VK_NULL_HANDLE; VkDescriptorSet descriptor_set = VK_NULL_HANDLE; - VkPipelineLayout pipeline_layout; - VkPipeline gather_pipeline; - VkPipeline background_pipeline; - VkPipeline combine_pipeline; + VkPipelineLayout pipeline_layout = VK_NULL_HANDLE; + VkPipeline gather_pipeline = VK_NULL_HANDLE; + VkPipeline background_pipeline = VK_NULL_HANDLE; + VkPipeline combine_pipeline = VK_NULL_HANDLE; int32_t sort_fragments = true; int32_t camera_auto_rotation = false; diff --git a/samples/api/separate_image_sampler/CMakeLists.txt b/samples/api/separate_image_sampler/CMakeLists.txt index 73888bd4d5..35a4f21bc0 100644 --- a/samples/api/separate_image_sampler/CMakeLists.txt +++ b/samples/api/separate_image_sampler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, Sascha Willems +# Copyright (c) 2021-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "separate_image_sampler/glsl/separate_image_sampler.frag" SHADER_FILES_HLSL "separate_image_sampler/hlsl/separate_image_sampler.vert.hlsl" - "separate_image_sampler/hlsl/separate_image_sampler.frag.hlsl") \ No newline at end of file + "separate_image_sampler/hlsl/separate_image_sampler.frag.hlsl" + SHADER_FILES_SLANG + "separate_image_sampler/slang/separate_image_sampler.vert.slang" + "separate_image_sampler/slang/separate_image_sampler.frag.slang") \ No newline at end of file diff --git a/samples/api/separate_image_sampler/separate_image_sampler.cpp b/samples/api/separate_image_sampler/separate_image_sampler.cpp index 8ba331fa5d..3559e75cf5 100644 --- a/samples/api/separate_image_sampler/separate_image_sampler.cpp +++ b/samples/api/separate_image_sampler/separate_image_sampler.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -50,7 +50,7 @@ SeparateImageSampler::~SeparateImageSampler() } // Enable physical device features required for this example -void SeparateImageSampler::request_gpu_features(vkb::PhysicalDevice &gpu) +void SeparateImageSampler::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -377,8 +377,8 @@ void SeparateImageSampler::prepare_pipelines() // Load shaders std::array shader_stages{}; - shader_stages[0] = load_shader("separate_image_sampler", "separate_image_sampler.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("separate_image_sampler", "separate_image_sampler.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("separate_image_sampler", "separate_image_sampler.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("separate_image_sampler", "separate_image_sampler.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/api/separate_image_sampler/separate_image_sampler.h b/samples/api/separate_image_sampler/separate_image_sampler.h index a2b9c6b575..42c65e037f 100644 --- a/samples/api/separate_image_sampler/separate_image_sampler.h +++ b/samples/api/separate_image_sampler/separate_image_sampler.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -64,7 +64,7 @@ class SeparateImageSampler : public ApiVulkanSample SeparateImageSampler(); ~SeparateImageSampler() override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void setup_samplers(); void load_assets(); diff --git a/samples/api/swapchain_recreation/swapchain_recreation.cpp b/samples/api/swapchain_recreation/swapchain_recreation.cpp index 755c2f9324..daf14227cd 100644 --- a/samples/api/swapchain_recreation/swapchain_recreation.cpp +++ b/samples/api/swapchain_recreation/swapchain_recreation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Google +/* Copyright (c) 2023-2025, Google * * SPDX-License-Identifier: Apache-2.0 * @@ -20,13 +20,12 @@ #include "common/vk_common.h" #include "core/util/logging.hpp" #include "filesystem/legacy.h" -#include "glsl_compiler.h" static constexpr uint32_t INVALID_IMAGE_INDEX = std::numeric_limits::max(); void SwapchainRecreation::get_queue() { - queue = &get_device().get_suitable_graphics_queue(); + queue = &get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); // Make sure presentation is supported on this queue. This is practically always the case; // if a platform/driver is found where this is not true, all queues supporting @@ -101,13 +100,13 @@ void SwapchainRecreation::adjust_desired_present_mode() // When switching to MAILBOX, fallback to IMMEDIATE if not available and back to FIFO if // neither are available. - if (desired_present_mode == VK_PRESENT_MODE_MAILBOX_KHR && std::find(present_modes.begin(), present_modes.end(), desired_present_mode) != present_modes.end()) + if (desired_present_mode == VK_PRESENT_MODE_MAILBOX_KHR && std::ranges::find(present_modes, desired_present_mode) != present_modes.end()) { return; } desired_present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR; - if (std::find(present_modes.begin(), present_modes.end(), desired_present_mode) == present_modes.end()) + if (std::ranges::find(present_modes, desired_present_mode) == present_modes.end()) { LOGW("Neither MAILBOX nor IMMEDIATE are supported, falling back to FIFO"); desired_present_mode = VK_PRESENT_MODE_FIFO_KHR; @@ -164,7 +163,7 @@ bool SwapchainRecreation::are_present_modes_compatible() // While this functionality was introduced by VK_EXT_surface_maintenance1, compatible_modes // is always set up such that every present mode is assumed to be compatible only with // itself; there is no need for an extension check here. - return std::find(compatible_modes.begin(), compatible_modes.end(), desired_present_mode) != compatible_modes.end(); + return std::ranges::find(compatible_modes, desired_present_mode) != compatible_modes.end(); } /** @@ -684,7 +683,7 @@ void SwapchainRecreation::cleanup_present_history() // Move clean up data to the next (now first) present operation, if any. Note that // there cannot be any clean up data on the rest of the present operations, because // the first present already gathers every old swapchain to clean up. - assert(std::all_of(present_history.begin(), present_history.end(), [](const PresentOperationInfo &op) { + assert(std::ranges::all_of(present_history, [](const PresentOperationInfo &op) { return op.old_swapchains.empty(); })); present_history.front().old_swapchains = std::move(present_info.old_swapchains); @@ -904,6 +903,7 @@ SwapchainRecreation::SwapchainRecreation() else { LOGI("Disabling usage of VK_EXT_surface_maintenance1 due to USE_MAINTENANCE1=no"); + allow_maintenance1 = false; } } @@ -973,13 +973,21 @@ SwapchainRecreation::~SwapchainRecreation() } } -std::unique_ptr SwapchainRecreation::create_device(vkb::PhysicalDevice &gpu) +void SwapchainRecreation::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - std::unique_ptr device = vkb::VulkanSampleC::create_device(gpu); + if (allow_maintenance1) + { + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT, swapchainMaintenance1); + } +} + +std::unique_ptr SwapchainRecreation::create_device(vkb::core::PhysicalDeviceC &gpu) +{ + std::unique_ptr device = vkb::VulkanSampleC::create_device(gpu); has_maintenance1 = get_instance().is_enabled(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME) && get_instance().is_enabled(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME) && - device->is_enabled(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME); + device->is_extension_enabled(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME); LOGI("------------------------------------"); LOGI("USAGE:"); diff --git a/samples/api/swapchain_recreation/swapchain_recreation.h b/samples/api/swapchain_recreation/swapchain_recreation.h index 3adb2ac5d2..16351c5905 100644 --- a/samples/api/swapchain_recreation/swapchain_recreation.h +++ b/samples/api/swapchain_recreation/swapchain_recreation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Google +/* Copyright (c) 2023-2025, Google * * SPDX-License-Identifier: Apache-2.0 * @@ -112,8 +112,12 @@ class SwapchainRecreation : public vkb::VulkanSampleC /// Submission and present queue. const vkb::Queue *queue = nullptr; + /// Allow enabling VK_EXT_surface_maintenance1 and VK_EXT_swapchain_maintenance1. + /// + /// Can be set to false by setting environment variable `USE_MAINTENANCE1=no` + bool allow_maintenance1 = true; /// Whether the VK_EXT_surface_maintenance1 and VK_EXT_swapchain_maintenance1 extensions are - /// to be used. + /// enabled. bool has_maintenance1 = false; /// Surface data. @@ -168,7 +172,9 @@ class SwapchainRecreation : public vkb::VulkanSampleC // User toggles. bool recreate_swapchain_on_present_mode_change = false; - std::unique_ptr create_device(vkb::PhysicalDevice &gpu) override; + // from vkb::VulkanSample + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + std::unique_ptr create_device(vkb::core::PhysicalDeviceC &gpu) override; void get_queue(); void query_surface_format(); diff --git a/samples/api/terrain_tessellation/CMakeLists.txt b/samples/api/terrain_tessellation/CMakeLists.txt index b6e820f9fc..c7941b27fc 100644 --- a/samples/api/terrain_tessellation/CMakeLists.txt +++ b/samples/api/terrain_tessellation/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "terrain_tessellation/hlsl/terrain.tesc.hlsl" "terrain_tessellation/hlsl/terrain.tese.hlsl" "terrain_tessellation/hlsl/skysphere.vert.hlsl" - "terrain_tessellation/hlsl/skysphere.frag.hlsl") + "terrain_tessellation/hlsl/skysphere.frag.hlsl" + SHADER_FILES_SLANG + "terrain_tessellation/slang/terrain.vert.slang" + "terrain_tessellation/slang/terrain.frag.slang" + "terrain_tessellation/slang/terrain.tesc.slang" + "terrain_tessellation/slang/terrain.tese.slang" + "terrain_tessellation/slang/skysphere.vert.slang" + "terrain_tessellation/slang/skysphere.frag.slang") diff --git a/samples/api/terrain_tessellation/terrain_tessellation.cpp b/samples/api/terrain_tessellation/terrain_tessellation.cpp index 062fa0a105..4a2d8382b4 100644 --- a/samples/api/terrain_tessellation/terrain_tessellation.cpp +++ b/samples/api/terrain_tessellation/terrain_tessellation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -64,7 +64,7 @@ TerrainTessellation::~TerrainTessellation() } } -void TerrainTessellation::request_gpu_features(vkb::PhysicalDevice &gpu) +void TerrainTessellation::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { auto &requested_features = gpu.get_mutable_requested_features(); @@ -573,10 +573,10 @@ void TerrainTessellation::prepare_pipelines() std::array shader_stages; // Terrain tessellation pipeline - shader_stages[0] = load_shader("terrain_tessellation", "terrain.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("terrain_tessellation", "terrain.frag", VK_SHADER_STAGE_FRAGMENT_BIT); - shader_stages[2] = load_shader("terrain_tessellation", "terrain.tesc", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); - shader_stages[3] = load_shader("terrain_tessellation", "terrain.tese", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); + shader_stages[0] = load_shader("terrain_tessellation", "terrain.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("terrain_tessellation", "terrain.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[2] = load_shader("terrain_tessellation", "terrain.tesc.spv", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); + shader_stages[3] = load_shader("terrain_tessellation", "terrain.tese.spv", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(pipeline_layouts.terrain, render_pass, 0); @@ -617,8 +617,8 @@ void TerrainTessellation::prepare_pipelines() depth_stencil_state.depthWriteEnable = VK_FALSE; pipeline_create_info.stageCount = 2; pipeline_create_info.layout = pipeline_layouts.skysphere; - shader_stages[0] = load_shader("terrain_tessellation", "skysphere.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("terrain_tessellation", "skysphere.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("terrain_tessellation", "skysphere.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("terrain_tessellation", "skysphere.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.skysphere)); } diff --git a/samples/api/terrain_tessellation/terrain_tessellation.h b/samples/api/terrain_tessellation/terrain_tessellation.h index f734c9fffd..76e6e81a12 100644 --- a/samples/api/terrain_tessellation/terrain_tessellation.h +++ b/samples/api/terrain_tessellation/terrain_tessellation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -114,7 +114,7 @@ class TerrainTessellation : public ApiVulkanSample TerrainTessellation(); ~TerrainTessellation(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void setup_query_result_buffer(); void get_query_results(); void load_assets(); diff --git a/samples/api/texture_loading/CMakeLists.txt b/samples/api/texture_loading/CMakeLists.txt index 3ac1d5e1a9..59be6547ea 100644 --- a/samples/api/texture_loading/CMakeLists.txt +++ b/samples/api/texture_loading/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "texture_loading/glsl/texture.frag" SHADER_FILES_HLSL "texture_loading/hlsl/texture.vert.hlsl" - "texture_loading/hlsl/texture.frag.hlsl") \ No newline at end of file + "texture_loading/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_loading/slang/texture.vert.slang" + "texture_loading/slang/texture.frag.slang") \ No newline at end of file diff --git a/samples/api/texture_loading/texture_loading.cpp b/samples/api/texture_loading/texture_loading.cpp index ee6f9a3407..61b939ff08 100644 --- a/samples/api/texture_loading/texture_loading.cpp +++ b/samples/api/texture_loading/texture_loading.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -49,7 +49,7 @@ TextureLoading::~TextureLoading() } // Enable physical device features required for this example -void TextureLoading::request_gpu_features(vkb::PhysicalDevice &gpu) +void TextureLoading::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -139,7 +139,8 @@ void TextureLoading::load_texture() vkGetBufferMemoryRequirements(get_device().get_handle(), staging_buffer, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; // Get memory type index for a host visible buffer - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + memory_allocate_info.memoryTypeIndex = + get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &staging_memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), staging_buffer, staging_memory, 0)); @@ -185,7 +186,7 @@ void TextureLoading::load_texture() vkGetImageMemoryRequirements(get_device().get_handle(), texture.image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &texture.device_memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), texture.image, texture.device_memory, 0)); @@ -288,7 +289,8 @@ void TextureLoading::load_texture() // Set memory allocation size to required memory size memory_allocate_info.allocationSize = memory_requirements.size; // Get memory type that can be mapped to host memory - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + memory_allocate_info.memoryTypeIndex = + get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &mappable_memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), mappable_image, mappable_memory, 0)); @@ -647,8 +649,8 @@ void TextureLoading::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("texture_loading", "texture.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("texture_loading", "texture.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("texture_loading", "texture.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("texture_loading", "texture.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/api/texture_loading/texture_loading.h b/samples/api/texture_loading/texture_loading.h index 3484b6538c..ac05ee715d 100644 --- a/samples/api/texture_loading/texture_loading.h +++ b/samples/api/texture_loading/texture_loading.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -74,7 +74,7 @@ class TextureLoading : public ApiVulkanSample TextureLoading(); ~TextureLoading(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void load_texture(); void destroy_texture(Texture texture); void build_command_buffers() override; diff --git a/samples/api/texture_mipmap_generation/CMakeLists.txt b/samples/api/texture_mipmap_generation/CMakeLists.txt index 5dd0bb2b3f..1def9b134b 100644 --- a/samples/api/texture_mipmap_generation/CMakeLists.txt +++ b/samples/api/texture_mipmap_generation/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "texture_mipmap_generation/glsl/texture.frag" SHADER_FILES_HLSL "texture_mipmap_generation/hlsl/texture.vert.hlsl" - "texture_mipmap_generation/hlsl/texture.frag.hlsl") \ No newline at end of file + "texture_mipmap_generation/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_mipmap_generation/slang/texture.vert.slang" + "texture_mipmap_generation/slang/texture.frag.slang") \ No newline at end of file diff --git a/samples/api/texture_mipmap_generation/texture_mipmap_generation.cpp b/samples/api/texture_mipmap_generation/texture_mipmap_generation.cpp index 8da789c1ba..139aeb5684 100644 --- a/samples/api/texture_mipmap_generation/texture_mipmap_generation.cpp +++ b/samples/api/texture_mipmap_generation/texture_mipmap_generation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -45,7 +45,7 @@ TextureMipMapGeneration::~TextureMipMapGeneration() } // Enable physical device features required for this example -void TextureMipMapGeneration::request_gpu_features(vkb::PhysicalDevice &gpu) +void TextureMipMapGeneration::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -109,7 +109,8 @@ void TextureMipMapGeneration::load_texture_generate_mipmaps(std::string file_nam vkGetBufferMemoryRequirements(get_device().get_handle(), staging_buffer, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; // Get memory type index for a host visible buffer - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + memory_allocate_info.memoryTypeIndex = + get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &staging_memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), staging_buffer, staging_memory, 0)); @@ -138,7 +139,7 @@ void TextureMipMapGeneration::load_texture_generate_mipmaps(std::string file_nam vkGetImageMemoryRequirements(get_device().get_handle(), texture.image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &texture.device_memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), texture.image, texture.device_memory, 0)); @@ -511,8 +512,8 @@ void TextureMipMapGeneration::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("texture_mipmap_generation", "texture.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("texture_mipmap_generation", "texture.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("texture_mipmap_generation", "texture.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("texture_mipmap_generation", "texture.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/api/texture_mipmap_generation/texture_mipmap_generation.h b/samples/api/texture_mipmap_generation/texture_mipmap_generation.h index 9fb993ab8c..3796a7706f 100644 --- a/samples/api/texture_mipmap_generation/texture_mipmap_generation.h +++ b/samples/api/texture_mipmap_generation/texture_mipmap_generation.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -70,7 +70,7 @@ class TextureMipMapGeneration : public ApiVulkanSample TextureMipMapGeneration(); ~TextureMipMapGeneration(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void load_texture_generate_mipmaps(std::string file_name); void destroy_texture(Texture texture); void load_assets(); diff --git a/samples/api/timestamp_queries/CMakeLists.txt b/samples/api/timestamp_queries/CMakeLists.txt index 437f98b41a..49388a3c3b 100644 --- a/samples/api/timestamp_queries/CMakeLists.txt +++ b/samples/api/timestamp_queries/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, Sascha Willems +# Copyright (c) 2022-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "hdr/hlsl/bloom.vert.hlsl" "hdr/hlsl/bloom.frag.hlsl" "hdr/hlsl/gbuffer.vert.hlsl" - "hdr/hlsl/gbuffer.frag.hlsl") + "hdr/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "hdr/slang/composition.vert.slang" + "hdr/slang/composition.frag.slang" + "hdr/slang/bloom.vert.slang" + "hdr/slang/bloom.frag.slang" + "hdr/slang/gbuffer.vert.slang" + "hdr/slang/gbuffer.frag.slang") diff --git a/samples/api/timestamp_queries/README.adoc b/samples/api/timestamp_queries/README.adoc index f65d4bfa4a..6db9159ad3 100644 --- a/samples/api/timestamp_queries/README.adoc +++ b/samples/api/timestamp_queries/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2022-2024, Sascha Willems +- Copyright (c) 2022-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -32,8 +32,8 @@ improve performance where needed. == Introduction -Vulkan offers several https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#queries[query types] that allow you to query different types of information from the GPU. -One such query type is the https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#queries-timestamps[timestamp query]. +Vulkan offers several https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#queries[query types] that allow you to query different types of information from the GPU. +One such query type is the https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#queries-timestamps[timestamp query]. This provides your application with a mechanism to time the execution of commands on the GPU. As with the other query types, a query pool is then used to either directly fetch or copy over the results to the host. @@ -256,7 +256,7 @@ float delta_in_ms = float(time_stamps[1] - time_stamps[0]) * device_limits.times == vkCmdWriteTimestamp2 -The https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_synchronization2.html[VK_KHR_synchronization2] extension introduced `vkCmdWriteTimestamp2`. +The https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html[VK_KHR_synchronization2] extension introduced `vkCmdWriteTimestamp2`. This is pretty much the same as the `vkCmdWriteTimestamp` function used in this sample, but adds support for some additional pipeline stages using `VkPipelineStageFlags2`. == Verdict diff --git a/samples/api/timestamp_queries/timestamp_queries.cpp b/samples/api/timestamp_queries/timestamp_queries.cpp index 092c02c796..2843c22bc1 100644 --- a/samples/api/timestamp_queries/timestamp_queries.cpp +++ b/samples/api/timestamp_queries/timestamp_queries.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Sascha Willems +/* Copyright (c) 2022-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -67,7 +67,7 @@ TimestampQueries::~TimestampQueries() } } -void TimestampQueries::request_gpu_features(vkb::PhysicalDevice &gpu) +void TimestampQueries::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -284,7 +284,7 @@ void TimestampQueries::create_attachment(VkFormat format, VkImageUsageFlagBits u VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment->image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment->image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment->mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment->image, attachment->mem, 0)); @@ -772,8 +772,8 @@ void TimestampQueries::prepare_pipelines() pipeline_create_info.pVertexInputState = &empty_input_state; // Final fullscreen composition pass pipeline - shader_stages[0] = load_shader("hdr", "composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.layout = pipeline_layouts.composition; pipeline_create_info.renderPass = render_pass; rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; @@ -782,8 +782,8 @@ void TimestampQueries::prepare_pipelines() VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.composition)); // Bloom pass - shader_stages[0] = load_shader("hdr", "bloom.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "bloom.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "bloom.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "bloom.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); color_blend_state.pAttachments = &blend_attachment_state; blend_attachment_state.colorWriteMask = 0xF; blend_attachment_state.blendEnable = VK_TRUE; @@ -837,8 +837,8 @@ void TimestampQueries::prepare_pipelines() color_blend_state.attachmentCount = 2; color_blend_state.pAttachments = blend_attachment_states.data(); - shader_stages[0] = load_shader("hdr", "gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Set constant parameters via specialization constants specialization_map_entries[0] = vkb::initializers::specialization_map_entry(0, 0, sizeof(uint32_t)); @@ -958,7 +958,7 @@ bool TimestampQueries::prepare(const vkb::ApplicationOptions &options) if (!device_limits.timestampComputeAndGraphics) { // Check if the graphics queue used in this sample supports time stamps - VkQueueFamilyProperties graphics_queue_family_properties = get_device().get_suitable_graphics_queue().get_properties(); + VkQueueFamilyProperties graphics_queue_family_properties = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0).get_properties(); if (graphics_queue_family_properties.timestampValidBits == 0) { throw std::runtime_error{"The selected graphics queue family does not support timestamp queries!"}; diff --git a/samples/api/timestamp_queries/timestamp_queries.h b/samples/api/timestamp_queries/timestamp_queries.h index 59baa39c0b..376ef17d14 100644 --- a/samples/api/timestamp_queries/timestamp_queries.h +++ b/samples/api/timestamp_queries/timestamp_queries.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Sascha Willems +/* Copyright (c) 2022-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -134,7 +134,7 @@ class TimestampQueries : public ApiVulkanSample TimestampQueries(); ~TimestampQueries(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void create_attachment(VkFormat format, VkImageUsageFlagBits usage, FrameBufferAttachment *attachment); void prepare_offscreen_buffer(); diff --git a/samples/extensions/README.adoc b/samples/extensions/README.adoc index 148c3a8d1a..cda58c81d6 100644 --- a/samples/extensions/README.adoc +++ b/samples/extensions/README.adoc @@ -1,5 +1,6 @@ //// -- Copyright (c) 2021-2024, The Khronos Group +- Copyright (c) 2025, Arm Limited and Contributors +- Copyright (c) 2021-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,28 +25,28 @@ The goal of these samples is to demonstrate how to use a particular Vulkan exten === xref:./{extension_samplespath}conservative_rasterization/README.adoc[Conservative Rasterization] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_conservative_rasterization[`VK_EXT_conservative_rasterization`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_conservative_rasterization[`VK_EXT_conservative_rasterization`] Uses conservative rasterization to change the way fragments are generated. Enables overestimation to generate fragments for every pixel touched instead of only pixels that are fully covered. === xref:./{extension_samplespath}dynamic_rendering/README.adoc[Dynamic Rendering] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_dynamic_rendering[`VK_KHR_dynamic_rendering`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_dynamic_rendering[`VK_KHR_dynamic_rendering`] Demonstrates how to use Dynamic Rendering. Read the blog post here for discussion: (https://www.khronos.org/blog/streamlining-render-passes) === xref:./{extension_samplespath}dynamic_rendering_local_read/README.adoc[Dynamic Rendering local read] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VK_KHR_dynamic_rendering_local_read[`VK_KHR_dynamic_rendering_local_read`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VK_KHR_dynamic_rendering_local_read[`VK_KHR_dynamic_rendering_local_read`] Demonstrates how to use Dynamic Rendering with local reads to fully replace render passses with multiple subpasses. See this https://www.khronos.org/blog/streamlining-subpasses[this blogpost]. === xref:./{extension_samplespath}push_descriptors/README.adoc[Push Descriptors] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_push_descriptor[`VK_KHR_push_descriptor`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_push_descriptor[`VK_KHR_push_descriptor`] Push descriptors apply the push constants concept to descriptor sets. Instead of creating per-object descriptor sets, this example passes descriptors at command buffer creation time. @@ -56,26 +57,26 @@ A transcoded version of the Extensions sample xref:./{extension_samplespath}push === xref:./{extension_samplespath}debug_utils/README.adoc[Debug Utilities] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_debug_utils[`VK_EXT_debug_utils`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_debug_utils[`VK_EXT_debug_utils`] Uses the debug utilities extension to name and group Vulkan objects (command buffers, images, etc.). This information makes debugging in tools like RenderDoc significantly easier. === xref:./{extension_samplespath}memory_budget/README.adoc[Memory Budget] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_memory_budget[`VK_EXT_memory_budget`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_memory_budget[`VK_EXT_memory_budget`] Uses the memory budget extension to monitor the allocated memory in the GPU and demonstrates how to use it. === xref:./{extension_samplespath}mesh_shader_culling/README.adoc[Mesh Shader Culling] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_mesh_shader[`VK_EXT_mesh_shader`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_mesh_shader[`VK_EXT_mesh_shader`] Uses the mesh shader extension to demonstrate how to do basic culling utilizing both a mesh and a task shader. === xref:./{extension_samplespath}ray_queries/README.adoc[Basic ray queries] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_ray_query[`VK_KHR_ray_query`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_query[`VK_KHR_ray_query`], https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] Render a sponza scene using the ray query extension. Shows how to set up all data structures required for ray queries, including the bottom and top level acceleration structures for the geometry and a standard vertex/fragment shader pipeline. @@ -83,7 +84,7 @@ Shadows are cast dynamically by ray queries being cast by the fragment shader. === xref:./{extension_samplespath}ray_tracing_basic/README.adoc[Basic hardware accelerated ray tracing] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] Render a basic scene using the official cross-vendor ray tracing extension. Shows how to setup all data structures required for ray tracing, including the bottom and top level acceleration structures for the geometry, the shader binding table and the ray tracing pipelines with shader groups for ray generation, ray hits, and ray misses. @@ -91,7 +92,7 @@ After dispatching the rays, the final result is copied to the swapchain image. === xref:./{extension_samplespath}ray_tracing_extended/README.adoc[Extended hardware accelerated ray tracing] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] Render Sponza with Ambient Occlusion. Place a vase in center. @@ -101,7 +102,7 @@ Shows how to rebuild the acceleration structure and when to set it to fast rebui === xref:./{extension_samplespath}mesh_shading/README.adoc[Mesh shading] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_mesh_shader.html[`VK_EXT_mesh_shader`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_mesh_shader.html[`VK_EXT_mesh_shader`] Renders a triangle with the most simple of all possible mesh shader pipeline examples. There is no vertex shader, there is only a mesh and fragment shader. @@ -115,20 +116,20 @@ A transcoded version of the Extensions sample xref:./{extension_samplespath}mesh === xref:./{extension_samplespath}open_gl_interop/README.adoc[OpenGL interoperability] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`], https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] Render a procedural image using OpenGL and incorporate that rendered content into a Vulkan scene. Demonstrates using the same backing memory for a texture in both OpenGL and Vulkan and how to synchronize the APIs using shared semaphores and barriers. === xref:./{extension_samplespath}open_cl_interop/README.adoc[OpenCL interoperability] -**Extensions**: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`], https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] +**Extensions**: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`], https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] This sample shows how to do Vulkan and OpenCL interoperability using cross vendor extensions in both apis. The sample uses OpenCL to update an image that is then displayed in Vulkan. This is done by sharing the memory for that image across the two apis. The sample also shares semaphores for doing cross api synchronization. === xref:./{extension_samplespath}open_cl_interop_arm/README.adoc[OpenCL interoperability (Arm)] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html[`VK_ANDROID_external_memory_android_hardware_buffer`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html[`VK_ANDROID_external_memory_android_hardware_buffer`] This sample demonstrates usage of OpenCL extensions available on Arm devices. Fill a procedural texture using OpenCL and display it using Vulkan. @@ -136,33 +137,33 @@ In this sample data sharing between APIs is achieved using Android Hardware Buff === xref:./{extension_samplespath}timeline_semaphore/README.adoc[Timeline semaphore] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_timeline_semaphore.html[`VK_KHR_timeline_semaphore`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_timeline_semaphore.html[`VK_KHR_timeline_semaphore`] Demonstrates various use cases which are enabled with timeline semaphores. The sample implements "Game of Life" in an esoteric way, using out-of-order signal and wait, multiple waits on same semaphore in different queues, waiting and signalling semaphore on host. === xref:./{extension_samplespath}buffer_device_address/README.adoc[Buffer device address] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_buffer_device_address.html[`VK_KHR_buffer_device_address`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_buffer_device_address.html[`VK_KHR_buffer_device_address`] Demonstrates how to use the buffer device address feature, which enables extreme flexibility in how buffer memory is accessed. === xref:./{extension_samplespath}synchronization_2/README.adoc[Synchronization2] -*Extension* https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_synchronization2[`VK_KHR_synchronization2`] +*Extension* https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_synchronization2[`VK_KHR_synchronization2`] Demonstrates the use of the reworked synchronization api introduced with `VK_KHR_synchronization2`. Based on the compute shading N-Body particle system, this sample uses the new extension to streamline the memory barriers used for the compute and graphics work submissions. === xref:./{extension_samplespath}descriptor_indexing/README.adoc[Descriptor indexing] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_descriptor_indexing.html[`VK_EXT_descriptor_indexing`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_descriptor_indexing.html[`VK_EXT_descriptor_indexing`] Demonstrates how to use descriptor indexing to enable update-after-bind and non-dynamically uniform indexing of descriptors. === xref:./{extension_samplespath}fragment_shading_rate/README.adoc[Fragment shading rate] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] Uses a special framebuffer attachment to control fragment shading rates for different framebuffer regions. This allows explicit control over the number of fragment shader invocations for each pixel covered by a fragment, which is e.g. @@ -170,7 +171,7 @@ useful for foveated rendering. === xref:./{extension_samplespath}fragment_shading_rate_dynamic/README.adoc[Fragment shading rate_dynamic] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] Render a simple scene showing the basics of shading rate dynamic. This sample shows low and high frequency textures over several cubes. @@ -179,20 +180,20 @@ Then it uses that dynamic sample rate map as a base for the next frame. === xref:./{extension_samplespath}ray_tracing_reflection/README.adoc[Ray tracing: reflection, shadow rays] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_descriptor_indexing.html[`VK_EXT_descriptor_indexing`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_scalar_block_layout.html[`VK_EXT_scalar_block_layout`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`], https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_descriptor_indexing.html[`VK_EXT_descriptor_indexing`], https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_scalar_block_layout.html[`VK_EXT_scalar_block_layout`] Render a simple scene showing the basics of ray tracing, including reflection and shadow rays. The sample creates some geometries and create a bottom acceleration structure for each, then make instances of those, using different materials and placing them at different locations. === xref:./{extension_samplespath}ray_tracing_position_fetch/README.adoc[Ray tracing position fetch] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VK_KHR_ray_tracing_position_fetch[`VK_KHR_ray_tracing_position_fetch`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_tracing_position_fetch[`VK_KHR_ray_tracing_position_fetch`] Shows how to use the ray tracing position fetch extension to directly access vertex positions for a hit triangle from the acceleration structure, instead of having to explicitly pass and unpack that information === xref:./{extension_samplespath}portability/README.adoc[Portability] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VK_KHR_portability_subset[`VK_KHR_portability_subset`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_portability_subset[`VK_KHR_portability_subset`] Demonstrate how to include non-conformant portable Vulkan implementations by using the portability extension to include those implementations in the device query. An example of a non-conformant portable Vulkan implementation is MoltenVk: https://github.com/KhronosGroup/MoltenVK[MoltenVk]. @@ -200,7 +201,7 @@ Also demonstrate use of beta extension which allows for querying which features === xref:./{extension_samplespath}graphics_pipeline_library/README.adoc[Graphics pipeline library] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_graphics_pipeline_library.html[`VK_EXT_graphics_pipeline_library`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_graphics_pipeline_library.html[`VK_EXT_graphics_pipeline_library`] Uses the graphics pipeline library extensions to improve run-time pipeline creation. Instead of creating the whole pipeline at once, this sample makes use of that extension to pre-build shared pipeline parts such as vertex input state and fragment output state. @@ -208,92 +209,106 @@ These building blocks are then used to create pipelines at runtime, improving bu === xref:./{extension_samplespath}conditional_rendering/README.adoc[Conditional rendering] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_conditional_rendering.html[`VK_EXT_conditional_rendering`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_conditional_rendering.html[`VK_EXT_conditional_rendering`] Demonstrate how to do conditional rendering, dynamically discarding rendering commands without having to update command buffers. This is done by sourcing conditional rendering blocks from a dedicated buffer that can be updated without having to touch command buffers. === xref:./{extension_samplespath}vertex_dynamic_state/README.adoc[Vertex input dynamic state] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_vertex_input_dynamic_state.html[`VK_EXT_vertex_input_dynamic_state`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_vertex_input_dynamic_state.html[`VK_EXT_vertex_input_dynamic_state`] Demonstrate how to use vertex input bindings and attribute descriptions dynamically, which can reduce the number of pipeline objects that are needed to be created. === xref:./{extension_samplespath}extended_dynamic_state2/README.adoc[Extended dynamic state 2] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html[`VK_EXT_extended_dynamic_state2`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html[`VK_EXT_extended_dynamic_state2`] Demonstrate how to use depth bias, primitive restart, rasterizer discard and patch control points dynamically, which can reduce the number of pipeline objects that are needed to be created. === xref:./{extension_samplespath}logic_op_dynamic_state/README.adoc[Logic operations dynamic state] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html[`VK_EXT_extended_dynamic_state2`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html[`VK_EXT_extended_dynamic_state2`] Demonstrate how to use logical operations dynamically, which can reduce the number of pipeline objects that are needed to be created or allow to change the pipeline state dynamically (change type of the logical operation). === xref:./{extension_samplespath}patch_control_points/README.adoc[Patch control points] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html[`VK_EXT_extended_dynamic_state2`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html[`VK_EXT_extended_dynamic_state2`] Demonstrate how to use patch control points dynamically, which can reduce the number of pipeline objects that are needed to be created. === xref:./{extension_samplespath}fragment_shader_barycentric/README.adoc[Fragment shader barycentric] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_fragment_shader_barycentric.html[`VK_KHR_fragment_shader_barycentric`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_fragment_shader_barycentric.html[`VK_KHR_fragment_shader_barycentric`] Demonstrate how to use fragment shader barycentric feature, which allows accessing barycentric coordinates for each processed fragment. === xref:./{extension_samplespath}descriptor_buffer_basic/README.adoc[Basic descriptor buffer] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_ext_descriptor_buffer[`VK_EXT_descriptor_buffer`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_ext_descriptor_buffer[`VK_EXT_descriptor_buffer`] Demonstrate how to use the new extension to replace descriptor sets with resource descriptor buffers === xref:./{extension_samplespath}color_write_enable/README.adoc[Color write enable] -*Extension*: https://https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_color_write_enable.html[`VK_EXT_color_write_enable`] +*Extension*: https://https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_color_write_enable.html[`VK_EXT_color_write_enable`] Demonstrate how to create multiple color blend attachments and then toggle them dynamically. === xref:./{extension_samplespath}gshader_to_mshader/README.adoc[Geometry shader to mesh shader] -*Extension:* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_mesh_shader.html[`VK_EXT_mesh_shader`] +*Extension:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_mesh_shader.html[`VK_EXT_mesh_shader`] Demonstrates how a mesh shader can be used to achieve the same results as with geometry shader, it loads model from a file and visualizes its normals. === xref:./{extension_samplespath}shader_object/README.adoc[Shader object] -*Extension:* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_shader_object.html[`VK_EXT_shader_object`] +*Extension:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_shader_object.html[`VK_EXT_shader_object`] Demonstrate how to use shader objects. === xref:./{extension_samplespath}dynamic_blending[Dynamic blending] -*Extension:* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state.html[`VK_EXT_extended_dynamic_state3`] +*Extension:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state.html[`VK_EXT_extended_dynamic_state3`] Demonstrate how to use the blending related functions available in the VK_EXT_extended_dynamic_state3 extension. === xref:./{extension_samplespath}dynamic_line_rasterization/README.adoc[Dynamic line rasterization] -*Extensions:* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_line_rasterization.html[`VK_EXT_line_rasterization`], https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state3.html[`VK_EXT_extended_dynamic_state3`] +*Extensions:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_line_rasterization.html[`VK_EXT_line_rasterization`], https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state3.html[`VK_EXT_extended_dynamic_state3`] Demonstrate methods for dynamically customizing the appearance of the rendered lines. === xref:./{extension_samplespath}shader_debugprintf/README.adoc[Shader Debug Printf] -*Extension*: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_shader_non_semantic_info.html[`VK_KHR_shader_non_semantic_info`] +*Extension*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_shader_non_semantic_info.html[`VK_KHR_shader_non_semantic_info`] Demonstrates how to use https://en.wikipedia.org/wiki/Printf[Printf] statements in a shader to output per-invocation values. This can help find issues with shaders in combination with graphics debugging tools. === xref:./{extension_samplespath}dynamic_primitive_clipping/README.adoc[Dynamic depth clipping and primitive clipping] -*Extension:* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state3.html[`VK_EXT_extended_dynamic_state3`] +*Extension:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state3.html[`VK_EXT_extended_dynamic_state3`] Rendering using primitive clipping and depth clipping configured by dynamic pipeline state. === xref:./{extension_samplespath}host_image_copy/README.adoc[Host image copies] -*Extension:* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_host_image_copy.html[`VK_EXT_extended_dynamic_state3`] +*Extension:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_host_image_copy.html[`VK_EXT_extended_dynamic_state3`] Demonstrate the use of the host image extension to directly copy from a host buffer to an image on the device without going through a staging buffer. +=== xref:./{extension_samplespath}dynamic_multisample_rasterization/README.adoc[Dynamic multisample rasterization] + +*Extensions:* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state3.html[`VK_EXT_line_rasterization`], https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state3.html[`VK_EXT_extended_dynamic_state3`] + +Demonstrate how to use dynamic multisample rasterization (MSAA) + +=== xref:./{extension_samplespath}tensor_and_data_graph/README.adoc[Tensor and Data Graph] + +*Extensions*: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_ARM_tensors.html[`VK_ARM_tensors`], https://registry.khronos.org/vulkan/specs/latest/man/html/VK_ARM_data_graph.html[`VK_ARM_data_graph`] + +Demonstrate how to build data graph pipelines and execute neural networks: + +* xref:./{extension_samplespath}tensor_and_data_graph/simple_tensor_and_data_graph/README.adoc[simple_tensor_and_data_graph] +- Explains how to set up and execute a simple neural network using a data graph pipeline. diff --git a/samples/extensions/buffer_device_address/CMakeLists.txt b/samples/extensions/buffer_device_address/CMakeLists.txt index c06c04d69d..39ef1e1273 100644 --- a/samples/extensions/buffer_device_address/CMakeLists.txt +++ b/samples/extensions/buffer_device_address/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Arm Limited and Contributors +# Copyright (c) 2021-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -26,6 +26,10 @@ add_sample_with_tags( NAME "Buffer device address" DESCRIPTION "Demonstrates use of buffer device address for flexible vertex attribute fetch" SHADER_FILES_GLSL - "buffer_device_address/update_vbo.comp" - "buffer_device_address/render.vert" - "buffer_device_address/render.frag") + "buffer_device_address/glsl/update_vbo.comp" + "buffer_device_address/glsl/render.vert" + "buffer_device_address/glsl/render.frag" + SHADER_FILES_SLANG + "buffer_device_address/slang/update_vbo.comp.slang" + "buffer_device_address/slang/render.vert.slang" + "buffer_device_address/slang/render.frag.slang") diff --git a/samples/extensions/buffer_device_address/buffer_device_address.cpp b/samples/extensions/buffer_device_address/buffer_device_address.cpp index 19064c48ca..420cbdb0c2 100644 --- a/samples/extensions/buffer_device_address/buffer_device_address.cpp +++ b/samples/extensions/buffer_device_address/buffer_device_address.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -109,7 +109,7 @@ void BufferDeviceAddress::create_compute_pipeline() { pipelines.compute_pipeline_layout = create_pipeline_layout(false); VkComputePipelineCreateInfo info = vkb::initializers::compute_pipeline_create_info(pipelines.compute_pipeline_layout); - info.stage = load_shader("buffer_device_address/update_vbo.comp", VK_SHADER_STAGE_COMPUTE_BIT); + info.stage = load_shader("buffer_device_address", "update_vbo.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &pipelines.compute_update_pipeline)); } @@ -155,8 +155,8 @@ void BufferDeviceAddress::create_graphics_pipeline() info.pStages = stages; info.stageCount = 2; - stages[0] = load_shader("buffer_device_address/render.vert", VK_SHADER_STAGE_VERTEX_BIT); - stages[1] = load_shader("buffer_device_address/render.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + stages[0] = load_shader("buffer_device_address", "render.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + stages[1] = load_shader("buffer_device_address", "render.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &pipelines.bindless_vbo_pipeline)); } @@ -199,21 +199,22 @@ std::unique_ptr BufferDeviceAddress::create_index_buffer() staging_buffer.flush(); staging_buffer.unmap(); - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - cmd.copy_buffer(staging_buffer, *index_buffer, size); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + cmd->copy_buffer(staging_buffer, *index_buffer, size); vkb::BufferMemoryBarrier memory_barrier; memory_barrier.src_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; memory_barrier.dst_access_mask = VK_ACCESS_INDEX_READ_BIT; memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; - cmd.buffer_memory_barrier(*index_buffer, 0, VK_WHOLE_SIZE, memory_barrier); - VK_CHECK(cmd.end()); + cmd->buffer_memory_barrier(*index_buffer, 0, VK_WHOLE_SIZE, memory_barrier); + cmd->end(); // Not very optimal, but it's the simplest solution. - get_device().get_suitable_graphics_queue().submit(cmd, VK_NULL_HANDLE); - get_device().get_suitable_graphics_queue().wait_idle(); + auto const &graphicsQueue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); + graphicsQueue.submit(*cmd, VK_NULL_HANDLE); + graphicsQueue.wait_idle(); return index_buffer; } @@ -253,7 +254,7 @@ BufferDeviceAddress::TestBuffer BufferDeviceAddress::create_vbo_buffer() memory_allocation_info.pNext = &flags_info; memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &buffer.memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), buffer.buffer, buffer.memory, 0)); @@ -290,7 +291,7 @@ BufferDeviceAddress::TestBuffer BufferDeviceAddress::create_pointer_buffer() memory_allocation_info.pNext = &flags_info; memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &buffer.memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), buffer.buffer, buffer.memory, 0)); @@ -425,13 +426,10 @@ void BufferDeviceAddress::render(float delta_time) ApiVulkanSample::submit_frame(); } -void BufferDeviceAddress::request_gpu_features(vkb::PhysicalDevice &gpu) +void BufferDeviceAddress::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Need to enable the bufferDeviceAddress feature. - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceBufferDeviceAddressFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR, - bufferDeviceAddress); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeaturesKHR, bufferDeviceAddress); } std::unique_ptr create_buffer_device_address() diff --git a/samples/extensions/buffer_device_address/buffer_device_address.h b/samples/extensions/buffer_device_address/buffer_device_address.h index 727feaa9d5..959795d45c 100644 --- a/samples/extensions/buffer_device_address/buffer_device_address.h +++ b/samples/extensions/buffer_device_address/buffer_device_address.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -28,7 +28,7 @@ class BufferDeviceAddress : public ApiVulkanSample ~BufferDeviceAddress(); private: - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual void render(float delta_time) override; virtual void build_command_buffers() override; virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; diff --git a/samples/extensions/calibrated_timestamps/CMakeLists.txt b/samples/extensions/calibrated_timestamps/CMakeLists.txt index 75619f8d57..6f8ca2a215 100644 --- a/samples/extensions/calibrated_timestamps/CMakeLists.txt +++ b/samples/extensions/calibrated_timestamps/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Holochip Corporation +# Copyright (c) 2023-2025, Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample_with_tags( "hdr/hlsl/bloom.vert.hlsl" "hdr/hlsl/bloom.frag.hlsl" "hdr/hlsl/gbuffer.vert.hlsl" - "hdr/hlsl/gbuffer.frag.hlsl") \ No newline at end of file + "hdr/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "hdr/slang/composition.vert.slang" + "hdr/slang/composition.frag.slang" + "hdr/slang/bloom.vert.slang" + "hdr/slang/bloom.frag.slang" + "hdr/slang/gbuffer.vert.slang" + "hdr/slang/gbuffer.frag.slang") \ No newline at end of file diff --git a/samples/extensions/calibrated_timestamps/calibrated_timestamps.cpp b/samples/extensions/calibrated_timestamps/calibrated_timestamps.cpp index aaed77fd39..e0e762a0fc 100644 --- a/samples/extensions/calibrated_timestamps/calibrated_timestamps.cpp +++ b/samples/extensions/calibrated_timestamps/calibrated_timestamps.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -82,7 +82,7 @@ CalibratedTimestamps::~CalibratedTimestamps() } } -void CalibratedTimestamps::request_gpu_features(vkb::PhysicalDevice &gpu) +void CalibratedTimestamps::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().samplerAnisotropy) { @@ -225,7 +225,7 @@ void CalibratedTimestamps::create_attachment(VkFormat format, VkImageUsageFlagBi VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment->image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment->image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment->mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment->image, attachment->mem, 0)); @@ -616,8 +616,8 @@ void CalibratedTimestamps::prepare_pipelines() VkPipelineVertexInputStateCreateInfo empty_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); pipeline_create_info.pVertexInputState = &empty_input_state; - shader_stages[0] = load_shader("hdr", "composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.layout = pipeline_layouts.composition; pipeline_create_info.renderPass = render_pass; rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; @@ -625,8 +625,8 @@ void CalibratedTimestamps::prepare_pipelines() color_blend_state.pAttachments = &blend_attachment_state; VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.composition)); - shader_stages[0] = load_shader("hdr", "bloom.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "bloom.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "bloom.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "bloom.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); color_blend_state.pAttachments = &blend_attachment_state; blend_attachment_state.colorWriteMask = 0xF; blend_attachment_state.blendEnable = VK_TRUE; @@ -677,8 +677,8 @@ void CalibratedTimestamps::prepare_pipelines() color_blend_state.attachmentCount = static_cast(blend_attachment_states.size()); color_blend_state.pAttachments = blend_attachment_states.data(); - shader_stages[0] = load_shader("hdr", "gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("hdr", "gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("hdr", "gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("hdr", "gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); specialization_map_entries[0] = vkb::initializers::specialization_map_entry(0, 0, sizeof(uint32_t)); uint32_t shadertype = 0; @@ -802,8 +802,6 @@ void CalibratedTimestamps::get_time_domains() // Resize time stamps vector timestamps.resize(time_domain_count); - // Resize max deviations vector - max_deviations.resize(time_domain_count); } is_time_domain_init = ((result == VK_SUCCESS) && (time_domain_count > 0)); @@ -815,7 +813,7 @@ VkResult CalibratedTimestamps::get_timestamps() if (is_time_domain_init) { // Get calibrated timestamps: - return vkGetCalibratedTimestampsEXT(get_device().get_handle(), static_cast(time_domains.size()), timestamps_info.data(), timestamps.data(), max_deviations.data()); + return vkGetCalibratedTimestampsEXT(get_device().get_handle(), static_cast(time_domains.size()), timestamps_info.data(), timestamps.data(), &max_deviation); } return VK_ERROR_UNKNOWN; } @@ -826,7 +824,7 @@ void CalibratedTimestamps::get_device_time_domain() if (is_time_domain_init && (time_domains.size() > 1)) { - auto iterator_device = std::find(time_domains.begin(), time_domains.end(), VK_TIME_DOMAIN_DEVICE_EXT); + auto iterator_device = std::ranges::find(time_domains, VK_TIME_DOMAIN_DEVICE_EXT); int device_index = static_cast(iterator_device - time_domains.begin()); diff --git a/samples/extensions/calibrated_timestamps/calibrated_timestamps.h b/samples/extensions/calibrated_timestamps/calibrated_timestamps.h index f9011dadee..31489939e8 100644 --- a/samples/extensions/calibrated_timestamps/calibrated_timestamps.h +++ b/samples/extensions/calibrated_timestamps/calibrated_timestamps.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ class CalibratedTimestamps : public ApiVulkanSample bool is_time_domain_init = false; // this is just to tell if time domain update has a VK_SUCCESS in the end std::vector time_domains{}; // this holds all time domains extracted from the current Instance std::vector timestamps{}; // timestamps vector - std::vector max_deviations{}; // max deviations vector + uint64_t max_deviation = 0; // max deviation struct { @@ -163,7 +163,7 @@ class CalibratedTimestamps : public ApiVulkanSample public: CalibratedTimestamps(); ~CalibratedTimestamps() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void create_attachment(VkFormat format, VkImageUsageFlagBits usage, FrameBufferAttachment *attachment); void prepare_offscreen_buffer(); diff --git a/samples/extensions/color_write_enable/CMakeLists.txt b/samples/extensions/color_write_enable/CMakeLists.txt index f579885fba..2808ac7def 100644 --- a/samples/extensions/color_write_enable/CMakeLists.txt +++ b/samples/extensions/color_write_enable/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample( "color_write_enable/hlsl/triangle_separate_channels.vert.hlsl" "color_write_enable/hlsl/triangle_separate_channels.frag.hlsl" "color_write_enable/hlsl/composition.vert.hlsl" - "color_write_enable/hlsl/composition.frag.hlsl") + "color_write_enable/hlsl/composition.frag.hlsl" + SHADER_FILES_SLANG + "color_write_enable/slang/triangle_separate_channels.vert.slang" + "color_write_enable/slang/triangle_separate_channels.frag.slang" + "color_write_enable/slang/composition.vert.slang" + "color_write_enable/slang/composition.frag.slang") diff --git a/samples/extensions/color_write_enable/README.adoc b/samples/extensions/color_write_enable/README.adoc index 25e461c691..e5011ad52d 100644 --- a/samples/extensions/color_write_enable/README.adoc +++ b/samples/extensions/color_write_enable/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -58,12 +58,12 @@ The sample shows how to setup an application to work with this extension: == Documentation links -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_color_write_enable.html +https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_color_write_enable.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkSubpassDescription.html +https://registry.khronos.org/vulkan/specs/latest/man/html/VkSubpassDescription.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkFramebufferCreateInfo.html +https://registry.khronos.org/vulkan/specs/latest/man/html/VkFramebufferCreateInfo.html == See also -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorWriteMaskEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetColorWriteMaskEXT.html diff --git a/samples/extensions/color_write_enable/color_write_enable.cpp b/samples/extensions/color_write_enable/color_write_enable.cpp index 3ca29846f5..24723b0f37 100644 --- a/samples/extensions/color_write_enable/color_write_enable.cpp +++ b/samples/extensions/color_write_enable/color_write_enable.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -68,8 +68,8 @@ void ColorWriteEnable::prepare_gui() create_gui(*window, nullptr, 15.0f, true); get_gui().set_subpass(1); get_gui().prepare(pipeline_cache, render_pass, - {load_shader("uioverlay/uioverlay.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("uioverlay/uioverlay.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}); + {load_shader("uioverlay/uioverlay.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("uioverlay/uioverlay.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}); } void ColorWriteEnable::prepare_pipelines() @@ -118,8 +118,8 @@ void ColorWriteEnable::prepare_pipelines() std::array shader_stages = {}; // Vertex stage of the pipeline - shader_stages[0] = load_shader("color_write_enable", "triangle_separate_channels.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("color_write_enable", "triangle_separate_channels.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("color_write_enable", "triangle_separate_channels.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("color_write_enable", "triangle_separate_channels.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // We need to specify the pipeline layout and the render pass description up front as well. VkGraphicsPipelineCreateInfo pipe = vkb::initializers::pipeline_create_info(pipeline_layouts.color, render_pass); @@ -147,8 +147,8 @@ void ColorWriteEnable::prepare_pipelines() std::array shader_stages = {}; // Vertex stage of the pipeline - shader_stages[0] = load_shader("color_write_enable", "composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("color_write_enable", "composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("color_write_enable", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("color_write_enable", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Specify we will use triangle lists to draw geometry. VkPipelineInputAssemblyStateCreateInfo input_assembly = vkb::initializers::pipeline_input_assembly_state_create_info(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE); @@ -211,7 +211,7 @@ void ColorWriteEnable::create_attachment(VkFormat format, FrameBufferAttachment VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment->image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment->image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment->mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment->image, attachment->mem, 0)); @@ -237,16 +237,25 @@ void ColorWriteEnable::create_attachments() create_attachment(format, &attachments.blue); } -void ColorWriteEnable::request_gpu_features(vkb::PhysicalDevice &gpu) +void ColorWriteEnable::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceColorWriteEnableFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, - colorWriteEnable); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceColorWriteEnableFeaturesEXT, colorWriteEnable); + if (gpu.get_features().independentBlend) { - auto &features = gpu.get_mutable_requested_features(); - features.independentBlend = VK_TRUE; + gpu.get_mutable_requested_features().independentBlend = true; + } + + if (get_shading_language() == vkb::ShadingLanguage::SLANG) + { + if (gpu.get_features().shaderStorageImageReadWithoutFormat) + { + gpu.get_mutable_requested_features().shaderStorageImageReadWithoutFormat = true; + } + else + { + throw std::runtime_error("When using Slang shaders, this sample requires support for reading storage images without format (shaderStorageImageReadWithoutFormat)"); + } } } diff --git a/samples/extensions/color_write_enable/color_write_enable.h b/samples/extensions/color_write_enable/color_write_enable.h index d12d40498b..c39faaad6b 100644 --- a/samples/extensions/color_write_enable/color_write_enable.h +++ b/samples/extensions/color_write_enable/color_write_enable.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -37,7 +37,7 @@ class ColorWriteEnable : public ApiVulkanSample void render(float delta_time) override; bool prepare(const vkb::ApplicationOptions &options) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void setup_render_pass() override; void setup_framebuffer() override; void prepare_gui() override; diff --git a/samples/extensions/conditional_rendering/CMakeLists.txt b/samples/extensions/conditional_rendering/CMakeLists.txt index 73269d9fc4..72a115aaef 100644 --- a/samples/extensions/conditional_rendering/CMakeLists.txt +++ b/samples/extensions/conditional_rendering/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, Sascha Willems +# Copyright (c) 2022-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample( "conditional_rendering/glsl/model.frag" SHADER_FILES_HLSL "conditional_rendering/hlsl/model.vert.hlsl" - "conditional_rendering/hlsl/model.frag.hlsl") + "conditional_rendering/hlsl/model.frag.hlsl" + SHADER_FILES_SLANG + "conditional_rendering/slang/model.vert.slang" + "conditional_rendering/slang/model.frag.slang") diff --git a/samples/extensions/conditional_rendering/README.adoc b/samples/extensions/conditional_rendering/README.adoc index 99a66332d9..2a1305dec4 100644 --- a/samples/extensions/conditional_rendering/README.adoc +++ b/samples/extensions/conditional_rendering/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2022-2023, Sascha Willems +- Copyright (c) 2022-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -28,7 +28,7 @@ image::./images/sample.png[Sample] == Overview -The https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_conditional_rendering.html[VK_EXT_conditional_rendering] extension allows the execution of rendering commands to be conditional based on a value taken from a dedicated conditional buffer. +The https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_conditional_rendering.html[VK_EXT_conditional_rendering] extension allows the execution of rendering commands to be conditional based on a value taken from a dedicated conditional buffer. This may help an application reduce the latency by conditionally discarding rendering commands without application intervention. This sample demonstrates usage of this extension for conditionally toggling the visibility of sub-meshes of a complex glTF model. diff --git a/samples/extensions/conditional_rendering/conditional_rendering.cpp b/samples/extensions/conditional_rendering/conditional_rendering.cpp index 9e98511f16..b98835b9a1 100644 --- a/samples/extensions/conditional_rendering/conditional_rendering.cpp +++ b/samples/extensions/conditional_rendering/conditional_rendering.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Sascha Willems +/* Copyright (c) 2022-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -42,13 +42,10 @@ ConditionalRendering::~ConditionalRendering() } } -void ConditionalRendering::request_gpu_features(vkb::PhysicalDevice &gpu) +void ConditionalRendering::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // We need to enable conditional rendering using a new feature struct - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceConditionalRenderingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, - conditionalRendering); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceConditionalRenderingFeaturesEXT, conditionalRendering); } void ConditionalRendering::build_command_buffers() @@ -287,8 +284,8 @@ void ConditionalRendering::prepare_pipelines() pipeline_create_info.pVertexInputState = &vertex_input_state; - shader_stages[0] = load_shader("conditional_rendering", "model.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("conditional_rendering", "model.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("conditional_rendering", "model.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("conditional_rendering", "model.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline)); } diff --git a/samples/extensions/conditional_rendering/conditional_rendering.h b/samples/extensions/conditional_rendering/conditional_rendering.h index 4ad7dd4381..5f4274b45c 100644 --- a/samples/extensions/conditional_rendering/conditional_rendering.h +++ b/samples/extensions/conditional_rendering/conditional_rendering.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -32,9 +32,9 @@ class ConditionalRendering : public ApiVulkanSample std::unique_ptr scene; struct SceneNode { - std::string name; - vkb::sg::Node *node; - vkb::sg::SubMesh *sub_mesh; + std::string name; + vkb::scene_graph::NodeC *node; + vkb::sg::SubMesh *sub_mesh; }; std::vector linear_scene_nodes; @@ -61,7 +61,7 @@ class ConditionalRendering : public ApiVulkanSample ConditionalRendering(); ~ConditionalRendering(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void load_assets(); void setup_descriptor_pool(); diff --git a/samples/extensions/conservative_rasterization/CMakeLists.txt b/samples/extensions/conservative_rasterization/CMakeLists.txt index 3db67ac5ac..78c8c6fc6f 100644 --- a/samples/extensions/conservative_rasterization/CMakeLists.txt +++ b/samples/extensions/conservative_rasterization/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -36,4 +36,10 @@ add_sample_with_tags( "conservative_rasterization/hlsl/fullscreen.frag.hlsl" "conservative_rasterization/hlsl/triangle.vert.hlsl" "conservative_rasterization/hlsl/triangle.frag.hlsl" - "conservative_rasterization/hlsl/triangleoverlay.frag.hlsl") + "conservative_rasterization/hlsl/triangleoverlay.frag.hlsl" + SHADER_FILES_SLANG + "conservative_rasterization/slang/fullscreen.vert.slang" + "conservative_rasterization/slang/fullscreen.frag.slang" + "conservative_rasterization/slang/triangle.vert.slang" + "conservative_rasterization/slang/triangle.frag.slang" + "conservative_rasterization/slang/triangleoverlay.frag.slang") diff --git a/samples/extensions/conservative_rasterization/README.adoc b/samples/extensions/conservative_rasterization/README.adoc index 6f12ef6680..c31dd9a2d0 100644 --- a/samples/extensions/conservative_rasterization/README.adoc +++ b/samples/extensions/conservative_rasterization/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2023, The Khronos Group +- Copyright (c) 2019-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_conservative_rasterization[`VK_EXT_conservative_rasterization`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_conservative_rasterization[`VK_EXT_conservative_rasterization`] Uses conservative rasterization to change the way fragments are generated. Enables overestimation to generate fragments for every pixel touched instead of only pixels that are fully covered. diff --git a/samples/extensions/conservative_rasterization/conservative_rasterization.cpp b/samples/extensions/conservative_rasterization/conservative_rasterization.cpp index aa61b65929..d69f5812b6 100644 --- a/samples/extensions/conservative_rasterization/conservative_rasterization.cpp +++ b/samples/extensions/conservative_rasterization/conservative_rasterization.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -71,7 +71,7 @@ ConservativeRasterization::~ConservativeRasterization() triangle.indices.reset(); } -void ConservativeRasterization::request_gpu_features(vkb::PhysicalDevice &gpu) +void ConservativeRasterization::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { gpu.get_mutable_requested_features().fillModeNonSolid = gpu.get_features().fillModeNonSolid; gpu.get_mutable_requested_features().wideLines = gpu.get_features().wideLines; @@ -106,7 +106,7 @@ void ConservativeRasterization::prepare_offscreen() VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &offscreen_pass.color.image)); vkGetImageMemoryRequirements(get_device().get_handle(), offscreen_pass.color.image, &memory_requirements); memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &offscreen_pass.color.mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), offscreen_pass.color.image, offscreen_pass.color.mem, 0)); @@ -144,7 +144,7 @@ void ConservativeRasterization::prepare_offscreen() VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &offscreen_pass.depth.image)); vkGetImageMemoryRequirements(get_device().get_handle(), offscreen_pass.depth.image, &memory_requirements); memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &offscreen_pass.depth.mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), offscreen_pass.depth.image, offscreen_pass.depth.mem, 0)); @@ -504,8 +504,8 @@ void ConservativeRasterization::prepare_pipelines() pipeline_create_info.pStages = shader_stages.data(); // Full screen pass - shader_stages[0] = load_shader("conservative_rasterization", "fullscreen.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("conservative_rasterization", "fullscreen.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("conservative_rasterization", "fullscreen.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("conservative_rasterization", "fullscreen.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Empty vertex input state (full screen triangle generated in vertex shader) VkPipelineVertexInputStateCreateInfo empty_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); pipeline_create_info.pVertexInputState = &empty_input_state; @@ -519,16 +519,16 @@ void ConservativeRasterization::prepare_pipelines() // TODO(tomatkinson): Check support for lines rasterization_state.lineWidth = 2.0f; rasterization_state.polygonMode = VK_POLYGON_MODE_LINE; - shader_stages[0] = load_shader("conservative_rasterization", "triangle.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("conservative_rasterization", "triangleoverlay.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("conservative_rasterization", "triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("conservative_rasterization", "triangleoverlay.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.triangle_overlay)); pipeline_create_info.renderPass = offscreen_pass.render_pass; // Triangle rendering rasterization_state.polygonMode = VK_POLYGON_MODE_FILL; - shader_stages[0] = load_shader("conservative_rasterization", "triangle.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("conservative_rasterization", "triangle.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("conservative_rasterization", "triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("conservative_rasterization", "triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Basic pipeline VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.triangle)); diff --git a/samples/extensions/conservative_rasterization/conservative_rasterization.h b/samples/extensions/conservative_rasterization/conservative_rasterization.h index 46f928370c..0980c7b267 100644 --- a/samples/extensions/conservative_rasterization/conservative_rasterization.h +++ b/samples/extensions/conservative_rasterization/conservative_rasterization.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -109,7 +109,7 @@ class ConservativeRasterization : public ApiVulkanSample ConservativeRasterization(); ~ConservativeRasterization(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void prepare_offscreen(); void load_assets(); diff --git a/samples/extensions/debug_utils/CMakeLists.txt b/samples/extensions/debug_utils/CMakeLists.txt index e31aab91fb..ccd0dc325e 100644 --- a/samples/extensions/debug_utils/CMakeLists.txt +++ b/samples/extensions/debug_utils/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2024, Sascha Willems +# Copyright (c) 2020-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample( "debug_utils/hlsl/bloom.vert.hlsl" "debug_utils/hlsl/bloom.frag.hlsl" "debug_utils/hlsl/gbuffer.vert.hlsl" - "debug_utils/hlsl/gbuffer.frag.hlsl") + "debug_utils/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "debug_utils/slang/composition.vert.slang" + "debug_utils/slang/composition.frag.slang" + "debug_utils/slang/bloom.vert.slang" + "debug_utils/slang/bloom.frag.slang" + "debug_utils/slang/gbuffer.vert.slang" + "debug_utils/slang/gbuffer.frag.slang") diff --git a/samples/extensions/debug_utils/README.adoc b/samples/extensions/debug_utils/README.adoc index bb7ef6bb41..c74b8f1209 100644 --- a/samples/extensions/debug_utils/README.adoc +++ b/samples/extensions/debug_utils/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2023, Sascha Willems +- Copyright (c) 2021-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -25,7 +25,7 @@ endif::[] == Overview -This tutorial, along with the accompanying example code, demonstrates the use of the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_debug_utils[VK_EXT_debug_utils] extension to setup a validation layer messenger callback and pass additional debugging information to debuggers like https://renderdoc.org/[RenderDoc]. +This tutorial, along with the accompanying example code, demonstrates the use of the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_debug_utils[VK_EXT_debug_utils] extension to setup a validation layer messenger callback and pass additional debugging information to debuggers like https://renderdoc.org/[RenderDoc]. `VK_EXT_debug_utils` has been introduced based on feedback for the initial Vulkan debugging extensions `VK_EXT_debug_report` and `VK_EXT_debug_marker`, combining these into a single instance extensions with some added functionality. @@ -292,6 +292,3 @@ Once the sample application is running, press F12 do capture the current frame, Once loaded you should be able to see a trace of a whole frame from that sample application along with labels and named Vulkan objects: image:./images/renderdoc_final.jpg[] -s and named Vulkan objects: - -image:./images/renderdoc_final.jpg[] diff --git a/samples/extensions/debug_utils/debug_utils.cpp b/samples/extensions/debug_utils/debug_utils.cpp index 66b77ab8fd..ff0dd6b4a0 100644 --- a/samples/extensions/debug_utils/debug_utils.cpp +++ b/samples/extensions/debug_utils/debug_utils.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Sascha Willems +/* Copyright (c) 2020-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -192,31 +192,15 @@ void DebugUtils::set_object_name(VkObjectType object_type, uint64_t object_handl /* * This sample uses a modified version of the shader loading function that adds a tag to the shader - * The tag includes the source GLSL that can then be displayed by a debugging application */ VkPipelineShaderStageCreateInfo DebugUtils::debug_load_shader(const std::string &file, VkShaderStageFlagBits stage) { - // Note: this can be reworked once offline compilation for GLSL shaders is added - - // Default to GLSL - std::string shader_folder{"glsl"}; - std::string shader_extension{""}; - vkb::ShaderSourceLanguage src_language = vkb::ShaderSourceLanguage::GLSL; - - if (get_shading_language() == vkb::ShadingLanguage::HLSL) - { - shader_folder = "hlsl"; - // HLSL shaders are offline compiled to SPIR-V, so source is SPV - src_language = vkb::ShaderSourceLanguage::SPV; - shader_extension = ".spv"; - } - - std::string shader_file_name = "debug_utils/" + shader_folder + "/" + file; + std::string shader_file_name = "debug_utils/" + get_shader_folder() + "/" + file; VkPipelineShaderStageCreateInfo shader_stage = {}; shader_stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stage.stage = stage; - shader_stage.module = vkb::load_shader((shader_file_name + shader_extension).c_str(), get_device().get_handle(), stage, src_language); + shader_stage.module = vkb::load_shader(shader_file_name, get_device().get_handle(), stage); shader_stage.pName = "main"; assert(shader_stage.module != VK_NULL_HANDLE); shader_modules.push_back(shader_stage.module); @@ -232,14 +216,14 @@ VkPipelineShaderStageCreateInfo DebugUtils::debug_load_shader(const std::string shader_file_name = shader_file_name + ".hlsl"; } - std::vector buffer = vkb::fs::read_shader_binary(shader_file_name); + auto buffer = vkb::fs::read_shader_binary_u32(shader_file_name); // Pass the source GLSL shader code via an object tag VkDebugUtilsObjectTagInfoEXT info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT}; info.objectType = VK_OBJECT_TYPE_SHADER_MODULE; info.objectHandle = (uint64_t) shader_stage.module; info.tagName = 1; - info.tagSize = buffer.size() * sizeof(uint8_t); + info.tagSize = buffer.size() * sizeof(uint32_t); info.pTag = buffer.data(); vkSetDebugUtilsObjectTagEXT(get_device().get_handle(), &info); } @@ -299,7 +283,7 @@ void DebugUtils::debug_name_objects() set_object_name(VK_OBJECT_TYPE_RENDER_PASS, (uint64_t) filter_pass.render_pass, "Bloom filter pass render pass"); } -void DebugUtils::request_gpu_features(vkb::PhysicalDevice &gpu) +void DebugUtils::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -536,7 +520,7 @@ void DebugUtils::create_attachment(VkFormat format, VkImageUsageFlagBits usage, VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment->image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment->image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment->mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment->image, attachment->mem, 0)); @@ -967,8 +951,8 @@ void DebugUtils::prepare_pipelines() pipeline_create_info.pVertexInputState = &empty_input_state; // Final fullscreen composition pass pipeline - shader_stages[0] = debug_load_shader("composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = debug_load_shader("composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = debug_load_shader("composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = debug_load_shader("composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.layout = pipeline_layouts.composition; pipeline_create_info.renderPass = render_pass; rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; @@ -977,8 +961,8 @@ void DebugUtils::prepare_pipelines() VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.composition)); // Bloom pass - shader_stages[0] = debug_load_shader("bloom.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = debug_load_shader("bloom.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = debug_load_shader("bloom.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = debug_load_shader("bloom.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); color_blend_state.pAttachments = &blend_attachment_state; blend_attachment_state.colorWriteMask = 0xF; blend_attachment_state.blendEnable = VK_TRUE; @@ -1036,8 +1020,8 @@ void DebugUtils::prepare_pipelines() color_blend_state.attachmentCount = 2; color_blend_state.pAttachments = blend_attachment_states.data(); - shader_stages[0] = debug_load_shader("gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = debug_load_shader("gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = debug_load_shader("gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = debug_load_shader("gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.skysphere)); // Enable depth test and write diff --git a/samples/extensions/debug_utils/debug_utils.h b/samples/extensions/debug_utils/debug_utils.h index ce365303b0..da20ea546b 100644 --- a/samples/extensions/debug_utils/debug_utils.h +++ b/samples/extensions/debug_utils/debug_utils.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Sascha Willems +/* Copyright (c) 2020-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -137,7 +137,7 @@ class DebugUtils : public ApiVulkanSample void set_object_name(VkObjectType object_type, uint64_t object_handle, const char *object_name); VkPipelineShaderStageCreateInfo debug_load_shader(const std::string &file, VkShaderStageFlagBits stage); void debug_name_objects(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void create_attachment(VkFormat format, VkImageUsageFlagBits usage, FrameBufferAttachment *attachment); void prepare_offscreen_buffer(); diff --git a/samples/extensions/descriptor_buffer_basic/CMakeLists.txt b/samples/extensions/descriptor_buffer_basic/CMakeLists.txt index dc2857ee9d..a847778c23 100644 --- a/samples/extensions/descriptor_buffer_basic/CMakeLists.txt +++ b/samples/extensions/descriptor_buffer_basic/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Sascha Willems +# Copyright (c) 2023-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "descriptor_buffer_basic/glsl/cube.frag" SHADER_FILES_HLSL "descriptor_buffer_basic/hlsl/cube.vert.hlsl" - "descriptor_buffer_basic/hlsl/cube.frag.hlsl") + "descriptor_buffer_basic/hlsl/cube.frag.hlsl" + SHADER_FILES_SLANG + "descriptor_buffer_basic/slang/cube.vert.slang" + "descriptor_buffer_basic/slang/cube.frag.slang") diff --git a/samples/extensions/descriptor_buffer_basic/README.adoc b/samples/extensions/descriptor_buffer_basic/README.adoc index 1fc6efea63..1491e682e6 100644 --- a/samples/extensions/descriptor_buffer_basic/README.adoc +++ b/samples/extensions/descriptor_buffer_basic/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023-2024, Sascha Willems +- Copyright (c) 2023-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -26,7 +26,7 @@ endif::[] == Overview Binding and managing descriptors in Vulkan can become pretty complex, both for the application and the driver. -With the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_ext_descriptor_buffer[`VK_EXT_descriptor_buffer`] extension, this interface is simplified and maps more directly to how hardware sees descriptors. +With the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_ext_descriptor_buffer[`VK_EXT_descriptor_buffer`] extension, this interface is simplified and maps more directly to how hardware sees descriptors. It also simplifies the programming model, as you no longer have to create descriptor pool upfront. This sample shows how to use that extension by rendering multiple objects with different uniform buffers and images using the new interface of creating and binding descriptors. diff --git a/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.cpp b/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.cpp index 0a0d619982..da175a50a6 100644 --- a/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.cpp +++ b/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -60,7 +60,7 @@ DescriptorBufferBasic::~DescriptorBufferBasic() } } -void DescriptorBufferBasic::request_gpu_features(vkb::PhysicalDevice &gpu) +void DescriptorBufferBasic::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -71,16 +71,10 @@ void DescriptorBufferBasic::request_gpu_features(vkb::PhysicalDevice &gpu) // Enable features required for this example // We need device addresses for buffers in certain places - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceBufferDeviceAddressFeatures, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, - bufferDeviceAddress); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddress); // We need to enable the descriptor buffer feature of the VK_EXT_descriptor_buffer extension - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorBufferFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, - descriptorBuffer); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorBufferFeaturesEXT, descriptorBuffer); } void DescriptorBufferBasic::build_command_buffers() @@ -248,9 +242,8 @@ void DescriptorBufferBasic::prepare_pipelines() vkb::initializers::vertex_input_binding_description(0, sizeof(Vertex), VK_VERTEX_INPUT_RATE_VERTEX), }; const std::vector vertex_input_attributes = { - vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0), // Location 0: Position - vkb::initializers::vertex_input_attribute_description(0, 1, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 3), // Location 1: Normal - vkb::initializers::vertex_input_attribute_description(0, 2, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 6), // Location 2: UV + vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0), // Location 0: Position + vkb::initializers::vertex_input_attribute_description(0, 1, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 6), // Location 1: UV }; VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); vertex_input_state.vertexBindingDescriptionCount = static_cast(vertex_input_bindings.size()); @@ -272,8 +265,8 @@ void DescriptorBufferBasic::prepare_pipelines() pipeline_create_info.flags = VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT; const std::array shader_stages = { - load_shader("descriptor_buffer_basic", "cube.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("descriptor_buffer_basic", "cube.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}; + load_shader("descriptor_buffer_basic", "cube.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("descriptor_buffer_basic", "cube.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}; pipeline_create_info.stageCount = static_cast(shader_stages.size()); pipeline_create_info.pStages = shader_stages.data(); diff --git a/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.h b/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.h index ef99667698..fe9242b230 100644 --- a/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.h +++ b/samples/extensions/descriptor_buffer_basic/descriptor_buffer_basic.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -72,7 +72,7 @@ class DescriptorBufferBasic : public ApiVulkanSample DescriptorBufferBasic(); ~DescriptorBufferBasic() override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void load_assets(); void setup_descriptor_set_layout(); diff --git a/samples/extensions/descriptor_indexing/CMakeLists.txt b/samples/extensions/descriptor_indexing/CMakeLists.txt index 105675f305..74a4389d2b 100644 --- a/samples/extensions/descriptor_indexing/CMakeLists.txt +++ b/samples/extensions/descriptor_indexing/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, Arm Limited and Contributors +# Copyright (c) 2021-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -35,4 +35,9 @@ add_sample_with_tags( "descriptor_indexing/hlsl/nonuniform-quads.frag.hlsl" "descriptor_indexing/hlsl/update-after-bind-quads.vert.hlsl" "descriptor_indexing/hlsl/update-after-bind-quads.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_descriptor_indexing") + DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_descriptor_indexing" + SHADER_FILES_SLANG + "descriptor_indexing/slang/nonuniform-quads.vert.slang" + "descriptor_indexing/slang/nonuniform-quads.frag.slang" + "descriptor_indexing/slang/update-after-bind-quads.vert.slang" + "descriptor_indexing/slang/update-after-bind-quads.frag.slang") diff --git a/samples/extensions/descriptor_indexing/descriptor_indexing.cpp b/samples/extensions/descriptor_indexing/descriptor_indexing.cpp index a514360d06..7f853d0e72 100644 --- a/samples/extensions/descriptor_indexing/descriptor_indexing.cpp +++ b/samples/extensions/descriptor_indexing/descriptor_indexing.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -32,8 +32,8 @@ DescriptorIndexing::DescriptorIndexing() // See: https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2350. add_device_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME); -#if defined(PLATFORM__MACOS) && TARGET_OS_OSX - // On macOS use layer setting to configure MoltenVK for using Metal argument buffers (needed for descriptor indexing) +#if defined(PLATFORM__MACOS) + // On Apple use layer setting to enable MoltenVK's Metal argument buffers - needed for descriptor indexing/scaling add_instance_extension(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, /*optional*/ true); VkLayerSettingEXT layerSetting; @@ -47,10 +47,6 @@ DescriptorIndexing::DescriptorIndexing() layerSetting.pValues = &useMetalArgumentBuffers; add_layer_setting(layerSetting); - - // On macOS also set environment variable as fallback in case layer settings not available at runtime with older SDKs - // Will not work in batch mode, but is the best we can do short of using the deprecated MoltenVK private config API - setenv("MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", "1", 1); #endif } @@ -348,12 +344,12 @@ void DescriptorIndexing::create_pipelines() info.pStages = stages; info.stageCount = 2; - stages[0] = load_shader("descriptor_indexing", "nonuniform-quads.vert", VK_SHADER_STAGE_VERTEX_BIT); - stages[1] = load_shader("descriptor_indexing", "nonuniform-quads.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + stages[0] = load_shader("descriptor_indexing", "nonuniform-quads.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + stages[1] = load_shader("descriptor_indexing", "nonuniform-quads.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &pipelines.non_uniform_indexing)); - stages[0] = load_shader("descriptor_indexing", "update-after-bind-quads.vert", VK_SHADER_STAGE_VERTEX_BIT); - stages[1] = load_shader("descriptor_indexing", "update-after-bind-quads.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + stages[0] = load_shader("descriptor_indexing", "update-after-bind-quads.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + stages[1] = load_shader("descriptor_indexing", "update-after-bind-quads.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &pipelines.update_after_bind)); } @@ -383,7 +379,7 @@ DescriptorIndexing::TestImage DescriptorIndexing::create_image(const float rgb[3 vkGetImageMemoryRequirements(get_device().get_handle(), test_image.image, &memory_requirements); memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &test_image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), test_image.image, test_image.memory, 0)); @@ -471,23 +467,24 @@ DescriptorIndexing::TestImage DescriptorIndexing::create_image(const float rgb[3 staging_buffer.flush(); staging_buffer.unmap(); - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - vkb::image_layout_transition(cmd.get_handle(), test_image.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + vkb::image_layout_transition(cmd->get_handle(), test_image.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkBufferImageCopy copy_info{}; copy_info.imageSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; copy_info.imageExtent = image_info.extent; - vkCmdCopyBufferToImage(cmd.get_handle(), staging_buffer.get_handle(), test_image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_info); + vkCmdCopyBufferToImage(cmd->get_handle(), staging_buffer.get_handle(), test_image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_info); - vkb::image_layout_transition(cmd.get_handle(), test_image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + vkb::image_layout_transition(cmd->get_handle(), test_image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - VK_CHECK(cmd.end()); + cmd->end(); // Not very optimal, but it's the simplest solution. - get_device().get_suitable_graphics_queue().submit(cmd, VK_NULL_HANDLE); - get_device().get_suitable_graphics_queue().wait_idle(); + auto const &graphicsQueue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); + graphicsQueue.submit(*cmd, VK_NULL_HANDLE); + graphicsQueue.wait_idle(); return test_image; } @@ -538,38 +535,20 @@ bool DescriptorIndexing::prepare(const vkb::ApplicationOptions &options) return true; } -void DescriptorIndexing::request_gpu_features(vkb::PhysicalDevice &gpu) +void DescriptorIndexing::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { gpu.get_mutable_requested_features().shaderSampledImageArrayDynamicIndexing = VK_TRUE; - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - shaderSampledImageArrayNonUniformIndexing); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, shaderSampledImageArrayNonUniformIndexing); // These are required to support the 4 descriptor binding flags we use in this sample. - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - descriptorBindingSampledImageUpdateAfterBind); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - descriptorBindingPartiallyBound); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - descriptorBindingUpdateUnusedWhilePending); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - descriptorBindingVariableDescriptorCount); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, descriptorBindingSampledImageUpdateAfterBind); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, descriptorBindingPartiallyBound); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, descriptorBindingUpdateUnusedWhilePending); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, descriptorBindingVariableDescriptorCount); // Enables use of runtimeDescriptorArrays in SPIR-V shaders. - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - runtimeDescriptorArray); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, runtimeDescriptorArray); // There are lot of properties associated with descriptor_indexing, grab them here. descriptor_indexing_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT; diff --git a/samples/extensions/descriptor_indexing/descriptor_indexing.h b/samples/extensions/descriptor_indexing/descriptor_indexing.h index 195bcb7f65..2e5daecb59 100644 --- a/samples/extensions/descriptor_indexing/descriptor_indexing.h +++ b/samples/extensions/descriptor_indexing/descriptor_indexing.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -28,7 +28,7 @@ class DescriptorIndexing : public ApiVulkanSample ~DescriptorIndexing(); private: - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual void render(float delta_time) override; virtual void build_command_buffers() override; virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; diff --git a/samples/extensions/dynamic_blending/CMakeLists.txt b/samples/extensions/dynamic_blending/CMakeLists.txt index 8ebd3e9efb..8a53d7f1b7 100644 --- a/samples/extensions/dynamic_blending/CMakeLists.txt +++ b/samples/extensions/dynamic_blending/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample( "dynamic_blending/glsl/blending.frag" SHADER_FILES_HLSL "dynamic_blending/hlsl/blending.vert.hlsl" - "dynamic_blending/hlsl/blending.frag.hlsl") + "dynamic_blending/hlsl/blending.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_blending/slang/blending.vert.slang" + "dynamic_blending/slang/blending.frag.slang") diff --git a/samples/extensions/dynamic_blending/README.adoc b/samples/extensions/dynamic_blending/README.adoc index f58d645cc2..aed5ac4912 100644 --- a/samples/extensions/dynamic_blending/README.adoc +++ b/samples/extensions/dynamic_blending/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -58,10 +58,10 @@ The sample demonstrates how the use of each operator affects color blending. == Documentation links -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorBlendEnableEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetColorBlendEnableEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorBlendEquationEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetColorBlendEquationEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorBlendAdvancedEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetColorBlendAdvancedEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorWriteMaskEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetColorWriteMaskEXT.html diff --git a/samples/extensions/dynamic_blending/dynamic_blending.cpp b/samples/extensions/dynamic_blending/dynamic_blending.cpp index fa56aa7efe..87dc987a77 100644 --- a/samples/extensions/dynamic_blending/dynamic_blending.cpp +++ b/samples/extensions/dynamic_blending/dynamic_blending.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica +/* Copyright (c) 2023-2025, Mobica * * SPDX-License-Identifier: Apache-2.0 * @@ -147,36 +147,20 @@ void DynamicBlending::prepare_scene() {1.0f, 1.0f, 1.0f, 0.5f}}}; } -void DynamicBlending::request_gpu_features(vkb::PhysicalDevice &gpu) +void DynamicBlending::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // We must have this or the sample isn't useful REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, extendedDynamicState3ColorBlendEnable); // Only request the features that we support - REQUEST_OPTIONAL_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3ColorWriteMask); - REQUEST_OPTIONAL_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3ColorBlendEnable); - REQUEST_OPTIONAL_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3ColorBlendAdvanced); - REQUEST_OPTIONAL_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3ColorBlendEquation); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3ColorWriteMask); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3ColorBlendEnable); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3ColorBlendAdvanced); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3ColorBlendEquation); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, - advancedBlendCoherentOperations); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, advancedBlendCoherentOperations); } void DynamicBlending::prepare_uniform_buffers() @@ -347,8 +331,8 @@ void DynamicBlending::create_pipelines() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("dynamic_blending", "blending.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_blending", "blending.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_blending", "blending.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_blending", "blending.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VkGraphicsPipelineCreateInfo graphics_create{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; graphics_create.pNext = VK_NULL_HANDLE; diff --git a/samples/extensions/dynamic_blending/dynamic_blending.h b/samples/extensions/dynamic_blending/dynamic_blending.h index f7b734abf7..d66ad2bdd1 100644 --- a/samples/extensions/dynamic_blending/dynamic_blending.h +++ b/samples/extensions/dynamic_blending/dynamic_blending.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica +/* Copyright (c) 2023-2025, Mobica * * SPDX-License-Identifier: Apache-2.0 * @@ -28,7 +28,7 @@ class DynamicBlending : public ApiVulkanSample void render(float delta_time) override; void build_command_buffers() override; bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; bool resize(const uint32_t width, const uint32_t height) override; diff --git a/samples/extensions/dynamic_line_rasterization/CMakeLists.txt b/samples/extensions/dynamic_line_rasterization/CMakeLists.txt index f8444ca9a5..ef8d1d1c41 100644 --- a/samples/extensions/dynamic_line_rasterization/CMakeLists.txt +++ b/samples/extensions/dynamic_line_rasterization/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample( "dynamic_line_rasterization/hlsl/base.vert.hlsl" "dynamic_line_rasterization/hlsl/base.frag.hlsl" "dynamic_line_rasterization/hlsl/grid.vert.hlsl" - "dynamic_line_rasterization/hlsl/grid.frag.hlsl") + "dynamic_line_rasterization/hlsl/grid.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_line_rasterization/slang/base.vert.slang" + "dynamic_line_rasterization/slang/base.frag.slang" + "dynamic_line_rasterization/slang/grid.vert.slang" + "dynamic_line_rasterization/slang/grid.frag.slang") diff --git a/samples/extensions/dynamic_line_rasterization/README.adoc b/samples/extensions/dynamic_line_rasterization/README.adoc index f913604c72..0a3469ebbc 100644 --- a/samples/extensions/dynamic_line_rasterization/README.adoc +++ b/samples/extensions/dynamic_line_rasterization/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023-2024, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -57,12 +57,12 @@ The infinite grid shader is based on the code from the https://asliceofrendering == Documentation links -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetLineStippleEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetLineStippleEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetPolygonModeEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetPolygonModeEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetLineRasterizationModeEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetLineRasterizationModeEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetLineStippleEnableEXT.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetLineStippleEnableEXT.html -https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetLineWidth.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetLineWidth.html diff --git a/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.cpp b/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.cpp index 8c5e61d8fd..ff519cf5ca 100644 --- a/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.cpp +++ b/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -234,8 +234,8 @@ void DynamicLineRasterization::create_pipelines() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("dynamic_line_rasterization", "base.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_line_rasterization", "base.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_line_rasterization", "base.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_line_rasterization", "base.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VkGraphicsPipelineCreateInfo graphics_create{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; graphics_create.pNext = VK_NULL_HANDLE; @@ -260,8 +260,8 @@ void DynamicLineRasterization::create_pipelines() VK_NULL_HANDLE, &pipelines.object)); - shader_stages[0] = load_shader("dynamic_line_rasterization", "grid.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_line_rasterization", "grid.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_line_rasterization", "grid.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_line_rasterization", "grid.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); graphics_create.pStages = shader_stages.data(); vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); graphics_create.pVertexInputState = &vertex_input_state; @@ -427,47 +427,20 @@ void DynamicLineRasterization::build_command_buffers() } } -void DynamicLineRasterization::request_gpu_features(vkb::PhysicalDevice &gpu) +void DynamicLineRasterization::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, smoothLines); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceLineRasterizationFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, - stippledSmoothLines); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceLineRasterizationFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, - bresenhamLines); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceLineRasterizationFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, - stippledBresenhamLines); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceLineRasterizationFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, - rectangularLines); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceLineRasterizationFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, - stippledRectangularLines); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, - extendedDynamicState); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3PolygonMode); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3LineRasterizationMode); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3LineStippleEnable); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, smoothLines); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, stippledSmoothLines); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, bresenhamLines); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, stippledBresenhamLines); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, rectangularLines); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceLineRasterizationFeaturesEXT, stippledRectangularLines); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, extendedDynamicState); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3PolygonMode); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3LineRasterizationMode); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3LineStippleEnable); { auto &features = gpu.get_mutable_requested_features(); diff --git a/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.h b/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.h index d8e5a23f45..47342edddf 100644 --- a/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.h +++ b/samples/extensions/dynamic_line_rasterization/dynamic_line_rasterization.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -28,7 +28,7 @@ class DynamicLineRasterization : public ApiVulkanSample void render(float delta_time) override; void build_command_buffers() override; bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; bool resize(const uint32_t width, const uint32_t height) override; diff --git a/samples/api/hlsl_shaders/CMakeLists.txt b/samples/extensions/dynamic_multisample_rasterization/CMakeLists.txt similarity index 61% rename from samples/api/hlsl_shaders/CMakeLists.txt rename to samples/extensions/dynamic_multisample_rasterization/CMakeLists.txt index a3d110dca2..2f6839847d 100644 --- a/samples/api/hlsl_shaders/CMakeLists.txt +++ b/samples/extensions/dynamic_multisample_rasterization/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Sascha Willems +# Copyright (c) 2024-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -19,12 +19,15 @@ get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) -add_sample_with_tags( +add_sample( ID ${FOLDER_NAME} CATEGORY ${CATEGORY_NAME} - AUTHOR "Sascha Willems" - NAME "Using HLSL shaders in Vulkan with glslang" - DESCRIPTION "Shows how to generate SPIR-V from HLSL shaders that can be used in Vulkan" + AUTHOR "Mobica" + NAME "Dynamic Multisample Rasterization" + DESCRIPTION "Demonstrate how to use dynamic multisample rasterization (MSAA) from VK_EXT_extended_dynamic_state3 extension" SHADER_FILES_GLSL - "hlsl_shaders/hlsl_shader.vert" - "hlsl_shaders/hlsl_shader.frag") \ No newline at end of file + "dynamic_multisample_rasterization/glsl/model.vert" + "dynamic_multisample_rasterization/glsl/model.frag" + SHADER_FILES_SLANG + "dynamic_multisample_rasterization/slang/model.vert.slang" + "dynamic_multisample_rasterization/slang/model.frag.slang") diff --git a/samples/extensions/dynamic_multisample_rasterization/README.adoc b/samples/extensions/dynamic_multisample_rasterization/README.adoc new file mode 100644 index 0000000000..2534677893 --- /dev/null +++ b/samples/extensions/dynamic_multisample_rasterization/README.adoc @@ -0,0 +1,44 @@ +//// +- Copyright (c) 2024, Mobica Limited +- +- SPDX-License-Identifier: Apache-2.0 +- +- Licensed under the Apache License, Version 2.0 the "License"; +- you may not use this file except in compliance with the License. +- You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +- Unless required by applicable law or agreed to in writing, software +- distributed under the License is distributed on an "AS IS" BASIS, +- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +- See the License for the specific language governing permissions and +- limitations under the License. +- +//// + +// Extended dynamic_state3: Rasterization samples + + +== Overview + +This sample demonstrates one of the functionalities of VK_EXT_extended_dynamic_state3 related to rasterization samples. +The extension can be used to dynamically change sampling without need to swap pipelines. +image:./image/image.png[] + +== Enabling the extension + +To be able to use this extension in Vulkan API: +`VK_EXT_extended_dynamic_state3` depends on `VK_KHR_get_physical_device_properties2`, which is promoted to Vulkan 1.1. That is, to use this extension, `VK_EXT_extended_dynamic_state3` and either `VK_KHR_get_physical_device_properties2` or Vulkan 1.1 are required. +Additionally this sample uses `VK_KHR_dynamic_rendering` which required Vulkan 1.2. + +== Using the extension + +To use the extension: +1) `VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT` must be added to `VkPipelineDynamicStateCreateInfo`. +2) Method `void vkCmdSetRasterizationSamplesEXT(VkCommandBuffer commandBuffer, VkSampleCountFlagBits rasterizationSamples)` should be called with the active command buffer. + +== Resources + +https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state3.html +https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetRasterizationSamplesEXT.html diff --git a/samples/extensions/dynamic_multisample_rasterization/dynamic_multisample_rasterization.cpp b/samples/extensions/dynamic_multisample_rasterization/dynamic_multisample_rasterization.cpp new file mode 100644 index 0000000000..242f936635 --- /dev/null +++ b/samples/extensions/dynamic_multisample_rasterization/dynamic_multisample_rasterization.cpp @@ -0,0 +1,923 @@ +/* Copyright (c) 2024-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "dynamic_multisample_rasterization.h" + +#include "gltf_loader.h" +#include "scene_graph/components/material.h" +#include "scene_graph/components/mesh.h" +#include "scene_graph/components/pbr_material.h" +#include "scene_graph/components/sub_mesh.h" + +DynamicMultisampleRasterization::DynamicMultisampleRasterization() +{ + title = "DynamicState3 Multisample Rasterization"; + + set_api_version(VK_API_VERSION_1_2); + add_device_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); + add_device_extension(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); +} + +DynamicMultisampleRasterization::~DynamicMultisampleRasterization() +{ + if (has_device()) + { + vkDestroyPipeline(get_device().get_handle(), pipeline_opaque, nullptr); + vkDestroyPipeline(get_device().get_handle(), pipeline_opaque_flipped, nullptr); + vkDestroyPipeline(get_device().get_handle(), pipeline_transparent, nullptr); + vkDestroyPipeline(get_device().get_handle(), pipeline_transparent_flipped, nullptr); + vkDestroyPipelineLayout(get_device().get_handle(), pipeline_layout, nullptr); + vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout, nullptr); + + vkDestroyPipeline(get_device().get_handle(), pipeline_gui, nullptr); + vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout_gui, nullptr); + vkDestroyDescriptorPool(get_device().get_handle(), descriptor_pool_gui, VK_NULL_HANDLE); + destroy_image_data(depth_stencil); + destroy_image_data(color_attachment); + } +} + +void DynamicMultisampleRasterization::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) +{ + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3RasterizationSamples); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingFeaturesKHR, dynamicRendering); +} + +const std::string to_string(VkSampleCountFlagBits count) +{ + switch (count) + { + case VK_SAMPLE_COUNT_1_BIT: + return "No MSAA"; + case VK_SAMPLE_COUNT_2_BIT: + return "2X MSAA"; + case VK_SAMPLE_COUNT_4_BIT: + return "4X MSAA"; + case VK_SAMPLE_COUNT_8_BIT: + return "8X MSAA"; + case VK_SAMPLE_COUNT_16_BIT: + return "16X MSAA"; + case VK_SAMPLE_COUNT_32_BIT: + return "32X MSAA"; + case VK_SAMPLE_COUNT_64_BIT: + return "64X MSAA"; + default: + return "Unknown"; + } +} + +void DynamicMultisampleRasterization::prepare_supported_sample_count_list() +{ + if (sample_count_prepared) + return; + + VkPhysicalDeviceProperties gpu_properties; + vkGetPhysicalDeviceProperties(get_device().get_gpu().get_handle(), &gpu_properties); + + VkSampleCountFlags supported_by_depth_and_color = gpu_properties.limits.framebufferColorSampleCounts & gpu_properties.limits.framebufferDepthSampleCounts; + + // All possible sample counts are listed here from most to least preferred as default + // On Mali GPUs 4X MSAA is recommended as best performance/quality trade-off + std::vector counts = {VK_SAMPLE_COUNT_4_BIT, VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_8_BIT, + VK_SAMPLE_COUNT_16_BIT, VK_SAMPLE_COUNT_32_BIT, VK_SAMPLE_COUNT_64_BIT, + VK_SAMPLE_COUNT_1_BIT}; + + std::copy_if(counts.begin(), + counts.end(), + std::back_inserter(supported_sample_count_list), + [&supported_by_depth_and_color](auto count) { return supported_by_depth_and_color & count; }); + std::transform(supported_sample_count_list.begin(), + supported_sample_count_list.end(), + std::back_inserter(gui_settings.sample_counts), + [](auto count) { return to_string(count); }); + if (!supported_sample_count_list.empty()) + { + sample_count = supported_sample_count_list.front(); + } + + sample_count_prepared = true; +} + +bool DynamicMultisampleRasterization::prepare(const vkb::ApplicationOptions &options) +{ + if (!ApiVulkanSample::prepare(options)) + { + return false; + } + + camera.type = vkb::CameraType::LookAt; + camera.set_position(glm::vec3(1.9f, 10.f, -18.f)); + camera.set_rotation(glm::vec3(0.f, -40.f, 0.f)); + camera.rotation_speed = 0.1f; + + // Note: Using reversed depth-buffer for increased precision, so Znear and Zfar are flipped + camera.set_perspective(60.0f, static_cast(width) / static_cast(height), 256.0f, 0.1f); + load_assets(); + + prepare_uniform_buffers(); + setup_descriptor_set_layout(); + prepare_pipelines(); + setup_descriptor_pool(); + setup_descriptor_sets(); + + update_resources(); + + prepared = true; + return true; +} + +void DynamicMultisampleRasterization::draw_node(VkCommandBuffer &draw_cmd_buffer, SceneNode &node) +{ + assert(node.sub_mesh->vertex_buffers.count("position") == 1); + assert(node.sub_mesh->vertex_buffers.count("normal") == 1); + assert(node.sub_mesh->vertex_buffers.count("texcoord_0") == 1); + + const auto &vertex_buffer_pos = node.sub_mesh->vertex_buffers.at("position"); + const auto &vertex_buffer_normal = node.sub_mesh->vertex_buffers.at("normal"); + const auto &vertex_buffer_uv = node.sub_mesh->vertex_buffers.at("texcoord_0"); + auto &index_buffer = node.sub_mesh->index_buffer; + + // Pass data for the current node via push commands + auto node_material = dynamic_cast(node.sub_mesh->get_material()); + assert(node_material); + + push_const_block.model_matrix = node.node->get_transform().get_world_matrix(); + + push_const_block.base_color_factor = node_material->base_color_factor; + push_const_block.metallic_factor = node_material->metallic_factor; + push_const_block.roughness_factor = node_material->roughness_factor; + push_const_block.base_texture_index = -1; + push_const_block.normal_texture_index = -1; + push_const_block.pbr_texture_index = -1; + + auto base_color_texture = node_material->textures.find("base_color_texture"); + + if (base_color_texture != node_material->textures.end()) + { + push_const_block.base_texture_index = name_to_texture_id.at(base_color_texture->second->get_name()); + } + + auto normal_texture = node_material->textures.find("normal_texture"); + + if (normal_texture != node_material->textures.end()) + { + push_const_block.normal_texture_index = name_to_texture_id.at(normal_texture->second->get_name()); + } + + auto metallic_roughness_texture = node_material->textures.find("metallic_roughness_texture"); + + if (metallic_roughness_texture != node_material->textures.end()) + { + push_const_block.pbr_texture_index = name_to_texture_id.at(metallic_roughness_texture->second->get_name()); + } + + vkCmdPushConstants(draw_cmd_buffer, pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(push_const_block), &push_const_block); + + VkDeviceSize offsets[1] = {0}; + vkCmdBindVertexBuffers(draw_cmd_buffer, 0, 1, vertex_buffer_pos.get(), offsets); + vkCmdBindVertexBuffers(draw_cmd_buffer, 1, 1, vertex_buffer_normal.get(), offsets); + vkCmdBindVertexBuffers(draw_cmd_buffer, 2, 1, vertex_buffer_uv.get(), offsets); + vkCmdBindIndexBuffer(draw_cmd_buffer, index_buffer->get_handle(), 0, node.sub_mesh->index_type); + + vkCmdDraw(draw_cmd_buffer, node.sub_mesh->vertex_indices, 1, 0, 0); +} + +void DynamicMultisampleRasterization::build_command_buffers() +{ + VkCommandBufferBeginInfo command_buffer_begin_info = vkb::initializers::command_buffer_begin_info(); + + std::vector clear_values(2); + clear_values[0].color = {{0.0f, 0.0f, 0.0f, 0.0f}}; + clear_values[1].depthStencil = {0.0f, 0}; + + std::vector attachments(2); + attachments_setup(attachments, clear_values); + + VkImageSubresourceRange range{}; + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + range.baseMipLevel = 0; + range.levelCount = VK_REMAINING_MIP_LEVELS; + range.baseArrayLayer = 0; + range.layerCount = VK_REMAINING_ARRAY_LAYERS; + + VkImageSubresourceRange depth_range{range}; + depth_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + + for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) + { + VK_CHECK(vkBeginCommandBuffer(draw_cmd_buffers[i], &command_buffer_begin_info)); + + if (sample_count != VK_SAMPLE_COUNT_1_BIT) + { + attachments[0].resolveImageView = swapchain_buffers[i].view; + } + else + { + attachments[0].imageView = swapchain_buffers[i].view; + } + auto render_area = VkRect2D{VkOffset2D{}, VkExtent2D{width, height}}; + auto render_info = vkb::initializers::rendering_info(render_area, 1, &attachments[0]); + render_info.layerCount = 1; + render_info.pDepthAttachment = &attachments[1]; + + vkb::image_layout_transition(draw_cmd_buffers[i], + swapchain_buffers[i].image, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + 0, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + range); + + vkb::image_layout_transition(draw_cmd_buffers[i], + depth_stencil.image, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, + depth_range); + + vkCmdBeginRenderingKHR(draw_cmd_buffers[i], &render_info); + vkCmdSetRasterizationSamplesEXT(draw_cmd_buffers[i], sample_count); // VK_EXT_extended_dynamic_state3 + + VkViewport viewport = vkb::initializers::viewport(static_cast(width), static_cast(height), 0.0f, 1.0f); + vkCmdSetViewport(draw_cmd_buffers[i], 0, 1, &viewport); + + VkRect2D scissor = vkb::initializers::rect2D(width, height, 0, 0); + vkCmdSetScissor(draw_cmd_buffers[i], 0, 1, &scissor); + + vkCmdBindDescriptorSets(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_set, 0, nullptr); + + if (!scene_nodes_opaque.empty()) + { + vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_opaque); + for (auto &node : scene_nodes_opaque) + { + draw_node(draw_cmd_buffers[i], node); + } + } + + if (!scene_nodes_opaque_flipped.empty()) + { + vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_opaque_flipped); + for (auto &node : scene_nodes_opaque_flipped) + { + draw_node(draw_cmd_buffers[i], node); + } + } + + if (!scene_nodes_transparent.empty()) + { + vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_transparent); + for (auto &node : scene_nodes_transparent) + { + draw_node(draw_cmd_buffers[i], node); + } + } + + if (!scene_nodes_transparent_flipped.empty()) + { + vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_transparent_flipped); + for (auto &node : scene_nodes_transparent_flipped) + { + draw_node(draw_cmd_buffers[i], node); + } + } + + draw_ui(draw_cmd_buffers[i]); + + vkCmdEndRenderingKHR(draw_cmd_buffers[i]); + + vkb::image_layout_transition(draw_cmd_buffers[i], + swapchain_buffers[i].image, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + range); + + VK_CHECK(vkEndCommandBuffer(draw_cmd_buffers[i])); + } +} + +void DynamicMultisampleRasterization::draw_ui(VkCommandBuffer &cmd_buffer) +{ + if (has_gui()) + { + get_gui().draw(cmd_buffer, pipeline_gui, pipeline_layout_gui, descriptor_set_gui); + } +} + +void DynamicMultisampleRasterization::load_assets() +{ + vkb::GLTFLoader loader{get_device()}; + scene = loader.read_scene_from_file("scenes/space_module/SpaceModule.gltf"); + assert(scene); + // Store all scene nodes in separate vectors for easier rendering + for (auto &mesh : scene->get_components()) + { + for (auto &node : mesh->get_nodes()) + { + for (auto &sub_mesh : mesh->get_submeshes()) + { + auto &scale = node->get_transform().get_scale(); + + bool flipped = scale.x * scale.y * scale.z < 0; + bool transparent = sub_mesh->get_material()->alpha_mode == vkb::sg::AlphaMode::Blend; + + if (transparent) // transparent material + { + if (flipped) + scene_nodes_transparent_flipped.push_back({node, sub_mesh}); + else + scene_nodes_transparent.push_back({node, sub_mesh}); + } + else // opaque material + { + if (flipped) + scene_nodes_opaque_flipped.push_back({node, sub_mesh}); + else + scene_nodes_opaque.push_back({node, sub_mesh}); + } + } + } + } + + auto textures = scene->get_components(); + + for (auto texture : textures) + { + const auto &name = texture->get_name(); + auto image = texture->get_image(); + VkDescriptorImageInfo imageInfo; + imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.imageView = image->get_vk_image_view().get_handle(); + imageInfo.sampler = texture->get_sampler()->get_core_sampler().get_handle(); + + image_infos.push_back(imageInfo); + name_to_texture_id.emplace(name, static_cast(image_infos.size()) - 1); + } +} + +void DynamicMultisampleRasterization::setup_descriptor_pool() +{ + std::vector pool_sizes = { + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, static_cast(image_infos.size()))}; + + VkDescriptorPoolCreateInfo descriptor_pool_create_info = + vkb::initializers::descriptor_pool_create_info(static_cast(pool_sizes.size()), pool_sizes.data(), 2); + VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &descriptor_pool_create_info, nullptr, &descriptor_pool)); +} + +void DynamicMultisampleRasterization::setup_descriptor_set_layout() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 1, static_cast(image_infos.size())), + }; + + VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info = + vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings.data(), static_cast(set_layout_bindings.size())); + + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout_create_info, nullptr, &descriptor_set_layout)); + + VkPipelineLayoutCreateInfo pipeline_layout_create_info = + vkb::initializers::pipeline_layout_create_info( + &descriptor_set_layout, + 1); + + // Pass scene node information via push constants + VkPushConstantRange push_constant_range = vkb::initializers::push_constant_range(VK_SHADER_STAGE_VERTEX_BIT, sizeof(push_const_block), 0); + pipeline_layout_create_info.pushConstantRangeCount = 1; + pipeline_layout_create_info.pPushConstantRanges = &push_constant_range; + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout)); +} + +void DynamicMultisampleRasterization::setup_descriptor_sets() +{ + VkDescriptorSetAllocateInfo alloc_info = + vkb::initializers::descriptor_set_allocate_info( + descriptor_pool, + &descriptor_set_layout, + 1); + + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &descriptor_set)); + + VkDescriptorBufferInfo matrix_buffer_descriptor = create_descriptor(*uniform_buffer); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &matrix_buffer_descriptor), + vkb::initializers::write_descriptor_set(descriptor_set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, image_infos.data(), image_infos.size())}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr); +} + +void DynamicMultisampleRasterization::attachments_setup(std::vector &attachments, std::vector &clear_values) +{ + prepare_supported_sample_count_list(); + destroy_image_data(color_attachment); + destroy_image_data(depth_stencil); + setup_color_attachment(); + setup_depth_stencil(); + + attachments[0].sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; + attachments[0].imageView = color_attachment.view; + attachments[0].imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachments[0].clearValue = clear_values[0]; + attachments[0].pNext = VK_NULL_HANDLE; + attachments[0].resolveImageView = VK_NULL_HANDLE; + + if (sample_count != VK_SAMPLE_COUNT_1_BIT) + { + attachments[0].resolveImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachments[0].resolveMode = VK_RESOLVE_MODE_AVERAGE_BIT; + } + else + { + attachments[0].resolveImageLayout = VK_IMAGE_LAYOUT_UNDEFINED; + attachments[0].resolveMode = VK_RESOLVE_MODE_NONE; + } + + // Depth attachment + attachments[1].sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; + attachments[1].imageView = depth_stencil.view; + attachments[1].imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[1].clearValue = clear_values[1]; + attachments[1].pNext = VK_NULL_HANDLE; +} + +// Create attachment that will be used in a dynamic rendering. +void DynamicMultisampleRasterization::setup_color_attachment() +{ + VkImageCreateInfo image_create_info{}; + image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + image_create_info.imageType = VK_IMAGE_TYPE_2D; + image_create_info.format = get_render_context().get_format(); + image_create_info.extent = {get_render_context().get_surface_extent().width, get_render_context().get_surface_extent().height, 1}; + image_create_info.mipLevels = 1; + image_create_info.arrayLayers = 1; + image_create_info.samples = sample_count; + image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; + image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + + VK_CHECK(vkCreateImage(get_device().get_handle(), &image_create_info, nullptr, &color_attachment.image)); + VkMemoryRequirements memReqs{}; + vkGetImageMemoryRequirements(get_device().get_handle(), color_attachment.image, &memReqs); + + VkMemoryAllocateInfo memory_allocation{}; + memory_allocation.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + memory_allocation.allocationSize = memReqs.size; + memory_allocation.memoryTypeIndex = get_device().get_gpu().get_memory_type(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation, nullptr, &color_attachment.mem)); + VK_CHECK(vkBindImageMemory(get_device().get_handle(), color_attachment.image, color_attachment.mem, 0)); + + VkImageViewCreateInfo image_view_create_info{}; + image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; + image_view_create_info.image = color_attachment.image; + image_view_create_info.format = get_render_context().get_format(); + image_view_create_info.subresourceRange.baseMipLevel = 0; + image_view_create_info.subresourceRange.levelCount = 1; + image_view_create_info.subresourceRange.baseArrayLayer = 0; + image_view_create_info.subresourceRange.layerCount = 1; + image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + // Stencil aspect should only be set on depth + stencil formats (VK_FORMAT_D16_UNORM_S8_UINT..VK_FORMAT_D32_SFLOAT_S8_UINT + if (depth_format >= VK_FORMAT_D16_UNORM_S8_UINT) + { + image_view_create_info.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + VK_CHECK(vkCreateImageView(get_device().get_handle(), &image_view_create_info, nullptr, &color_attachment.view)); +} + +void DynamicMultisampleRasterization::setup_depth_stencil() +{ + VkImageCreateInfo image_create_info{}; + image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + image_create_info.imageType = VK_IMAGE_TYPE_2D; + image_create_info.format = depth_format; + image_create_info.extent = {get_render_context().get_surface_extent().width, get_render_context().get_surface_extent().height, 1}; + image_create_info.mipLevels = 1; + image_create_info.arrayLayers = 1; + image_create_info.samples = sample_count; + image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; + image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + + VK_CHECK(vkCreateImage(get_device().get_handle(), &image_create_info, nullptr, &depth_stencil.image)); + VkMemoryRequirements memReqs{}; + vkGetImageMemoryRequirements(get_device().get_handle(), depth_stencil.image, &memReqs); + + VkMemoryAllocateInfo memory_allocation{}; + memory_allocation.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + memory_allocation.allocationSize = memReqs.size; + memory_allocation.memoryTypeIndex = get_device().get_gpu().get_memory_type(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation, nullptr, &depth_stencil.mem)); + VK_CHECK(vkBindImageMemory(get_device().get_handle(), depth_stencil.image, depth_stencil.mem, 0)); + + VkImageViewCreateInfo image_view_create_info{}; + image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; + image_view_create_info.image = depth_stencil.image; + image_view_create_info.format = depth_format; + image_view_create_info.subresourceRange.baseMipLevel = 0; + image_view_create_info.subresourceRange.levelCount = 1; + image_view_create_info.subresourceRange.baseArrayLayer = 0; + image_view_create_info.subresourceRange.layerCount = 1; + image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + // Stencil aspect should only be set on depth + stencil formats (VK_FORMAT_D16_UNORM_S8_UINT..VK_FORMAT_D32_SFLOAT_S8_UINT + if (depth_format >= VK_FORMAT_D16_UNORM_S8_UINT) + { + image_view_create_info.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + VK_CHECK(vkCreateImageView(get_device().get_handle(), &image_view_create_info, nullptr, &depth_stencil.view)); +} + +void DynamicMultisampleRasterization::prepare_pipelines() +{ + VkPipelineInputAssemblyStateCreateInfo input_assembly_state = + vkb::initializers::pipeline_input_assembly_state_create_info( + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + 0, + VK_FALSE); + + VkPipelineRasterizationStateCreateInfo rasterization_state = + vkb::initializers::pipeline_rasterization_state_create_info( + VK_POLYGON_MODE_FILL, + VK_CULL_MODE_BACK_BIT, + VK_FRONT_FACE_COUNTER_CLOCKWISE, + 0); + + VkPipelineColorBlendAttachmentState blend_attachment_state = + vkb::initializers::pipeline_color_blend_attachment_state( + VK_COLOR_COMPONENT_R_BIT | + VK_COLOR_COMPONENT_G_BIT | + VK_COLOR_COMPONENT_B_BIT | + VK_COLOR_COMPONENT_A_BIT, + VK_FALSE); + + blend_attachment_state.colorBlendOp = VK_BLEND_OP_ADD; + blend_attachment_state.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; + blend_attachment_state.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + blend_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD; + blend_attachment_state.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + blend_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; + + VkPipelineColorBlendStateCreateInfo color_blend_state = + vkb::initializers::pipeline_color_blend_state_create_info( + 1, + &blend_attachment_state); + + // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept + VkPipelineDepthStencilStateCreateInfo depth_stencil_state = + vkb::initializers::pipeline_depth_stencil_state_create_info( + VK_TRUE, + VK_TRUE, + VK_COMPARE_OP_GREATER); + + VkPipelineViewportStateCreateInfo viewport_state = + vkb::initializers::pipeline_viewport_state_create_info(1, 1, 0); + + VkPipelineMultisampleStateCreateInfo multisample_state = + vkb::initializers::pipeline_multisample_state_create_info( + VK_SAMPLE_COUNT_1_BIT, // disable multisampling during configuration + 0); + + std::vector dynamic_state_enables = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, + VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT /* VK_EXT_extended_dynamic_state3 */ + }; + VkPipelineDynamicStateCreateInfo dynamic_state = + vkb::initializers::pipeline_dynamic_state_create_info( + dynamic_state_enables.data(), + static_cast(dynamic_state_enables.size()), + 0); + + VkGraphicsPipelineCreateInfo pipeline_create_info = + vkb::initializers::pipeline_create_info( + pipeline_layout, + VK_NULL_HANDLE, + 0); + + // Create graphics pipeline for dynamic rendering + VkFormat color_rendering_format = get_render_context().get_format(); + + // Provide information for dynamic rendering + VkPipelineRenderingCreateInfoKHR pipeline_rendering_create_info{VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR}; + pipeline_rendering_create_info.pNext = VK_NULL_HANDLE; + pipeline_rendering_create_info.colorAttachmentCount = 1; + pipeline_rendering_create_info.pColorAttachmentFormats = &color_rendering_format; + pipeline_rendering_create_info.depthAttachmentFormat = depth_format; + + pipeline_create_info.pInputAssemblyState = &input_assembly_state; + pipeline_create_info.pRasterizationState = &rasterization_state; + pipeline_create_info.pColorBlendState = &color_blend_state; + pipeline_create_info.pMultisampleState = &multisample_state; + pipeline_create_info.pViewportState = &viewport_state; + pipeline_create_info.pDepthStencilState = &depth_stencil_state; + pipeline_create_info.pDynamicState = &dynamic_state; + pipeline_create_info.layout = pipeline_layout; + pipeline_create_info.pNext = &pipeline_rendering_create_info; + + std::array shader_stages; + pipeline_create_info.stageCount = static_cast(shader_stages.size()); + pipeline_create_info.pStages = shader_stages.data(); + + // Vertex bindings an attributes for model rendering + // Binding description, we use separate buffers for the vertex attributes + std::vector vertex_input_bindings = { + vkb::initializers::vertex_input_binding_description(0, sizeof(glm::vec3), VK_VERTEX_INPUT_RATE_VERTEX), + vkb::initializers::vertex_input_binding_description(1, sizeof(glm::vec3), VK_VERTEX_INPUT_RATE_VERTEX), + vkb::initializers::vertex_input_binding_description(2, sizeof(glm::vec2), VK_VERTEX_INPUT_RATE_VERTEX), + }; + + // Attribute descriptions + std::vector vertex_input_attributes = { + vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0), // Position + vkb::initializers::vertex_input_attribute_description(1, 1, VK_FORMAT_R32G32B32_SFLOAT, 0), // Normal + vkb::initializers::vertex_input_attribute_description(2, 2, VK_FORMAT_R32G32_SFLOAT, 0), // TexCoord + }; + + VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); + vertex_input_state.vertexBindingDescriptionCount = static_cast(vertex_input_bindings.size()); + vertex_input_state.pVertexBindingDescriptions = vertex_input_bindings.data(); + vertex_input_state.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); + vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); + + pipeline_create_info.pVertexInputState = &vertex_input_state; + + shader_stages[0] = load_shader("dynamic_multisample_rasterization", "model.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_multisample_rasterization", "model.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + + // Add a pipeline for the opaque counterclockwise faces + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline_opaque)); + + // Add a pipeline for the opaque clockwise faces + rasterization_state.frontFace = VK_FRONT_FACE_CLOCKWISE; + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline_opaque_flipped)); + + // Add a pipeline for the transparent clockwise faces + blend_attachment_state.blendEnable = VK_TRUE; + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline_transparent_flipped)); + + // Add a pipeline for the transparent counterclockwise faces + rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline_transparent)); +} + +void DynamicMultisampleRasterization::prepare_gui_pipeline() +{ + // Descriptor pool + std::vector pool_sizes = { + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1)}; + VkDescriptorPoolCreateInfo descriptorPoolInfo = vkb::initializers::descriptor_pool_create_info(pool_sizes, 2); + VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &descriptorPoolInfo, nullptr, &descriptor_pool_gui)); + + // Descriptor set layout + std::vector layout_bindings_gui = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 0), + }; + VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = vkb::initializers::descriptor_set_layout_create_info(layout_bindings_gui); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_set_layout_create_info, nullptr, &descriptor_set_layout_gui)); + + // Descriptor set + VkDescriptorSetAllocateInfo descriptor_allocation = vkb::initializers::descriptor_set_allocate_info(descriptor_pool_gui, &descriptor_set_layout_gui, 1); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &descriptor_allocation, &descriptor_set_gui)); + VkDescriptorImageInfo font_descriptor = vkb::initializers::descriptor_image_info( + get_gui().get_sampler(), + get_gui().get_font_image_view(), + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(descriptor_set_gui, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &font_descriptor)}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr); + + // Setup graphics pipeline for UI rendering + VkPipelineInputAssemblyStateCreateInfo input_assembly_state = + vkb::initializers::pipeline_input_assembly_state_create_info(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE); + + VkPipelineRasterizationStateCreateInfo rasterization_state = + vkb::initializers::pipeline_rasterization_state_create_info(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_COUNTER_CLOCKWISE); + + // Enable blending + VkPipelineColorBlendAttachmentState blend_attachment_state{}; + blend_attachment_state.blendEnable = VK_TRUE; + blend_attachment_state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + blend_attachment_state.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; + blend_attachment_state.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + blend_attachment_state.colorBlendOp = VK_BLEND_OP_ADD; + blend_attachment_state.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + blend_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; + blend_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD; + + VkPipelineColorBlendStateCreateInfo color_blend_state = + vkb::initializers::pipeline_color_blend_state_create_info(1, &blend_attachment_state); + + VkPipelineDepthStencilStateCreateInfo depth_stencil_state = + vkb::initializers::pipeline_depth_stencil_state_create_info(VK_FALSE, VK_FALSE, VK_COMPARE_OP_ALWAYS); + + VkPipelineViewportStateCreateInfo viewport_state = + vkb::initializers::pipeline_viewport_state_create_info(1, 1, 0); + + VkPipelineMultisampleStateCreateInfo multisample_state = + vkb::initializers::pipeline_multisample_state_create_info(VK_SAMPLE_COUNT_1_BIT); + + std::vector dynamic_state_enables = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, + VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT /* VK_EXT_extended_dynamic_state3 */ + }; + VkPipelineDynamicStateCreateInfo dynamic_state = + vkb::initializers::pipeline_dynamic_state_create_info(dynamic_state_enables); + + std::vector shader_modules; + + vkb::ShaderSource vert_shader("uioverlay/uioverlay.vert.spv"); + vkb::ShaderSource frag_shader("uioverlay/uioverlay.frag.spv"); + + shader_modules.push_back(&get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, vert_shader, {})); + shader_modules.push_back(&get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, frag_shader, {})); + + pipeline_layout_gui = get_device().get_resource_cache().request_pipeline_layout(shader_modules).get_handle(); + + // Create graphics pipeline for dynamic rendering + VkFormat color_rendering_format = get_render_context().get_format(); + + // Provide information for dynamic rendering + VkPipelineRenderingCreateInfoKHR pipeline_rendering_create_info{VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR}; + pipeline_rendering_create_info.pNext = VK_NULL_HANDLE; + pipeline_rendering_create_info.colorAttachmentCount = 1; + pipeline_rendering_create_info.pColorAttachmentFormats = &color_rendering_format; + pipeline_rendering_create_info.depthAttachmentFormat = depth_format; + if (!vkb::is_depth_only_format(depth_format)) + { + pipeline_rendering_create_info.stencilAttachmentFormat = depth_format; + } + + VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(pipeline_layout_gui, VK_NULL_HANDLE); + + std::array shader_stages; + + shader_stages[0] = load_shader(vert_shader.get_filename(), VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader(frag_shader.get_filename(), VK_SHADER_STAGE_FRAGMENT_BIT); + + pipeline_create_info.stageCount = static_cast(shader_stages.size()); + pipeline_create_info.pStages = shader_stages.data(); + + pipeline_create_info.pInputAssemblyState = &input_assembly_state; + pipeline_create_info.pRasterizationState = &rasterization_state; + pipeline_create_info.pColorBlendState = &color_blend_state; + pipeline_create_info.pMultisampleState = &multisample_state; + pipeline_create_info.pViewportState = &viewport_state; + pipeline_create_info.pDepthStencilState = &depth_stencil_state; + pipeline_create_info.pDynamicState = &dynamic_state; + pipeline_create_info.stageCount = static_cast(shader_stages.size()); + pipeline_create_info.pStages = shader_stages.data(); + pipeline_create_info.pNext = &pipeline_rendering_create_info; + + // Vertex bindings an attributes based on ImGui vertex definition + std::vector vertex_input_bindings = { + vkb::initializers::vertex_input_binding_description(0, sizeof(ImDrawVert), VK_VERTEX_INPUT_RATE_VERTEX), + }; + std::vector vertex_input_attributes = { + vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32_SFLOAT, offsetof(ImDrawVert, pos)), // Location 0: Position + vkb::initializers::vertex_input_attribute_description(0, 1, VK_FORMAT_R32G32_SFLOAT, offsetof(ImDrawVert, uv)), // Location 1: UV + vkb::initializers::vertex_input_attribute_description(0, 2, VK_FORMAT_R8G8B8A8_UNORM, offsetof(ImDrawVert, col)), // Location 0: Color + }; + VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info = vkb::initializers::pipeline_vertex_input_state_create_info(); + vertex_input_state_create_info.vertexBindingDescriptionCount = static_cast(vertex_input_bindings.size()); + vertex_input_state_create_info.pVertexBindingDescriptions = vertex_input_bindings.data(); + vertex_input_state_create_info.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); + vertex_input_state_create_info.pVertexAttributeDescriptions = vertex_input_attributes.data(); + + pipeline_create_info.pVertexInputState = &vertex_input_state_create_info; + + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipeline_gui)); +} + +// Prepare and initialize uniform buffer containing shader uniforms +void DynamicMultisampleRasterization::prepare_uniform_buffers() +{ + // Matrices vertex shader uniform buffer + uniform_buffer = std::make_unique(get_device(), + sizeof(uniform_data), + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VMA_MEMORY_USAGE_CPU_TO_GPU); + + update_uniform_buffers(); +} + +void DynamicMultisampleRasterization::prepare_gui() +{ + create_gui(*window, /*stats=*/nullptr, 15.0f, true); + + prepare_gui_pipeline(); + + // No need to call gui->prepare because the pipeline has been created above +} + +void DynamicMultisampleRasterization::update_uniform_buffers() +{ + uniform_data.projection = camera.matrices.perspective; + // Scale the view matrix as the model is pretty large, and also flip it upside down + uniform_data.view = glm::scale(camera.matrices.view, glm::vec3(0.1f, -0.1f, 0.1f)); + uniform_buffer->convert_and_update(uniform_data); +} + +void DynamicMultisampleRasterization::draw() +{ + ApiVulkanSample::prepare_frame(); + submit_info.commandBufferCount = 1; + submit_info.pCommandBuffers = &draw_cmd_buffers[current_buffer]; + VK_CHECK(vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE)); + ApiVulkanSample::submit_frame(); +} + +void DynamicMultisampleRasterization::render(float delta_time) +{ + if (!prepared) + { + return; + } + draw(); + + if (camera.updated) + { + update_uniform_buffers(); + } +} + +void DynamicMultisampleRasterization::destroy_image_data(ImageData &image_data) +{ + if (image_data.image != nullptr) + { + vkDestroyImageView(get_device().get_handle(), image_data.view, nullptr); + vkDestroyImage(get_device().get_handle(), image_data.image, nullptr); + vkFreeMemory(get_device().get_handle(), image_data.mem, nullptr); + image_data.view = VK_NULL_HANDLE; + image_data.image = VK_NULL_HANDLE; + image_data.mem = VK_NULL_HANDLE; + } +} + +void DynamicMultisampleRasterization::update_resources() +{ + prepared = false; + + if (has_device()) + { + get_device().wait_idle(); + rebuild_command_buffers(); + } + + prepared = true; +} + +void DynamicMultisampleRasterization::on_update_ui_overlay(vkb::Drawer &drawer) +{ + if (drawer.header("Settings")) + { + if (drawer.combo_box("antialiasing", &gui_settings.sample_count_index, gui_settings.sample_counts)) + { + sample_count = supported_sample_count_list[gui_settings.sample_count_index]; + + update_resources(); + } + } +} + +bool DynamicMultisampleRasterization::resize(const uint32_t _width, const uint32_t _height) +{ + sample_count = VK_SAMPLE_COUNT_1_BIT; + + if (!ApiVulkanSample::resize(_width, _height)) + return false; + + sample_count = supported_sample_count_list[gui_settings.sample_count_index]; + + prepared = false; + + update_resources(); + + prepared = true; + return true; +} + +std::unique_ptr> create_dynamic_multisample_rasterization() +{ + return std::make_unique(); +} \ No newline at end of file diff --git a/samples/extensions/dynamic_multisample_rasterization/dynamic_multisample_rasterization.h b/samples/extensions/dynamic_multisample_rasterization/dynamic_multisample_rasterization.h new file mode 100644 index 0000000000..75390a2ec4 --- /dev/null +++ b/samples/extensions/dynamic_multisample_rasterization/dynamic_multisample_rasterization.h @@ -0,0 +1,130 @@ +/* Copyright (c) 2024-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "api_vulkan_sample.h" + +class DynamicMultisampleRasterization : public ApiVulkanSample +{ + public: + DynamicMultisampleRasterization(); + virtual ~DynamicMultisampleRasterization(); + + private: + std::unique_ptr vertex_buffer = nullptr; + std::unique_ptr index_buffer = nullptr; + + std::unique_ptr scene; + std::vector image_infos; + std::map name_to_texture_id; + + struct SceneNode + { + vkb::scene_graph::NodeC *node; + vkb::sg::SubMesh *sub_mesh; + }; + std::vector scene_nodes_opaque; + std::vector scene_nodes_opaque_flipped; + std::vector scene_nodes_transparent; + std::vector scene_nodes_transparent_flipped; + + struct UniformData + { + glm::mat4 projection; + glm::mat4 view; + } uniform_data; + std::unique_ptr uniform_buffer; + + VkPipeline pipeline_opaque{VK_NULL_HANDLE}; + VkPipeline pipeline_opaque_flipped{VK_NULL_HANDLE}; + VkPipeline pipeline_transparent{VK_NULL_HANDLE}; + VkPipeline pipeline_transparent_flipped{VK_NULL_HANDLE}; + VkPipelineLayout pipeline_layout{VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set{VK_NULL_HANDLE}; + VkDescriptorSetLayout descriptor_set_layout{VK_NULL_HANDLE}; + + // GUI + VkPipeline pipeline_gui{VK_NULL_HANDLE}; + VkPipelineLayout pipeline_layout_gui{VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set_gui{VK_NULL_HANDLE}; + VkDescriptorSetLayout descriptor_set_layout_gui{VK_NULL_HANDLE}; + VkDescriptorPool descriptor_pool_gui{VK_NULL_HANDLE}; + + ImageData color_attachment; + + /** + * @brief List of MSAA levels supported by the platform + */ + std::vector supported_sample_count_list{}; + + /** + * @brief Enables MSAA if set to more than 1 sample per pixel + * (e.g. sample count 4 enables 4X MSAA) + */ + VkSampleCountFlagBits sample_count{VK_SAMPLE_COUNT_1_BIT}; + + bool sample_count_prepared = false; + + struct + { + glm::mat4 model_matrix; + + glm::vec4 base_color_factor; + float metallic_factor; + float roughness_factor; + + int32_t base_texture_index; + int32_t normal_texture_index; + int32_t pbr_texture_index; + + } push_const_block; + + struct GUI_settings + { + int sample_count_index = 0; + std::vector sample_counts; + } gui_settings; + + public: + virtual void build_command_buffers() override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + virtual bool prepare(const vkb::ApplicationOptions &options) override; + virtual void render(float delta_time) override; + virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; + virtual bool resize(const uint32_t _width, const uint32_t _height) override; + virtual void setup_depth_stencil() override; + virtual void prepare_gui() override; + void load_assets(); + void setup_descriptor_pool(); + void setup_descriptor_set_layout(); + void setup_descriptor_sets(); + void prepare_pipelines(); + void prepare_gui_pipeline(); + void prepare_uniform_buffers(); + void update_uniform_buffers(); + void draw(); + void prepare_supported_sample_count_list(); + void setup_color_attachment(); + void draw_ui(VkCommandBuffer &); + void update_resources(); + void draw_node(VkCommandBuffer &, SceneNode &); + void destroy_image_data(ImageData &image_data); + void attachments_setup(std::vector &attachments, std::vector &clear_values); +}; + +std::unique_ptr> create_dynamic_multisample_rasterization(); diff --git a/samples/extensions/dynamic_multisample_rasterization/image/image.png b/samples/extensions/dynamic_multisample_rasterization/image/image.png new file mode 100644 index 0000000000..091b447790 Binary files /dev/null and b/samples/extensions/dynamic_multisample_rasterization/image/image.png differ diff --git a/samples/extensions/dynamic_primitive_clipping/CMakeLists.txt b/samples/extensions/dynamic_primitive_clipping/CMakeLists.txt index 8865becd55..06c11cb576 100644 --- a/samples/extensions/dynamic_primitive_clipping/CMakeLists.txt +++ b/samples/extensions/dynamic_primitive_clipping/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Mobica Limited +# Copyright (c) 2024-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample( "dynamic_primitive_clipping/glsl/primitive_clipping.frag" SHADER_FILES_HLSL "dynamic_primitive_clipping/hlsl/primitive_clipping.vert.hlsl" - "dynamic_primitive_clipping/hlsl/primitive_clipping.frag.hlsl") + "dynamic_primitive_clipping/hlsl/primitive_clipping.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_primitive_clipping/slang/primitive_clipping.vert.slang" + "dynamic_primitive_clipping/slang/primitive_clipping.frag.slang") \ No newline at end of file diff --git a/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.cpp b/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.cpp index 6e1d58abfc..ba8200bbfc 100644 --- a/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.cpp +++ b/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Mobica Limited +/* Copyright (c) 2024-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -75,7 +75,7 @@ bool DynamicPrimitiveClipping::prepare(const vkb::ApplicationOptions &options) return true; } -void DynamicPrimitiveClipping::request_gpu_features(vkb::PhysicalDevice &gpu) +void DynamicPrimitiveClipping::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // shaderClipDistance feature is required in order to gl_ClipDistance builtin shader variable to work. if (gpu.get_features().shaderClipDistance) @@ -88,14 +88,8 @@ void DynamicPrimitiveClipping::request_gpu_features(vkb::PhysicalDevice &gpu) } // Features required by vkCmdSetDepthClipEnableEXT(). - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDepthClipEnableFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, - depthClipEnable); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, - extendedDynamicState3DepthClipEnable); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDepthClipEnableFeaturesEXT, depthClipEnable); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT, extendedDynamicState3DepthClipEnable); } void DynamicPrimitiveClipping::build_command_buffers() @@ -303,8 +297,8 @@ void DynamicPrimitiveClipping::prepare_pipelines() // Load shaders. std::array shader_stages{}; - shader_stages[0] = load_shader("dynamic_primitive_clipping", "primitive_clipping.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_primitive_clipping", "primitive_clipping.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_primitive_clipping", "primitive_clipping.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_primitive_clipping", "primitive_clipping.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // We need to specify the pipeline layout and the render pass description up front as well. VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(pipeline_layouts.models, render_pass); diff --git a/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.h b/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.h index 4282943fda..84fc09e38b 100644 --- a/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.h +++ b/samples/extensions/dynamic_primitive_clipping/dynamic_primitive_clipping.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Mobica Limited +/* Copyright (c) 2024-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ class DynamicPrimitiveClipping : public ApiVulkanSample // Override basic framework functionality bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void render(float delta_time) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; diff --git a/samples/extensions/dynamic_rendering/CMakeLists.txt b/samples/extensions/dynamic_rendering/CMakeLists.txt index 189035ffac..5faa4e1d69 100644 --- a/samples/extensions/dynamic_rendering/CMakeLists.txt +++ b/samples/extensions/dynamic_rendering/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2024, Holochip Corporation +# Copyright (c) 2020-2025, Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample( "dynamic_rendering/glsl/gbuffer.frag" SHADER_FILES_HLSL "dynamic_rendering/hlsl/gbuffer.vert.hlsl" - "dynamic_rendering/hlsl/gbuffer.frag.hlsl") \ No newline at end of file + "dynamic_rendering/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_rendering/slang/gbuffer.vert.slang" + "dynamic_rendering/slang/gbuffer.frag.slang") \ No newline at end of file diff --git a/samples/extensions/dynamic_rendering/dynamic_rendering.cpp b/samples/extensions/dynamic_rendering/dynamic_rendering.cpp index 05b99b93d0..f955082369 100644 --- a/samples/extensions/dynamic_rendering/dynamic_rendering.cpp +++ b/samples/extensions/dynamic_rendering/dynamic_rendering.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024, Holochip Corporation + * Copyright (c) 2021-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -89,14 +89,11 @@ bool DynamicRendering::prepare(const vkb::ApplicationOptions &options) return true; } -void DynamicRendering::request_gpu_features(vkb::PhysicalDevice &gpu) +void DynamicRendering::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (enable_dynamic) { - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDynamicRenderingFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR, - dynamicRendering); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingFeaturesKHR, dynamicRendering); } if (gpu.get_features().samplerAnisotropy) @@ -253,8 +250,8 @@ void DynamicRendering::create_pipeline() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("dynamic_rendering", "gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_rendering", "gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_rendering", "gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_rendering", "gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Create graphics pipeline for dynamic rendering VkFormat color_rendering_format = get_render_context().get_format(); diff --git a/samples/extensions/dynamic_rendering/dynamic_rendering.h b/samples/extensions/dynamic_rendering/dynamic_rendering.h index b0a3421dfa..b84c2aeb92 100644 --- a/samples/extensions/dynamic_rendering/dynamic_rendering.h +++ b/samples/extensions/dynamic_rendering/dynamic_rendering.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024, Holochip Corporation + * Copyright (c) 2021-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -32,7 +32,7 @@ class DynamicRendering : public ApiVulkanSample void build_command_buffers() override; void view_changed() override; void on_update_ui_overlay(vkb::Drawer &drawer) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; private: void load_assets(); diff --git a/samples/extensions/dynamic_rendering_local_read/CMakeLists.txt b/samples/extensions/dynamic_rendering_local_read/CMakeLists.txt index f3f071f3eb..30449b8b25 100644 --- a/samples/extensions/dynamic_rendering_local_read/CMakeLists.txt +++ b/samples/extensions/dynamic_rendering_local_read/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Sascha Willems +# Copyright (c) 2024-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -26,9 +26,23 @@ add_sample( NAME "Dynamic Rendering local reads" DESCRIPTION "Demonstrates the dynamic rendering local read extension to use input attachments with dynamic rendering" SHADER_FILES_GLSL - "dynamic_rendering_local_read/composition.frag" - "dynamic_rendering_local_read/composition.vert" - "dynamic_rendering_local_read/scene_opaque.vert" - "dynamic_rendering_local_read/scene_opaque.frag" - "dynamic_rendering_local_read/scene_transparent.vert" - "dynamic_rendering_local_read/scene_transparent.frag") + "dynamic_rendering_local_read/glsl/composition.frag" + "dynamic_rendering_local_read/glsl/composition.vert" + "dynamic_rendering_local_read/glsl/scene_opaque.vert" + "dynamic_rendering_local_read/glsl/scene_opaque.frag" + "dynamic_rendering_local_read/glsl/scene_transparent.vert" + "dynamic_rendering_local_read/glsl/scene_transparent.frag" + SHADER_FILES_HLSL + "dynamic_rendering_local_read/hlsl/composition.frag.hlsl" + "dynamic_rendering_local_read/hlsl/composition.vert.hlsl" + "dynamic_rendering_local_read/hlsl/scene_opaque.vert.hlsl" + "dynamic_rendering_local_read/hlsl/scene_opaque.frag.hlsl" + "dynamic_rendering_local_read/hlsl/scene_transparent.vert.hlsl" + "dynamic_rendering_local_read/hlsl/scene_transparent.frag.hlsl" + SHADER_FILES_SLANG + "dynamic_rendering_local_read/slang/composition.frag.slang" + "dynamic_rendering_local_read/slang/composition.vert.slang" + "dynamic_rendering_local_read/slang/scene_opaque.vert.slang" + "dynamic_rendering_local_read/slang/scene_opaque.frag.slang" + "dynamic_rendering_local_read/slang/scene_transparent.vert.slang" + "dynamic_rendering_local_read/slang/scene_transparent.frag.slang") \ No newline at end of file diff --git a/samples/extensions/dynamic_rendering_local_read/README.adoc b/samples/extensions/dynamic_rendering_local_read/README.adoc index bc893fc461..0b135667e6 100644 --- a/samples/extensions/dynamic_rendering_local_read/README.adoc +++ b/samples/extensions/dynamic_rendering_local_read/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2024, Sascha Willems +- Copyright (c) 2024-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -111,11 +111,31 @@ With the `dynamicRenderingLocalReads` feature enabled, it's now possible to use . Draw transparent geometry with a forward pass reading depth from an attachment . End dynamic rendering with `vkCmdEndRenderingKHR` +== Understanding the location mapping with an example + +To help better grasp idea of location remapping, let's use the following simple fragment shader + +```glsl +layout(location=0) out vec4 A; +layout(location=1) out vec4 B; +layout(location=2) out vec4 C; +``` + +Now if we set our `VkRenderingAttachmentLocationInfo::pColorAttachment` to be `[1, 2, 0]` + +- Writes to `A` write to `VkRenderingInfo::pColorAttachments[2]` +- Writes to `B` write to `VkRenderingInfo::pColorAttachments[0]` +- Writes to `C` write to `VkRenderingInfo::pColorAttachments[1]` + +But if we set our `VkRenderingAttachmentLocationInfo::pColorAttachment` to be only `[1, 2]` + +Any writes to `A` will be discarded. + == Conclusion With the addition of `VK_KHR_dynamic_rendering_local_read` it's now finally possible to fully replace renderpasses, including those that have multiple subpasses. This makes dynamic rendering a fully fledged replacement for renderpasses on all implementations, including tile based architectures. == Additional information -* https://docs.vulkan.org/spec/latest/proposals/proposals/VK_KHR_dynamic_rendering_local_read.html[Extension proposal] -* https://www.khronos.org/blog/streamlining-subpasses[Extension blog post] \ No newline at end of file +* https://docs.vulkan.org/features/latest/features/proposals/VK_KHR_dynamic_rendering_local_read.html[Extension proposal] +* https://www.khronos.org/blog/streamlining-subpasses[Extension blog post] diff --git a/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.cpp b/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.cpp index d0fabcae91..d5f129bedb 100644 --- a/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.cpp +++ b/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -38,6 +38,13 @@ DynamicRenderingLocalRead::DynamicRenderingLocalRead() // To simplify barrier setup used for dynamic rendering, we use sync2 add_device_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); + // Slang shaders require additional extensions to be enabled + if (get_shading_language() == vkb::ShadingLanguage::SLANG) + { + add_device_extension(VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME); + add_device_extension(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME); + } + // Dynamic rendering doesn't use render passes // To make sure that framework related classes like the user interface are aware of this, we explicitly st the base class' renderpass to a null handle render_pass = VK_NULL_HANDLE; @@ -64,19 +71,19 @@ DynamicRenderingLocalRead::~DynamicRenderingLocalRead() } } -void DynamicRenderingLocalRead::request_gpu_features(vkb::PhysicalDevice &gpu) +void DynamicRenderingLocalRead::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().samplerAnisotropy) { gpu.get_mutable_requested_features().samplerAnisotropy = true; } #if defined(USE_DYNAMIC_RENDERING) - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR, dynamicRendering); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingFeaturesKHR, dynamicRendering); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR, dynamicRenderingLocalRead); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR, dynamicRenderingLocalRead); // To simplify barrier setup used for dynamic rendering, we use sync2 - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceSynchronization2FeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, synchronization2); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceSynchronization2FeaturesKHR, synchronization2); #endif } @@ -314,8 +321,8 @@ void DynamicRenderingLocalRead::prepare_gui() create_gui(*window, nullptr, 15.0f, true); get_gui().set_subpass(2); get_gui().prepare(pipeline_cache, render_pass, - {load_shader("uioverlay/uioverlay.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("uioverlay/uioverlay.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}); + {load_shader("uioverlay/uioverlay.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("uioverlay/uioverlay.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}); #endif } @@ -369,7 +376,7 @@ void DynamicRenderingLocalRead::create_attachment(VkFormat format, VkImageUsageF VK_CHECK(vkCreateImage(get_device().get_handle(), &image_ci, nullptr, &attachment.image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment.image, &memory_requirements); memory_ai.allocationSize = memory_requirements.size; - memory_ai.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_ai.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_ai, nullptr, &attachment.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment.image, attachment.memory, 0)); @@ -678,12 +685,14 @@ void DynamicRenderingLocalRead::prepare_pipelines() { pipeline_rendering_create_info.stencilAttachmentFormat = depth_format; } + + pipeline_rendering_create_info.pNext = &rendering_attachment_index_info; #else pipeline_create_info.subpass = 0; #endif - shader_stages[0] = load_shader("dynamic_rendering_local_read/scene_opaque.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_rendering_local_read/scene_opaque.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_rendering_local_read", "scene_opaque.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_rendering_local_read", "scene_opaque.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &scene_opaque_pass.pipeline)); /* @@ -721,8 +730,8 @@ void DynamicRenderingLocalRead::prepare_pipelines() pipeline_create_info.subpass = 2; #endif - shader_stages[0] = load_shader("dynamic_rendering_local_read/scene_transparent.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_rendering_local_read/scene_transparent.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_rendering_local_read", "scene_transparent.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_rendering_local_read", "scene_transparent.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &scene_transparent_pass.pipeline)); /* @@ -761,8 +770,8 @@ void DynamicRenderingLocalRead::prepare_pipelines() empty_vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; pipeline_create_info.pVertexInputState = &empty_vertex_input_state; - shader_stages[0] = load_shader("dynamic_rendering_local_read/composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("dynamic_rendering_local_read/composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("dynamic_rendering_local_read", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("dynamic_rendering_local_read", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &composition_pass.pipeline)); } @@ -834,7 +843,7 @@ void DynamicRenderingLocalRead::build_command_buffers() subresource_range_depth.levelCount = VK_REMAINING_MIP_LEVELS; subresource_range_depth.layerCount = VK_REMAINING_ARRAY_LAYERS; - vkb::image_layout_transition(cmd, swapchain_buffers[i].image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, subresource_range_color); + vkb::image_layout_transition(cmd, swapchain_buffers[i].image, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, subresource_range_color); vkb::image_layout_transition(cmd, depth_stencil.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, subresource_range_depth); VkRenderingAttachmentInfoKHR color_attachment_info[4]{}; @@ -863,11 +872,10 @@ void DynamicRenderingLocalRead::build_command_buffers() depth_attachment_info.clearValue = clear_values[1]; VkRenderingInfoKHR render_info = vkb::initializers::rendering_info(); - render_info.renderArea = {0, 0, width, height}; + render_info.renderArea = {0, 0, static_cast(attachment_width), static_cast(attachment_height)}; render_info.layerCount = 1; render_info.colorAttachmentCount = 4; render_info.pColorAttachments = &color_attachment_info[0]; - render_info.renderArea = {0, 0, width, height}; render_info.pDepthAttachment = &depth_attachment_info; if (!vkb::is_depth_only_format(depth_format)) @@ -886,6 +894,9 @@ void DynamicRenderingLocalRead::build_command_buffers() VkRect2D scissor = vkb::initializers::rect2D(width, height, 0, 0); vkCmdSetScissor(cmd, 0, 1, &scissor); + // Set input attachment indices for the composition and transparent passes + vkCmdSetRenderingInputAttachmentIndicesKHR(cmd, &rendering_attachment_index_info); + /* First draw Fills the G-Buffer attachments containing image data for the deferred composition (color+depth, normals, albedo) diff --git a/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.h b/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.h index 01ee36b44d..dd0b7a0235 100644 --- a/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.h +++ b/samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -32,7 +32,7 @@ class DynamicRenderingLocalRead : public ApiVulkanSample void build_command_buffers() override; void render(float delta_time) override; bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; private: @@ -98,6 +98,12 @@ class DynamicRenderingLocalRead : public ApiVulkanSample int32_t attachment_width{0}; int32_t attachment_height{0}; + std::array color_attachment_input_indices{VK_ATTACHMENT_UNUSED, 0, 1, 2}; + VkRenderingInputAttachmentIndexInfo rendering_attachment_index_info{VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, + nullptr, + static_cast(color_attachment_input_indices.size()), + color_attachment_input_indices.data()}; + void setup_framebuffer() override; void setup_render_pass() override; void prepare_gui() override; diff --git a/samples/extensions/extended_dynamic_state2/CMakeLists.txt b/samples/extensions/extended_dynamic_state2/CMakeLists.txt index 7c1e0c91eb..80ee60445b 100644 --- a/samples/extensions/extended_dynamic_state2/CMakeLists.txt +++ b/samples/extensions/extended_dynamic_state2/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -26,11 +26,20 @@ add_sample( NAME "Extended Dynamic State 2" DESCRIPTION "Demonstrate how to use depth bias, primitive restart, rasterizer discard and patch control points dynamically, which can reduce the number of pipeline objects that are need to be created." SHADER_FILES_GLSL - "extended_dynamic_state2/baseline.vert" - "extended_dynamic_state2/baseline.frag" - "extended_dynamic_state2/tess.vert" - "extended_dynamic_state2/tess.tese" - "extended_dynamic_state2/tess.tesc" - "extended_dynamic_state2/tess.frag" - "extended_dynamic_state2/background.vert" - "extended_dynamic_state2/background.frag") + "extended_dynamic_state2/glsl/baseline.vert" + "extended_dynamic_state2/glsl/baseline.frag" + "extended_dynamic_state2/glsl/tess.vert" + "extended_dynamic_state2/glsl/tess.tese" + "extended_dynamic_state2/glsl/tess.tesc" + "extended_dynamic_state2/glsl/tess.frag" + "extended_dynamic_state2/glsl/background.vert" + "extended_dynamic_state2/glsl/background.frag" + SHADER_FILES_SLANG + "extended_dynamic_state2/slang/baseline.vert.slang" + "extended_dynamic_state2/slang/baseline.frag.slang" + "extended_dynamic_state2/slang/tess.vert.slang" + "extended_dynamic_state2/slang/tess.tese.slang" + "extended_dynamic_state2/slang/tess.tesc.slang" + "extended_dynamic_state2/slang/tess.frag.slang" + "extended_dynamic_state2/slang/background.vert.slang" + "extended_dynamic_state2/slang/background.frag.slang") diff --git a/samples/extensions/extended_dynamic_state2/README.adoc b/samples/extensions/extended_dynamic_state2/README.adoc index 9843e5a6bb..143afaee13 100644 --- a/samples/extensions/extended_dynamic_state2/README.adoc +++ b/samples/extensions/extended_dynamic_state2/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -260,7 +260,7 @@ void ExtendedDynamicState2::draw_from_scene(VkCommandBuffer command_buffer, std: == Enabling the Extension The extended dynamic state 2 api requires Vulkan 1.0 and the appropriate headers / SDK is required. -This extension has been https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html#_promotion_to_vulkan_1_3[partially] promoted to Vulkan 1.3. +This extension has been https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html#_promotion_to_vulkan_1_3[partially] promoted to Vulkan 1.3. The device extension is provided by `VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME`. It also requires `VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME` instance extension to be enabled. @@ -271,6 +271,6 @@ add_instance_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); add_device_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); ---- -If the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceExtendedDynamicState2FeaturesEXT.html[`VkPhysicalDeviceExtendedDynamicState2FeaturesEXT`] structure is included in the pNext chain of the `VkPhysicalDeviceFeatures2` structure passed to vkGetPhysicalDeviceFeatures2, it is filled in to indicate whether each corresponding feature is supported. +If the https://registry.khronos.org/vulkan/specs/latest/man/html/VkPhysicalDeviceExtendedDynamicState2FeaturesEXT.html[`VkPhysicalDeviceExtendedDynamicState2FeaturesEXT`] structure is included in the pNext chain of the `VkPhysicalDeviceFeatures2` structure passed to vkGetPhysicalDeviceFeatures2, it is filled in to indicate whether each corresponding feature is supported. `VkPhysicalDeviceExtendedDynamicState2FeaturesEXT` can also be used in the pNext chain of `VkDeviceCreateInfo` to selectively enable these features. o selectively enable these features. diff --git a/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.cpp b/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.cpp index 9167be20d4..4bf4399b03 100644 --- a/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.cpp +++ b/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -95,9 +95,9 @@ void ExtendedDynamicState2::load_assets() { load_scene("scenes/primitives/primitives.gltf"); - std::vector scene_elements; - std::vector node_scene_list = {&(get_scene().get_root_node())}; - vkb::sg::Node *node = nullptr; + std::vector scene_elements; + std::vector node_scene_list = {&(get_scene().get_root_node())}; + vkb::scene_graph::NodeC *node = nullptr; for (size_t list_it = 0; node_scene_list.size() > list_it; ++list_it) { @@ -170,18 +170,12 @@ void ExtendedDynamicState2::render(float delta_time) */ void ExtendedDynamicState2::prepare_uniform_buffers() { - uniform_buffers.common = std::make_unique(get_device(), - sizeof(ubo_common), - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); - uniform_buffers.baseline = std::make_unique(get_device(), - sizeof(ubo_baseline), - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); - uniform_buffers.tesselation = std::make_unique(get_device(), - sizeof(ubo_tess), - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); + uniform_buffers.common = + std::make_unique(get_device(), sizeof(ubo_common), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + uniform_buffers.baseline = + std::make_unique(get_device(), sizeof(ubo_baseline), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + uniform_buffers.tesselation = + std::make_unique(get_device(), sizeof(ubo_tess), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); update_uniform_buffers(); } @@ -302,8 +296,8 @@ void ExtendedDynamicState2::create_pipelines() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("extended_dynamic_state2/baseline.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("extended_dynamic_state2/baseline.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("extended_dynamic_state2", "baseline.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("extended_dynamic_state2", "baseline.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); /* Use the pNext to point to the rendering create struct */ VkGraphicsPipelineCreateInfo graphics_create{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; @@ -366,8 +360,8 @@ void ExtendedDynamicState2::create_pipelines() rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - shader_stages[0] = load_shader("extended_dynamic_state2/background.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("extended_dynamic_state2/background.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("extended_dynamic_state2", "background.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("extended_dynamic_state2", "background.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, @@ -396,14 +390,10 @@ void ExtendedDynamicState2::create_pipelines() rasterization_state.polygonMode = VK_POLYGON_MODE_LINE; } - shader_stages[0] = load_shader("extended_dynamic_state2/tess.vert", - VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("extended_dynamic_state2/tess.frag", - VK_SHADER_STAGE_FRAGMENT_BIT); - shader_stages[2] = load_shader("extended_dynamic_state2/tess.tesc", - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); - shader_stages[3] = load_shader("extended_dynamic_state2/tess.tese", - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); + shader_stages[0] = load_shader("extended_dynamic_state2", "tess.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("extended_dynamic_state2", "tess.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[2] = load_shader("extended_dynamic_state2", "tess.tesc.spv", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); + shader_stages[3] = load_shader("extended_dynamic_state2", "tess.tese.spv", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); graphics_create.stageCount = static_cast(shader_stages.size()); graphics_create.pStages = shader_stages.data(); /* Enable depth test and write */ @@ -511,6 +501,7 @@ void ExtendedDynamicState2::build_command_buffers() /* Change topology to patch list and setting patch control points value */ vkCmdSetPrimitiveTopologyEXT(draw_cmd_buffer, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST); + vkCmdSetPrimitiveRestartEnableEXT(draw_cmd_buffer, VK_FALSE); vkCmdSetPatchControlPointsEXT(draw_cmd_buffer, patch_control_points_triangle); /* Drawing scene with objects using tessellation feature */ @@ -732,27 +723,19 @@ void ExtendedDynamicState2::create_descriptor_sets() } /** - * @fn void ExtendedDynamicState2::request_gpu_features(vkb::PhysicalDevice &gpu) + * @fn void ExtendedDynamicState2::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) * @brief Enabling features related to Vulkan extensions */ -void ExtendedDynamicState2::request_gpu_features(vkb::PhysicalDevice &gpu) +void ExtendedDynamicState2::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { /* Enable extension features required by this sample These are passed to device creation via a pNext structure chain */ - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, extendedDynamicState2); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, - extendedDynamicState2PatchControlPoints); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2PatchControlPoints); - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, extendedDynamicState); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, extendedDynamicState); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, - primitiveTopologyListRestart); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, primitiveTopologyListRestart); // Tessellation shader support is required for this example auto &requested_features = gpu.get_mutable_requested_features(); @@ -1079,12 +1062,9 @@ void ExtendedDynamicState2::cube_animation(float delta_time) constexpr float move_step = 0.0005f; static float time_pass = 0.0f; time_pass += delta_time; - static auto &transform = std::find_if(scene_elements_baseline.begin(), - scene_elements_baseline.end(), - [](SceneNode const &scene_node) { - return scene_node.node->get_name() == "Cube_1"; - }) - ->node->get_transform(); + static auto &transform = + std::ranges::find_if(scene_elements_baseline, [](SceneNode const &scene_node) { return scene_node.node->get_name() == "Cube_1"; }) + ->node->get_transform(); static auto translation = transform.get_translation(); static float difference = 0.0f; static bool rising = true; diff --git a/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.h b/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.h index 12c36a655b..83296f97c4 100644 --- a/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.h +++ b/samples/extensions/extended_dynamic_state2/extended_dynamic_state2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -113,9 +113,9 @@ class ExtendedDynamicState2 : public ApiVulkanSample struct SceneNode { - std::string name; - vkb::sg::Node *node; - vkb::sg::SubMesh *sub_mesh; + std::string name; + vkb::scene_graph::NodeC *node; + vkb::sg::SubMesh *sub_mesh; }; std::vector scene_elements_baseline; std::vector scene_elements_tess; @@ -136,7 +136,7 @@ class ExtendedDynamicState2 : public ApiVulkanSample void render(float delta_time) override; void build_command_buffers() override; bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; void update(float delta_time) override; diff --git a/samples/extensions/fragment_density_map/CMakeLists.txt b/samples/extensions/fragment_density_map/CMakeLists.txt new file mode 100644 index 0000000000..0a6161e334 --- /dev/null +++ b/samples/extensions/fragment_density_map/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright (c) 2025, Arm Limited and Contributors +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 the "License"; +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) +get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) +get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) + + add_sample( + ID ${FOLDER_NAME} + CATEGORY ${CATEGORY_NAME} + AUTHOR "Arm" + NAME "Fragment Density Map" + DESCRIPTION "Demonstration of how to use VK_EXT_fragment_density_map" + SHADER_FILES_GLSL + "fragment_density_map/forward.frag" + "fragment_density_map/forward.vert" + "fragment_density_map/forward_debug.frag" + "fragment_density_map/generate_density_map.comp" + "fragment_density_map/generate_density_map.frag" + "fragment_density_map/quad_uv.vert" + "fragment_density_map/quad_uvw.vert" + "fragment_density_map/sky.frag" + "fragment_density_map/sky_debug.frag" + "fragment_density_map/texture.frag") diff --git a/samples/extensions/fragment_density_map/README.adoc b/samples/extensions/fragment_density_map/README.adoc new file mode 100644 index 0000000000..ce07c5759f --- /dev/null +++ b/samples/extensions/fragment_density_map/README.adoc @@ -0,0 +1,194 @@ +//// +- Copyright (c) 2025 Arm Limited and Contributors +- +- SPDX-License-Identifier: Apache-2.0 +- +- Licensed under the Apache License, Version 2.0 the "License"; +- you may not use this file except in compliance with the License. +- You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +- Unless required by applicable law or agreed to in writing, software +- distributed under the License is distributed on an "AS IS" BASIS, +- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +- See the License for the specific language governing permissions and +- limitations under the License. +- +//// + += Fragment Density Map + +ifdef::site-gen-antora[] +TIP: The source for this sample can be found in the https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/extensions/fragment_density_map[Khronos Vulkan Samples GitHub repository]. +endif::[] + +== Overview + +This sample demonstrates the `VK_EXT_fragment_density_map` extension. The extension allows different regions of a render target to be shaded at different rates, broadcasting a single fragment invocation to multiple texels and then compositing the results for presentation. Control is provided through a dedicated attachment in the render pass that defines the approximate shading density of regions of the target image. + +=== Potential uses of Fragment Density Map + +By lowering the shading rate in parts of the image that are less important perceptually, applications can reclaim performance. A common use case is foveated rendering in Virtual Reality (VR): with eye tracking, you render the gaze region at full resolution and peripheral regions at lower resolution. When done correctly (with sufficiently low latency), this can significantly reduce fragment invocations without perceptually sacrificing image quality. + +NOTE: VR is not a requirement for fragment density map, but foveated rendering in VR is its main use case. + +== Enabling Fragment Density Map +=== Enabling extensions + +The key extension used in this sample is `VK_EXT_fragment_density_map`, along with its dependencies `VK_KHR_create_renderpass2` and `VK_KHR_get_physical_device_properties2`. While `VK_EXT_fragment_density_map2` exists and can reduce host-to-device latency, it is not used in this sample. + +Developers who want to use `VK_EXT_fragment_density_map` should also consider reviewing xref:samples/extensions/fragment_shading_rate/README.adoc[Fragment Shading Rate] (`VK_KHR_fragment_shading_rate`). The KHR extension offers applications more precise control over the shading rate and provides additional options to developers, allowing them to select a rate per draw call, per primitive, or similar to `VK_EXT_fragment_density_map`—per region of the framebuffer. + +=== Feature description + +[,C++] +---- +VkPhysicalDeviceFragmentDensityMapFeaturesEXT fdm_features{ + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT +}; + +fdm_features.fragmentDensityMap = VK_TRUE; +fdm_features.fragmentDensityMapDynamic = VK_TRUE; +fdm_features.fragmentDensityMapNonSubsampledImages = VK_FALSE; +---- + +Fragment density map exposes optional features that must be enabled at device creation via `vkGetPhysicalDeviceFeatures2` (or `vkGetPhysicalDeviceFeatures2KHR`). + +* `fragmentDensityMap` should always be enabled; without it the extension has no effect. +* `fragmentDensityMapDynamic` reduces latency between command-buffer recording and draw execution by removing the requirement that the density map be ready at record time. This is not supported on all devices. On devices that do not support it, `VK_EXT_fragment_density_map2` can help reduce latency. +* `fragmentDensityMapNonSubsampledImages` (not universally supported) allows render passes to use non-subsampled attachments, potentially enabling direct rendering to the swapchain. + +=== Density map image + +The density map must: + +* Use a format with support for `VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT` (for example, `VK_FORMAT_R8G8_UNORM`). +* Store values in the range `(0.0, 1.0]`, where `1.0` represents full density on the respective X/Y axis. Specific fragment sizes are implementation-defined. +* Use image layout `VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT` whenever it is ready for use. +* Be created with usage flag `VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT`. + +CAUTION: Some devices report fragment density map support only for the trivial density `(1,1)`, which is the default shading rate for conventional rasterization. + +The density map image extent must be a factor of the render-target extent. Query `VkPhysicalDeviceFragmentDensityMapPropertiesEXT` via `vkGetPhysicalDeviceProperties2` to determine supported factors. The fields `minFragmentDensityTexelSize` and `maxFragmentDensityTexelSize` define how many render-target texels each fragment density map texel can influence. A simple approach is to divide the render-target extent by `maxFragmentDensityTexelSize` (rounding up) to compute the density-map extent. + +If `fragmentDensityMapDynamic` is used, create the image view with the `VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT` flag. + +NOTE: When using fragment density map without `fragmentDensityMapNonSubsampledImages`, all images used within the affected render pass must be created with `VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT`. + +=== Read time of the density map + +The density map is read at different times depending on the `fragmentDensityMapDynamic` setting and the `VK_EXT_fragment_density_map2` configuration: + +- If `fragmentDensityMapDynamic = false`, the density map must be available at command-buffer record time but the map cannot be modified after calling `vkCmdBeginRenderPass(...)` The map is still used after submision, which can introduce noticeable lag between density-map updates and the displayed frame. +- If `fragmentDensityMapDynamic = true`, the density map is read during `VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT`, eliminating the need to produce the map before recording the command buffer. This yields the lowest latency but requires driver support. ++- `VK_EXT_fragment_density_map2` improves performance on devices without `fragmentDensityMapDynamic` by allowing modifications to the density map between `vkCmdBeginRenderPass(...)` and `vkEndCommandBuffer(...)`. See https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_fragment_density_map2.html[VK_EXT_fragment_density_map2] for more details. + +=== Render pass setup + +Fragment density map operates at the render-pass level. Provide a `VkRenderPassFragmentDensityMapCreateInfoEXT` in the `pNext` chain of `VkRenderPassCreateInfo`. This structure specifies the attachment and its layout. Regardless of subpass count, it is recommended to add a subpass dependency with `.srcSubpass = VK_SUBPASS_EXTERNAL` and `.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT` to ensure the density map is ready before use. You may omit this if readiness is otherwise guaranteed (e.g., a static density map created at startup). + +Fragment density map requires a specific attachment configuration: + +[,C++] +---- +VkAttachmentDescription2KHR fdm_attachment{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, + .format = VK_FORMAT_R8G8_UNORM, + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, + .finalLayout = VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, + // ... +}; +---- + +Unless `fragmentDensityMapNonSubsampledImages` is enabled, fragment density map render passes cannot render directly to a swapchain image because the result is subsampled/sparse. Use an intermediate pass to sample the subsampled color and write to the swapchain. This pass requires a specific sampler configuration (see below). It is also recommended to render the UI and perform other composition at full resolution in this pass. + +IMPORTANT: If `fragmentDensityMapNonSubsampledImages` is enabled, fragment density map render passes may render directly to the swapchain image. However, if your application does additional composition (e.g., UI), an intermediate pass is still recommended. + +TIP: The intermediate pass typically also draws/composites the UI at full surface resolution. + +Below is a simple pipeline arrangement used on this sample. + +1. The density map is computed once outside the render loop and reused each frame. This is done in a separate command-buffer, all the other commands will go to the same command buffer. The sample also includes a UI option to update the fragment density map attachment every frame using `fragmentDensityMapDynamic`. If this option is selected, an additional pass at the beginning of the main command-buffer produces the fragment density map attachment. + +2. The sample renders a simple scene using forward rendering. The main pass uses the fragment density map as an attachment. Typically, this pass is rendered at a lower resolution, but in our sample it is rendered at a higher resolution to make the performance difference more noticeable. + +3. A final pass samples the main pass and renders the UI. Note that this present/composition pass is rendered at full resolution. + +NOTE: To make the performance benefit of fragment density map more noticeable, we render the main pass at an increased resolution. + +To help visualize and better understand the extension, the sample provides the following options: + +- *Enable FDM:* Enables or disables the fragment density map. This option can be used to evaluate the performance benefits of the extension. +- *Update FDM each frame:* Uses `fragmentDensityMapDynamic` to update the fragment density map every frame. +- *Generate FDM with compute:* If enabled, the fragment density map is generated using a compute shader; otherwise, it is generated using a fragment shader. +- *Show FDM:* Displays the image used as the fragment density map attachment. +- *Debug FDM:* Uses `gl_FragSizeEXT` to display the fragment size used when rendering the image. +- *Show stats:* Displays a graph with useful statistics such as frame time and GPU activity. + +To help visualize the current fragment size, the sample has an option to draw the selected fragment size. This is done using different shaders that employ `gl_FragSizeEXT` and `GL_EXT_fragment_invocation_density`. + +These images show the configured density map and the resulting image. Actual results may differ from expectations. Implementations may clamp the requested fragment area to a supported one. The clamped area must be less than or equal in size to the requested area, and the supported set may vary across framebuffer regions. + +NOTE: Implementations may choose areas with lower size in one dimension. For example, if the requested fragment area is `(1,4)`, an implementation may clamp to `(2,2)` because it has the same area. The selected density must be higher, but this allows an implementation to render a dimension at a lower resolution. + +NOTE: Implementations may fetch additional density map texels around a window, selecting a fragment size for an entire region. This might result in different results than one would expect. For example, link:fdm_comparison.png[this image, window=_blank] shows how the same fragment density map sample is interpreted by two GPUs. + +This first image shows the fragment density map attachment specified in the sample: + +image::fdm_show.png[Density Map Attachment] + +This second image shows the result on a Mali G715 GPU: + +image::fdm_g715.png[Density Map Final Result on Mali G715] + +As observed, the attachment is composited of a series of inner circles of different values: + +* The innermost circle has a density of `(1.0, 1.0)`, corresponding to `1×1`. +* The second circle has densities of `(1.0, 0.5)` and `(0.5, 1.0)`. This corresponds to desired sizes of `1×2` and `2×1`, but the current implementation selects a higher density (smaller fragment size) of `1×1`. +* The third circle has a density of `(0.5, 0.5)`, corresponding to `2×2`. +* The fourth circle has densities of `(0.5, 0.25)` and `(0.25, 0.5)`, corresponding to `2×4` and `4×2`. The implementation is selecting a higher density of `2×2`. +* The periphery has a density of `(0.25, 0.25)`, corresponding to a fragment size of `4×4`. + +This attachment emulates foveated rendering: the gaze-centered region (eye center) is in focus and rendered at higher resolution, while the periphery is out of focus and rendered with less detail. + +=== Sampler + +Images that interact with fragment density map must be sampled with a specially configured sampler: + +[,C++] +---- +VkSamplerCreateInfo sampler_create_info{ + .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, + .pNext = nullptr, + .flags = VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, + .minFilter = VK_FILTER_NEAREST, + .magFilter = VK_FILTER_NEAREST, + .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, + .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .mipLodBias = 0.0f, + .anisotropyEnable = VK_FALSE, + .maxAnisotropy = 0.0f, + .compareEnable = VK_FALSE, + .compareOp = VK_COMPARE_OP_ALWAYS, + .unnormalizedCoordinates = VK_FALSE, + // ... +}; +---- + +The most important fields are `.flags`, `.minFilter`, `.magFilter`, and `.mipmapMode`. The sampler used to read subsampled images must match these settings exactly. Use this sampler for any image influenced by fragment density map. + +== Conclusion + +//// +This is necessary to have the sample show up on the build for the docs site under https://docs.vulkan.org +//// + +`VK_EXT_fragment_density_map` is particularly effective with VR and `VK_KHR_multiview`, enabling techniques like foveated rendering that reduce peripheral shading work while preserving perceived quality. + +However, we suggest that developers also consider xref:samples/extensions/fragment_shading_rate/README.adoc[Fragment Shading Rate] (`VK_KHR_fragment_shading_rate`), which generally offers broader device support, simpler setup, more options, and greater control when specifying where lower shading rates apply. diff --git a/samples/extensions/fragment_density_map/fdm_comparison.png b/samples/extensions/fragment_density_map/fdm_comparison.png new file mode 100644 index 0000000000..0a0304a434 Binary files /dev/null and b/samples/extensions/fragment_density_map/fdm_comparison.png differ diff --git a/samples/extensions/fragment_density_map/fdm_g715.png b/samples/extensions/fragment_density_map/fdm_g715.png new file mode 100644 index 0000000000..b6fd67ae61 Binary files /dev/null and b/samples/extensions/fragment_density_map/fdm_g715.png differ diff --git a/samples/extensions/fragment_density_map/fdm_sample.png b/samples/extensions/fragment_density_map/fdm_sample.png new file mode 100644 index 0000000000..8969b62a74 Binary files /dev/null and b/samples/extensions/fragment_density_map/fdm_sample.png differ diff --git a/samples/extensions/fragment_density_map/fdm_show.png b/samples/extensions/fragment_density_map/fdm_show.png new file mode 100644 index 0000000000..a63aee04e3 Binary files /dev/null and b/samples/extensions/fragment_density_map/fdm_show.png differ diff --git a/samples/extensions/fragment_density_map/fragment_density_map.cpp b/samples/extensions/fragment_density_map/fragment_density_map.cpp new file mode 100644 index 0000000000..a3cc019827 --- /dev/null +++ b/samples/extensions/fragment_density_map/fragment_density_map.cpp @@ -0,0 +1,1791 @@ +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "fragment_density_map.h" +#include "api_vulkan_sample.h" +#include +#include + +template +static uint64_t get_object_handle(THandle object) +{ + using UintHandle = typename std::conditional::type; + return static_cast(reinterpret_cast(object)); +} + +void FragmentDensityMap::destroy_image(ApiVulkanSample::ImageData &image_data) +{ + VkDevice device_handle = get_device().get_handle(); + vkDestroyImageView(device_handle, image_data.view, nullptr); + vkDestroyImage(device_handle, image_data.image, nullptr); + vkFreeMemory(device_handle, image_data.mem, nullptr); + image_data.view = VK_NULL_HANDLE; + image_data.image = VK_NULL_HANDLE; + image_data.mem = VK_NULL_HANDLE; +} + +void FragmentDensityMap::destroy_pipeline(FragmentDensityMap::PipelineData &pipeline_data) +{ + VkDevice device_handle = get_device().get_handle(); + vkDestroyPipeline(device_handle, pipeline_data.pipeline, nullptr); + vkDestroyPipelineLayout(device_handle, pipeline_data.pipeline_layout, nullptr); + vkDestroyDescriptorSetLayout(device_handle, pipeline_data.set_layout, nullptr); + pipeline_data.pipeline = VK_NULL_HANDLE; + pipeline_data.pipeline_layout = VK_NULL_HANDLE; + pipeline_data.set_layout = VK_NULL_HANDLE; +} + +FragmentDensityMap::FragmentDensityMap() +{ + title = "Fragment Density Map"; + add_instance_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + add_device_extension(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME); + add_device_extension(VK_KHR_MAINTENANCE2_EXTENSION_NAME); + add_device_extension(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME); +} + +FragmentDensityMap::~FragmentDensityMap() +{ + if (has_device()) + { + VkDevice device_handle = get_device().get_handle(); + vkDestroyDescriptorPool(device_handle, main_pass.descriptor_pool, nullptr); + + destroy_pipeline(present.pipeline); + destroy_pipeline(main_pass.sky_pipeline); + destroy_pipeline(main_pass.meshes.pipeline); + destroy_pipeline(fdm.generate.pipeline); + + vkDestroyRenderPass(device_handle, present.render_pass, nullptr); + vkDestroyRenderPass(device_handle, fdm.generate.render_pass, nullptr); + + destroy_image(main_pass.image); + destroy_image(fdm.image); + + vkDestroySampler(device_handle, samplers.nearest, nullptr); + vkDestroySampler(device_handle, samplers.subsampled_nearest, nullptr); + + vkDestroyFramebuffer(device_handle, main_pass.framebuffer, nullptr); + vkDestroyFramebuffer(device_handle, fdm.generate.framebuffer, nullptr); + } +} + +bool FragmentDensityMap::prepare(const vkb::ApplicationOptions &options) +{ + if (!ApiVulkanSample::prepare(options)) + { + return false; + } + + last_options = current_options; + + setup_samplers(); + load_assets(); + + setup_descriptor_pool_main_pass(); + prepare_uniform_buffers_main_pass(); + setup_descriptor_set_layout_main_pass(); + setup_descriptor_set_main_pass(); + + reset_fdm_gpu_data(); + + prepared = true; + return true; +} + +void FragmentDensityMap::setup_samplers() +{ + // Samplers are not affected by configuration settings. + // They are created once and reused across all configurations. + assert(samplers.subsampled_nearest == VK_NULL_HANDLE); + assert(samplers.nearest == VK_NULL_HANDLE); + + // The sample needs to create a sampler using the subsampled flag to interact with the FDM attachments. + VkSamplerCreateInfo sampler_create_info{ + .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, + .pNext = nullptr, + .flags = 0u, + .magFilter = VK_FILTER_NEAREST, + .minFilter = VK_FILTER_NEAREST, + .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, + .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .mipLodBias = 0.0f, + .anisotropyEnable = VK_FALSE, + .compareEnable = VK_FALSE, + .minLod = 0.0f, + .maxLod = 0.0f, + .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + .unnormalizedCoordinates = VK_FALSE, + }; + + VK_CHECK(vkCreateSampler(get_device().get_handle(), &sampler_create_info, nullptr, &samplers.nearest)); + + if (is_fdm_supported()) + { + sampler_create_info.flags = VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT; + VK_CHECK(vkCreateSampler(get_device().get_handle(), &sampler_create_info, nullptr, &samplers.subsampled_nearest)); + } +} + +void FragmentDensityMap::prepare_pipelines() +{ + VkPipelineInputAssemblyStateCreateInfo input_assembly_state = + vkb::initializers::pipeline_input_assembly_state_create_info( + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + 0, + VK_FALSE); + + VkPipelineRasterizationStateCreateInfo rasterization_state = + vkb::initializers::pipeline_rasterization_state_create_info( + VK_POLYGON_MODE_FILL, + VK_CULL_MODE_BACK_BIT, + VK_FRONT_FACE_CLOCKWISE, + 0); + + VkPipelineColorBlendAttachmentState blend_attachment_state = + vkb::initializers::pipeline_color_blend_attachment_state( + VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, + VK_FALSE); + + VkPipelineColorBlendStateCreateInfo color_blend_state = + vkb::initializers::pipeline_color_blend_state_create_info( + 1, + &blend_attachment_state); + + // Note: A reversed depth buffer is used for increased precision, so larger depth values are retained. + VkPipelineDepthStencilStateCreateInfo depth_stencil_state = + vkb::initializers::pipeline_depth_stencil_state_create_info( + VK_TRUE, + VK_TRUE, + VK_COMPARE_OP_GREATER); + + VkPipelineViewportStateCreateInfo viewport_state = + vkb::initializers::pipeline_viewport_state_create_info(1, 1, 0); + + VkPipelineMultisampleStateCreateInfo multisample_state = + vkb::initializers::pipeline_multisample_state_create_info( + VK_SAMPLE_COUNT_1_BIT, + 0); + + // Specify that these states will be dynamic, i.e. not part of the pipeline state object. + std::array dynamic_state_enables{ + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR}; + + VkPipelineDynamicStateCreateInfo dynamic_state = + vkb::initializers::pipeline_dynamic_state_create_info( + dynamic_state_enables.data(), + vkb::to_u32(dynamic_state_enables.size()), + 0); + + VkDevice device_handle = get_device().get_handle(); + // Load our SPIR-V shaders. + std::array shader_stages{}; + + VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); + + VkGraphicsPipelineCreateInfo pipeline_create_info = + vkb::initializers::pipeline_create_info( + main_pass.meshes.pipeline.pipeline_layout, + render_pass, + 0); + + pipeline_create_info.pInputAssemblyState = &input_assembly_state; + pipeline_create_info.pRasterizationState = &rasterization_state; + pipeline_create_info.pColorBlendState = &color_blend_state; + pipeline_create_info.pMultisampleState = &multisample_state; + pipeline_create_info.pViewportState = &viewport_state; + pipeline_create_info.pDepthStencilState = &depth_stencil_state; + pipeline_create_info.pDynamicState = &dynamic_state; + pipeline_create_info.stageCount = vkb::to_u32(shader_stages.size()); + pipeline_create_info.pStages = shader_stages.data(); + pipeline_create_info.pVertexInputState = &vertex_input_state; + + // Generic forward render pipeline for the glTF-submeshes. + { + std::array binding_descriptions = { + // Binding point 0: Mesh vertex layout description at per-vertex rate. + vkb::initializers::vertex_input_binding_description(0, 3 * sizeof(float), VK_VERTEX_INPUT_RATE_VERTEX), + vkb::initializers::vertex_input_binding_description(1, 3 * sizeof(float), VK_VERTEX_INPUT_RATE_VERTEX), + vkb::initializers::vertex_input_binding_description(2, 2 * sizeof(float), VK_VERTEX_INPUT_RATE_VERTEX)}; + + std::array attribute_descriptions = { + vkb::initializers::vertex_input_attribute_description(0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0), // Location 0: Position. + vkb::initializers::vertex_input_attribute_description(1, 1, VK_FORMAT_R32G32B32_SFLOAT, 0), // Location 1: Normal. + vkb::initializers::vertex_input_attribute_description(2, 2, VK_FORMAT_R32G32_SFLOAT, 0), // Location 2: Texture coordinates. + }; + vertex_input_state.pVertexBindingDescriptions = binding_descriptions.data(); + vertex_input_state.pVertexAttributeDescriptions = attribute_descriptions.data(); + vertex_input_state.vertexBindingDescriptionCount = binding_descriptions.size(); + vertex_input_state.vertexAttributeDescriptionCount = attribute_descriptions.size(); + + shader_stages[0] = load_shader("fragment_density_map/forward.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader( + is_debug_fdm_enabled() ? "fragment_density_map/forward_debug.frag.spv" : "fragment_density_map/forward.frag.spv", + VK_SHADER_STAGE_FRAGMENT_BIT); + + pipeline_create_info.layout = main_pass.meshes.pipeline.pipeline_layout; + pipeline_create_info.renderPass = render_pass; + vkDestroyPipeline(device_handle, main_pass.meshes.pipeline.pipeline, nullptr); + VK_CHECK(vkCreateGraphicsPipelines(device_handle, pipeline_cache, 1, &pipeline_create_info, nullptr, &main_pass.meshes.pipeline.pipeline)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE, get_object_handle(main_pass.meshes.pipeline.pipeline), "Submeshes Pipeline"); + } + + VkPipelineShaderStageCreateInfo quad_uvw_shader_stage = load_shader("fragment_density_map/quad_uvw.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + VkPipelineShaderStageCreateInfo quad_uv_shader_stage = load_shader("fragment_density_map/quad_uv.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + + // Sky pipeline. + { + pipeline_create_info.renderPass = render_pass; + pipeline_create_info.layout = main_pass.sky_pipeline.pipeline_layout; + rasterization_state.cullMode = VK_CULL_MODE_NONE; + depth_stencil_state.depthWriteEnable = VK_FALSE; + depth_stencil_state.depthTestEnable = VK_FALSE; + shader_stages[0] = quad_uvw_shader_stage; + shader_stages[1] = load_shader( + is_debug_fdm_enabled() ? "fragment_density_map/sky_debug.frag.spv" : "fragment_density_map/sky.frag.spv", + VK_SHADER_STAGE_FRAGMENT_BIT); + + // The vertex shader generates a full-screen quad procedurally. + // No vertex buffers are required because the vertex positions are computed in the shader itself. + vertex_input_state.vertexBindingDescriptionCount = 0; + vertex_input_state.vertexAttributeDescriptionCount = 0; + vertex_input_state.pVertexBindingDescriptions = nullptr; + vertex_input_state.pVertexAttributeDescriptions = nullptr; + + vkDestroyPipeline(device_handle, main_pass.sky_pipeline.pipeline, nullptr); + VK_CHECK(vkCreateGraphicsPipelines(device_handle, pipeline_cache, 1, &pipeline_create_info, nullptr, &main_pass.sky_pipeline.pipeline)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE, get_object_handle(main_pass.sky_pipeline.pipeline), "Starfield Sky Pipeline"); + } + + // Present and UI pipeline. + { + // Vertex stage of the pipeline. + shader_stages[0] = quad_uv_shader_stage; + shader_stages[1] = load_shader("fragment_density_map/texture.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + + depth_stencil_state.depthWriteEnable = VK_FALSE; + depth_stencil_state.depthTestEnable = VK_FALSE; + rasterization_state.cullMode = VK_CULL_MODE_NONE; + + pipeline_create_info.layout = present.pipeline.pipeline_layout; + pipeline_create_info.renderPass = present.render_pass; + + vkDestroyPipeline(device_handle, present.pipeline.pipeline, nullptr); + VK_CHECK(vkCreateGraphicsPipelines(device_handle, pipeline_cache, 1, &pipeline_create_info, nullptr, &present.pipeline.pipeline)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE, get_object_handle(present.pipeline.pipeline), "Present Pipeline"); + } + + // Generate FDM. + { + vkDestroyPipeline(device_handle, fdm.generate.pipeline.pipeline, nullptr); + if (is_generate_fdm_compute()) + { + // Generate FDM (compute). + + const VkPipelineShaderStageCreateInfo fdm_comp = load_shader("fragment_density_map/generate_density_map.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + VkComputePipelineCreateInfo pipeline_create_info{ + .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, + .stage = fdm_comp, + .layout = fdm.generate.pipeline.pipeline_layout, + }; + VK_CHECK(vkCreateComputePipelines(device_handle, VK_NULL_HANDLE, 1, &pipeline_create_info, nullptr, &fdm.generate.pipeline.pipeline)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE, get_object_handle(fdm.generate.pipeline.pipeline), "Generate FDM Pipeline (compute)"); + } + else + { + // Generate FDM (fragment). + + pipeline_create_info.layout = fdm.generate.pipeline.pipeline_layout; + + pipeline_create_info.renderPass = fdm.generate.render_pass; + rasterization_state.cullMode = VK_CULL_MODE_NONE; + depth_stencil_state.depthWriteEnable = VK_FALSE; + depth_stencil_state.depthTestEnable = VK_FALSE; + shader_stages[0] = quad_uv_shader_stage; + shader_stages[1] = load_shader("fragment_density_map/generate_density_map.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + + VK_CHECK(vkCreateGraphicsPipelines(device_handle, pipeline_cache, 1, &pipeline_create_info, nullptr, &fdm.generate.pipeline.pipeline)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE, get_object_handle(fdm.generate.pipeline.pipeline), "Generate FDM Pipeline (fragment)"); + } + } +} + +void FragmentDensityMap::build_command_buffers() +{ + VkCommandBufferBeginInfo command_buffer_begin_info = vkb::initializers::command_buffer_begin_info(); + + std::array clear_values{ + VkClearValue{.color = {{0.0f, 0.0f, 0.0f, 0.0f}}}, // Color output. + VkClearValue{.depthStencil = {0.0f, 0}}, // Depth stencil output. + VkClearValue{.color = {{0.0f, 0.0f, 0.0f, 0.0f}}}, // FDM input (LoadOP - clear value ignored). + }; + + // Begin the render pass. + VkRenderPassBeginInfo render_pass_begin_info = vkb::initializers::render_pass_begin_info(); + render_pass_begin_info.clearValueCount = is_fdm_enabled() ? clear_values.size() : (clear_values.size() - 1); + render_pass_begin_info.pClearValues = clear_values.data(); + + assert((main_pass.extend.height > 0) && (main_pass.extend.width > 0)); + VkRect2D main_scissor = vkb::initializers::rect2D(main_pass.extend.width, main_pass.extend.height, 0, 0); + VkViewport main_viewport = vkb::initializers::viewport(static_cast(main_scissor.extent.width), static_cast(main_scissor.extent.height), 0.0f, 1.0f); + + VkRect2D present_scissor = vkb::initializers::rect2D(get_render_context().get_surface_extent().width, get_render_context().get_surface_extent().height, 0, 0); + VkViewport present_viewport = vkb::initializers::viewport(static_cast(present_scissor.extent.width), static_cast(present_scissor.extent.height), 0.0f, 1.0f); + + for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) + { + VkCommandBuffer cmd_buffer = draw_cmd_buffers[i]; + std::string debug_name = fmt::format("Draw command buffer {}", i); + debug_utils.set_debug_name(get_device().get_handle(), VK_OBJECT_TYPE_COMMAND_BUFFER, get_object_handle(cmd_buffer), debug_name.c_str()); + + VK_CHECK(vkBeginCommandBuffer(cmd_buffer, &command_buffer_begin_info)); + + if (is_update_fdm_enabled()) + { + write_density_map(cmd_buffer); + } + + // Main pass (forward). + { + debug_utils.cmd_begin_label(cmd_buffer, "Main pass (forward)", glm::vec4()); + + render_pass_begin_info.clearValueCount = is_fdm_enabled() ? clear_values.size() : (clear_values.size() - 1); + render_pass_begin_info.renderPass = render_pass; + render_pass_begin_info.framebuffer = main_pass.framebuffer; + render_pass_begin_info.renderArea.extent = main_scissor.extent; + + vkCmdBeginRenderPass(cmd_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); + + vkCmdSetViewport(cmd_buffer, 0, 1, &main_viewport); + + vkCmdSetScissor(cmd_buffer, 0, 1, &main_scissor); + + // Sky + { + debug_utils.cmd_begin_label(cmd_buffer, "Sky", glm::vec4()); + vkCmdBindPipeline(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, main_pass.sky_pipeline.pipeline); + vkCmdDraw(cmd_buffer, 3, 1, 0, 0); + debug_utils.cmd_end_label(cmd_buffer); + } + + // Main pass glTF-submeshes. + { + assert(scene_data.size() == main_pass.meshes.descriptor_sets.size()); + vkCmdBindPipeline(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, main_pass.meshes.pipeline.pipeline); + for (uint32_t mesh_idx = 0; mesh_idx < scene_data.size(); ++mesh_idx) + { + auto &mesh_data = scene_data[mesh_idx]; + + debug_utils.cmd_begin_label(cmd_buffer, mesh_data.submesh->get_name().c_str(), glm::vec4()); + + vkCmdBindDescriptorSets(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, main_pass.meshes.pipeline.pipeline_layout, 0, 1, &main_pass.meshes.descriptor_sets[mesh_idx], 0, NULL); + + auto &vertex_buffer = mesh_data.submesh->vertex_buffers.at("position"); + auto &normal_buffer = mesh_data.submesh->vertex_buffers.at("normal"); + auto &uv_buffer = mesh_data.submesh->vertex_buffers.at("texcoord_0"); + std::array vertex_buffers = { + vertex_buffer.get_handle(), + normal_buffer.get_handle(), + uv_buffer.get_handle()}; + std::array vertex_offsets = {0, 0, 0}; + + vkCmdBindVertexBuffers(cmd_buffer, 0, + vertex_buffers.size(), + vertex_buffers.data(), + vertex_offsets.data()); + vkCmdBindIndexBuffer(cmd_buffer, + mesh_data.submesh->index_buffer->get_handle(), + mesh_data.submesh->index_offset, + mesh_data.submesh->index_type); + vkCmdDrawIndexed(cmd_buffer, + mesh_data.submesh->vertex_indices, + 1, 0, 0, 0); + + debug_utils.cmd_end_label(cmd_buffer); + } + } + vkCmdEndRenderPass(cmd_buffer); + debug_utils.cmd_end_label(cmd_buffer); + } + + // Present + UI. + { + debug_utils.cmd_begin_label(cmd_buffer, "Present+UI", glm::vec4()); + + if (is_show_fdm_enabled()) + { + VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; + + vkb::image_layout_transition(cmd_buffer, + fdm.image.image, + VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + subresource_range); + } + render_pass_begin_info.renderArea.extent = present_scissor.extent; + render_pass_begin_info.renderPass = present.render_pass; + render_pass_begin_info.framebuffer = framebuffers[i]; + render_pass_begin_info.clearValueCount = 1; + // Copy to swap chain. + { + debug_utils.cmd_begin_label(cmd_buffer, "Copy", glm::vec4()); + vkCmdBeginRenderPass(cmd_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBindPipeline(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, present.pipeline.pipeline); + vkCmdBindDescriptorSets(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, present.pipeline.pipeline_layout, 0, 1, &present.set, 0, nullptr); + + vkCmdSetViewport(cmd_buffer, 0, 1, &present_viewport); + vkCmdSetScissor(cmd_buffer, 0, 1, &present_scissor); + vkCmdDraw(cmd_buffer, 3, 1, 0, 0); + debug_utils.cmd_end_label(cmd_buffer); + } + // UI + if (has_gui()) + { + debug_utils.cmd_begin_label(cmd_buffer, "UI", glm::vec4()); + get_gui().draw(cmd_buffer); + debug_utils.cmd_end_label(cmd_buffer); + } + + vkCmdEndRenderPass(cmd_buffer); + if (is_show_fdm_enabled() && !is_update_fdm_enabled()) + { + VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; + vkb::image_layout_transition(cmd_buffer, + fdm.image.image, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, + VK_ACCESS_SHADER_READ_BIT, + VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, + subresource_range); + } + debug_utils.cmd_end_label(cmd_buffer); + } + VK_CHECK(vkEndCommandBuffer(cmd_buffer)); + } +} + +bool FragmentDensityMap::resize(const uint32_t _width, const uint32_t _height) +{ + // This sample needs to modify ApiVulkanSample::resize to handle the FDM. + if (!prepared) + { + return false; + } + + get_render_context().handle_surface_changes(); + + // Don't recreate the swapchain if the dimensions haven't changed. + if (width == get_render_context().get_surface_extent().width && height == get_render_context().get_surface_extent().height) + { + return false; + } + + width = get_render_context().get_surface_extent().width; + height = get_render_context().get_surface_extent().height; + + prepared = false; + + // Ensure all operations on the device have been finished before destroying resources. + get_device().wait_idle(); + + create_swapchain_buffers(); + + reset_fdm_gpu_data(); + + if ((width > 0u) && (height > 0u)) + { + if (has_gui()) + { + get_gui().resize(width, height); + } + } + + rebuild_command_buffers(); + + get_device().wait_idle(); + + // Notify derived class. + view_changed(); + + prepared = true; + return true; +} + +void FragmentDensityMap::reset_fdm_gpu_data() +{ + vkResetCommandPool(get_device().get_handle(), cmd_pool, 0); + + last_options = current_options; + setup_additional_descriptor_pool(); + prepare_uniform_buffers_fdm(); + + setup_depth_stencil(); + + setup_render_pass(); + setup_framebuffer(); + + setup_descriptor_set_layout_fdm(); + setup_descriptor_set_fdm(); + + setup_descriptor_set_layout_present(); + setup_descriptor_set_present(); + prepare_pipelines(); + + if (!is_update_fdm_enabled() && is_fdm_enabled()) + { + auto cmd_buffer = get_device().create_command_buffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); + debug_utils.set_debug_name(get_device().get_handle(), VK_OBJECT_TYPE_COMMAND_BUFFER, get_object_handle(cmd_buffer), "Generate FDM command buffer"); + write_density_map(cmd_buffer); + get_device().flush_command_buffer(cmd_buffer, queue, true, VK_NULL_HANDLE); + } + + build_command_buffers(); +} + +void FragmentDensityMap::render(float delta_time) +{ + if (!prepared) + { + return; + } + // Recreate resources if options changed. + if (last_options != current_options) + { + prepared = false; + get_device().wait_idle(); + reset_fdm_gpu_data(); + get_device().wait_idle(); + prepared = true; + } + + // Submit current command buffer. + { + ApiVulkanSample::prepare_frame(); + submit_info.commandBufferCount = 1; + submit_info.pCommandBuffers = &draw_cmd_buffers[current_buffer]; + VK_CHECK(vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE)); + ApiVulkanSample::submit_frame(); + } + + if (!paused || camera.updated) + { + update_uniform_buffer(delta_time); + } + if (has_gui() && is_show_stats()) + { + update_stats(delta_time); + } +} + +void FragmentDensityMap::load_assets() +{ + vkb::GLTFLoader loader{get_device()}; + sg_scene = loader.read_scene_from_file("scenes/bonza/Bonza.gltf"); + assert(sg_scene); + + camera.type = vkb::CameraType::FirstPerson; + const float aspect_ratio = 1.0f; // dummy value. Reset by update_extents. + camera.set_perspective(50.0f, aspect_ratio, 4000.0f, 1.0f); + camera.set_rotation(glm::vec3(230.0f, 101.0f, -5.0f)); + camera.set_translation(glm::vec3(115.0f, -390.0f, 18.0f)); + camera.translation_speed = 100.0f; + + // Store all data from glTF scene nodes in a vector. + for (auto &mesh : sg_scene->get_components()) + { + for (auto &node : mesh->get_nodes()) + { + for (auto &submesh : mesh->get_submeshes()) + { + const vkb::sg::Material *mesh_material = submesh->get_material(); + if (mesh_material) + { + bool negative_scale = glm::any(glm::lessThanEqual(node->get_transform().get_scale(), glm::vec3(0.0f))); + const auto &color_texture_it = mesh_material->textures.find("base_color_texture"); + // Cull double-sided/transparent/negatively-scaled/non-textured meshes. + if (!negative_scale && + !mesh_material->double_sided && + mesh_material->alpha_mode == vkb::sg::AlphaMode::Opaque && + color_texture_it != mesh_material->textures.end()) + { + SubmeshData &mesh_data = scene_data.emplace_back(std::move(SubmeshData{ + .submesh = submesh, + .world_matrix = node->get_transform().get_world_matrix(), + .base_color_texture = color_texture_it->second})); + } + else + { + LOGI("Ignoring glTF mesh <{}>", submesh->get_name()); + } + } + } + } + } + assert(!scene_data.empty()); +} + +void FragmentDensityMap::setup_descriptor_pool_main_pass() +{ + assert(main_pass.descriptor_pool == VK_NULL_HANDLE); + const uint32_t max_sets = vkb::to_u32(scene_data.size()); + + std::array pool_sizes = + { + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, vkb::to_u32(scene_data.size())), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, vkb::to_u32(scene_data.size())), + }; + + VkDescriptorPoolCreateInfo descriptor_pool_create_info = + vkb::initializers::descriptor_pool_create_info( + vkb::to_u32(pool_sizes.size()), + pool_sizes.data(), max_sets); + + VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &descriptor_pool_create_info, nullptr, &main_pass.descriptor_pool)); + debug_utils.set_debug_name(get_device().get_handle(), VK_OBJECT_TYPE_DESCRIPTOR_POOL, get_object_handle(main_pass.descriptor_pool), "Main pass descriptor pool"); +} + +void FragmentDensityMap::setup_additional_descriptor_pool() +{ + vkDestroyDescriptorPool(get_device().get_handle(), descriptor_pool, nullptr); + const uint32_t max_sets = 2; // generate_fdm + present. + + std::array pool_sizes = + { + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1), + }; + + VkDescriptorPoolCreateInfo descriptor_pool_create_info = + vkb::initializers::descriptor_pool_create_info( + vkb::to_u32(pool_sizes.size()), + pool_sizes.data(), max_sets); + + VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &descriptor_pool_create_info, nullptr, &descriptor_pool)); + debug_utils.set_debug_name(get_device().get_handle(), VK_OBJECT_TYPE_DESCRIPTOR_POOL, get_object_handle(descriptor_pool), "Additional Descriptor Pool"); +} + +void FragmentDensityMap::setup_descriptor_set_layout_main_pass() +{ + VkDevice device_handle = get_device().get_handle(); + VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info; + VkPipelineLayoutCreateInfo pipeline_layout_create_info; + + // Main pass glTF-submesh. + { + std::array set_layout_bindings = + { + // Binding 0 : Vertex shader uniform buffer. + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + VK_SHADER_STAGE_VERTEX_BIT, + 0), + // Binding 1 : Fragment shader combined sampler. + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + VK_SHADER_STAGE_FRAGMENT_BIT, + 1), + }; + + descriptor_layout_create_info = + vkb::initializers::descriptor_set_layout_create_info( + set_layout_bindings.data(), + vkb::to_u32(set_layout_bindings.size())); + + pipeline_layout_create_info = + vkb::initializers::pipeline_layout_create_info( + &main_pass.meshes.pipeline.set_layout, 1); + + assert(main_pass.meshes.pipeline.set_layout == VK_NULL_HANDLE); + VK_CHECK(vkCreateDescriptorSetLayout(device_handle, &descriptor_layout_create_info, nullptr, &main_pass.meshes.pipeline.set_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, + get_object_handle(main_pass.meshes.pipeline.set_layout), "Submeshes Descriptor Set Layout"); + + assert(main_pass.meshes.pipeline.pipeline_layout == VK_NULL_HANDLE); + VK_CHECK(vkCreatePipelineLayout(device_handle, &pipeline_layout_create_info, nullptr, &main_pass.meshes.pipeline.pipeline_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE_LAYOUT, + get_object_handle(main_pass.meshes.pipeline.pipeline_layout), "Submeshes Pipeline Layout"); + } + + // Sky + { + descriptor_layout_create_info = + vkb::initializers::descriptor_set_layout_create_info(nullptr, 0); + + pipeline_layout_create_info = + vkb::initializers::pipeline_layout_create_info( + &main_pass.sky_pipeline.set_layout, 1); + + assert(main_pass.sky_pipeline.set_layout == VK_NULL_HANDLE); + VK_CHECK(vkCreateDescriptorSetLayout(device_handle, &descriptor_layout_create_info, nullptr, &main_pass.sky_pipeline.set_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, + get_object_handle(main_pass.sky_pipeline.set_layout), "Sky Descriptor Set Layout"); + + assert(main_pass.sky_pipeline.pipeline_layout == VK_NULL_HANDLE); + VK_CHECK(vkCreatePipelineLayout(device_handle, &pipeline_layout_create_info, nullptr, &main_pass.sky_pipeline.pipeline_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE_LAYOUT, + get_object_handle(main_pass.sky_pipeline.pipeline_layout), "Sky Pipeline Layout"); + } +} + +void FragmentDensityMap::setup_descriptor_set_layout_fdm() +{ + VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info; + VkPipelineLayoutCreateInfo pipeline_layout_create_info; + VkDevice device_handle = get_device().get_handle(); + std::array compute_set_layout_bindings = + { + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + VK_SHADER_STAGE_COMPUTE_BIT, + 0), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + VK_SHADER_STAGE_COMPUTE_BIT, + 1), + }; + std::array fragment_set_layout_bindings = + { + // Binding 0: Fragment shader uniform buffer. + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + VK_SHADER_STAGE_FRAGMENT_BIT, + 0)}; + + if (is_generate_fdm_compute()) + { + descriptor_layout_create_info = + vkb::initializers::descriptor_set_layout_create_info( + compute_set_layout_bindings.data(), + vkb::to_u32(compute_set_layout_bindings.size())); + } + else + { + descriptor_layout_create_info = + vkb::initializers::descriptor_set_layout_create_info( + fragment_set_layout_bindings.data(), + vkb::to_u32(fragment_set_layout_bindings.size())); + } + + pipeline_layout_create_info = + vkb::initializers::pipeline_layout_create_info( + &fdm.generate.pipeline.set_layout, 1); + + vkDestroyDescriptorSetLayout(device_handle, fdm.generate.pipeline.set_layout, nullptr); + VK_CHECK(vkCreateDescriptorSetLayout(device_handle, &descriptor_layout_create_info, nullptr, &fdm.generate.pipeline.set_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, + get_object_handle(fdm.generate.pipeline.set_layout), + is_generate_fdm_compute() ? "Generate FDM (Compute) Descriptor Set Layout" : "Generate FDM (Fragment) Descriptor Set Layout"); + + vkDestroyPipelineLayout(device_handle, fdm.generate.pipeline.pipeline_layout, nullptr); + VK_CHECK(vkCreatePipelineLayout(device_handle, &pipeline_layout_create_info, nullptr, &fdm.generate.pipeline.pipeline_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE_LAYOUT, + get_object_handle(fdm.generate.pipeline.pipeline_layout), + is_generate_fdm_compute() ? "Generate FDM (Compute) Pipeline Layout" : "Generate FDM (Fragment) Pipeline Layout"); +} + +void FragmentDensityMap::setup_descriptor_set_layout_present() +{ + VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info; + VkPipelineLayoutCreateInfo pipeline_layout_create_info; + VkDevice device_handle = get_device().get_handle(); + std::array set_layout_bindings = + { + // Binding 0 : Fragment shader combined sampler. + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + VK_SHADER_STAGE_FRAGMENT_BIT, + 0), + }; + + descriptor_layout_create_info = + vkb::initializers::descriptor_set_layout_create_info( + set_layout_bindings.data(), + vkb::to_u32(set_layout_bindings.size())); + + pipeline_layout_create_info = + vkb::initializers::pipeline_layout_create_info( + &present.pipeline.set_layout, 1); + + set_layout_bindings[0].pImmutableSamplers = (is_fdm_enabled() && !is_show_fdm_enabled()) ? &samplers.subsampled_nearest : &samplers.nearest; + + vkDestroyDescriptorSetLayout(device_handle, present.pipeline.set_layout, nullptr); + VK_CHECK(vkCreateDescriptorSetLayout(device_handle, &descriptor_layout_create_info, nullptr, &present.pipeline.set_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, get_object_handle(present.pipeline.set_layout), "Present Descriptor Set Layout"); + + vkDestroyPipelineLayout(device_handle, present.pipeline.pipeline_layout, nullptr); + VK_CHECK(vkCreatePipelineLayout(device_handle, &pipeline_layout_create_info, nullptr, &present.pipeline.pipeline_layout)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_PIPELINE_LAYOUT, get_object_handle(present.pipeline.pipeline_layout), "Present Pipeline Layout"); +} + +void FragmentDensityMap::setup_descriptor_set_main_pass() +{ + VkDevice device_handle = get_device().get_handle(); + assert(main_pass.meshes.descriptor_sets.empty()); + main_pass.meshes.descriptor_sets.resize(scene_data.size(), VK_NULL_HANDLE); + for (uint32_t i = 0; i < scene_data.size(); ++i) + { + auto &mesh_data = scene_data[i]; + auto &mesh_descriptor = main_pass.meshes.descriptor_sets[i]; + + VkDescriptorSetAllocateInfo descriptor_set_alloc_info = vkb::initializers::descriptor_set_allocate_info(main_pass.descriptor_pool, &main_pass.meshes.pipeline.set_layout, 1); + VK_CHECK(vkAllocateDescriptorSets(device_handle, &descriptor_set_alloc_info, &mesh_descriptor)); + + std::string debug_name = fmt::format("Descriptor Set glTF submesh-{} <{}>", i, mesh_data.submesh->get_name()); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET, get_object_handle(mesh_descriptor), debug_name.c_str()); + + VkDescriptorBufferInfo buffer_descriptor = create_descriptor(*mesh_data.vertex_ubo); + VkDescriptorImageInfo image_descriptor = vkb::initializers::descriptor_image_info( + mesh_data.base_color_texture->get_sampler()->get_core_sampler().get_handle(), + mesh_data.base_color_texture->get_image()->get_vk_image_view().get_handle(), + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + std::array write_descriptor_sets = + { + vkb::initializers::write_descriptor_set(mesh_descriptor, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &buffer_descriptor), // Binding 0 : Vertex shader uniform buffer. + vkb::initializers::write_descriptor_set(mesh_descriptor, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &image_descriptor) // Binding 1 : Color map. + }; + vkUpdateDescriptorSets(device_handle, vkb::to_u32(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL); + } +} + +void FragmentDensityMap::setup_descriptor_set_fdm() +{ + VkDescriptorSetAllocateInfo descriptor_set_alloc_info; + VkDevice device_handle = get_device().get_handle(); + descriptor_set_alloc_info = vkb::initializers::descriptor_set_allocate_info( + descriptor_pool, &fdm.generate.pipeline.set_layout, 1); + VK_CHECK(vkAllocateDescriptorSets(device_handle, &descriptor_set_alloc_info, &fdm.generate.set)); + + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET, + get_object_handle(fdm.generate.set), + is_generate_fdm_compute() ? "Descriptor set Generate FDM (Compute)" : + "Descriptor set Generate FDM (Fragment)"); + + VkDescriptorBufferInfo buffer_descriptor = create_descriptor(*fdm.ubo); + VkDescriptorImageInfo image_descriptor = vkb::initializers::descriptor_image_info( + samplers.nearest, + fdm.image.view, + VK_IMAGE_LAYOUT_GENERAL); + std::array write_descriptor_sets = { + vkb::initializers::write_descriptor_set(fdm.generate.set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &buffer_descriptor), + vkb::initializers::write_descriptor_set(fdm.generate.set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, &image_descriptor)}; + vkUpdateDescriptorSets(device_handle, + is_generate_fdm_compute() ? vkb::to_u32(write_descriptor_sets.size()) : 1u, + write_descriptor_sets.data(), 0, NULL); +} + +void FragmentDensityMap::setup_descriptor_set_present() +{ + VkDescriptorSetAllocateInfo descriptor_set_alloc_info; + VkDevice device_handle = get_device().get_handle(); + descriptor_set_alloc_info = vkb::initializers::descriptor_set_allocate_info( + descriptor_pool, &present.pipeline.set_layout, 1); + VK_CHECK(vkAllocateDescriptorSets(device_handle, &descriptor_set_alloc_info, &present.set)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_DESCRIPTOR_SET, get_object_handle(present.set), "Descriptor set Present"); + + VkDescriptorImageInfo image_descriptor = vkb::initializers::descriptor_image_info( + (is_fdm_enabled() && !is_show_fdm_enabled()) ? samplers.subsampled_nearest : samplers.nearest, + is_show_fdm_enabled() ? fdm.image.view : main_pass.image.view, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + std::array write_descriptor_sets = { + vkb::initializers::write_descriptor_set( + present.set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &image_descriptor)}; + vkUpdateDescriptorSets(device_handle, vkb::to_u32(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr); +} + +void FragmentDensityMap::prepare_uniform_buffers_main_pass() +{ + // Create uniform buffers for each glTF-submesh. + for (auto &mesh_data : scene_data) + { + mesh_data.vertex_ubo = std::make_unique( + get_device(), sizeof(UBOVS), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + } +} + +void FragmentDensityMap::prepare_uniform_buffers_fdm() +{ + fdm.ubo = std::make_unique( + get_device(), sizeof(FDMUBO), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + fdm.ubo_data = {}; // Reset so that the GPU UBO is updated. + update_uniform_buffer(0.0f); +} + +void FragmentDensityMap::update_uniform_buffer(float delta_time) +{ + // Main pass glTF-submeshes UBO. + { + UBOVS ubo_vs{ + .projection = camera.matrices.perspective}; + + for (auto &mesh_data : scene_data) + { + ubo_vs.modelview = camera.matrices.view * mesh_data.world_matrix; + mesh_data.vertex_ubo->convert_and_update(ubo_vs); + } + } + + // Generate FDM UBO. + { + const float min_dimension = static_cast(std::min(fdm.extend.width, fdm.extend.height)); + constexpr float radius_factor_1x1 = 0.20f; + constexpr float radius_factor_1x2 = 0.25f; + constexpr float radius_factor_2x2 = 0.30f; + constexpr float radius_factor_2x4 = 0.35f; + + constexpr uint32_t frame_period = 512; + + if (is_update_fdm_enabled()) + { + frame_idx = (frame_idx + 1) % frame_period; + } + + // Small animation rotating the eye center around a circle. + constexpr float frame_factor = 2.0f * glm::pi() / static_cast(frame_period); + const float frame_angle = static_cast(frame_idx) * frame_factor; + const float rotating_center_radius = 0.12f * min_dimension; + + FDMUBO new_fdm_data{ + .eye_center = { + static_cast(fdm.extend.width) * 0.5f + rotating_center_radius * sin(frame_angle), + static_cast(fdm.extend.height) * 0.5f + rotating_center_radius * cos(frame_angle), + 0.0f, 0.0f}, + .circle_radius = {min_dimension * radius_factor_1x1, min_dimension * radius_factor_1x2, min_dimension * radius_factor_2x2, min_dimension * radius_factor_2x4}, + }; + + if (fdm.ubo_data != new_fdm_data) + { + fdm.ubo_data = new_fdm_data; + fdm.ubo->convert_and_update(new_fdm_data); + } + } +} + +void FragmentDensityMap::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) +{ + VulkanSample::request_gpu_features(gpu); + auto &requested_features = gpu.get_mutable_requested_features(); + + // Enable anisotropic filtering if supported. + if (gpu.get_features().samplerAnisotropy) + { + requested_features.samplerAnisotropy = VK_TRUE; + } + + // Enable texture compression. + if (gpu.get_features().textureCompressionBC) + { + requested_features.textureCompressionBC = VK_TRUE; + } + else if (gpu.get_features().textureCompressionASTC_LDR) + { + requested_features.textureCompressionASTC_LDR = VK_TRUE; + } + else if (gpu.get_features().textureCompressionETC2) + { + requested_features.textureCompressionETC2 = VK_TRUE; + } + + // Check for FDM support and configure options. + available_options.supports_fdm = false; + if (gpu.is_extension_supported(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME)) + { + const auto &supported_extension_features = + gpu.get_extension_features(); + + if (!supported_extension_features.fragmentDensityMap) + { + LOGW("FDM extension supported but fragmentDensityMap feature is not supported."); + } + else + { + available_options.supports_fdm = true; + + available_options.supports_dynamic_fdm &= static_cast(supported_extension_features.fragmentDensityMapDynamic); + if (!available_options.supports_dynamic_fdm) + { + LOGW("Dynamic FDM is not supported. The FDM cannot be updated."); + current_options.update_fdm = false; + } + + auto &requested_extension_features = gpu.add_extension_features(); + requested_extension_features.fragmentDensityMap = VK_TRUE; + requested_extension_features.fragmentDensityMapDynamic = available_options.supports_dynamic_fdm; + // fragmentDensityMapNonSubsampledImages is not supported on all GPUs. + // It is not necessary in this sample since we create resources with the flag VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT. + // If supported, we could skip the present pass and render directly to the swapchain. + // However, this is not recommended, since UI and composition are usually done at full resolution. + requested_extension_features.fragmentDensityMapNonSubsampledImages = VK_FALSE; + } + } + if (!available_options.supports_fdm) + { + current_options.enable_fdm = false; + LOGE("Fragment density map is not supported"); + } + else + { + VkPhysicalDeviceProperties2KHR device_properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2}; + VkPhysicalDeviceFragmentDensityMapPropertiesEXT physical_device_FRAGMENT_DENSITY_MAP_properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT}; + device_properties.pNext = &physical_device_FRAGMENT_DENSITY_MAP_properties; + + vkGetPhysicalDeviceProperties2KHR(gpu.get_handle(), &device_properties); + + LOGI("FDM enable: FDM min texel size={}x{} FDM max texel size={}x{}", + physical_device_FRAGMENT_DENSITY_MAP_properties.minFragmentDensityTexelSize.width, + physical_device_FRAGMENT_DENSITY_MAP_properties.minFragmentDensityTexelSize.height, + physical_device_FRAGMENT_DENSITY_MAP_properties.maxFragmentDensityTexelSize.width, + physical_device_FRAGMENT_DENSITY_MAP_properties.maxFragmentDensityTexelSize.height); + + fdm.texel_size.width = std::clamp(fdm.texel_size.width, + physical_device_FRAGMENT_DENSITY_MAP_properties.minFragmentDensityTexelSize.width, + physical_device_FRAGMENT_DENSITY_MAP_properties.maxFragmentDensityTexelSize.width); + fdm.texel_size.height = std::clamp(fdm.texel_size.height, + physical_device_FRAGMENT_DENSITY_MAP_properties.minFragmentDensityTexelSize.height, + physical_device_FRAGMENT_DENSITY_MAP_properties.maxFragmentDensityTexelSize.height); + } + last_options = current_options; +} + +void FragmentDensityMap::write_density_map(VkCommandBuffer cmd_buffer) +{ + if (is_generate_fdm_compute()) + { + debug_utils.cmd_begin_label(cmd_buffer, "Write FDM (compute)", glm::vec4()); + VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; + + // Clear the density map buffer by transitioning it from UNDEFINED. + vkb::image_layout_transition(cmd_buffer, + fdm.image.image, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + {}, + VK_ACCESS_SHADER_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_GENERAL, + subresource_range); + + vkCmdBindPipeline(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fdm.generate.pipeline.pipeline); + vkCmdBindDescriptorSets(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fdm.generate.pipeline.pipeline_layout, 0, 1, &fdm.generate.set, 0, nullptr); + + const glm::vec2 shader_local_size = glm::vec2(4, 8); // Keep up to date with shader source code. + glm::vec2 dispatch_size = glm::ceil(glm::vec2(fdm.extend.width, fdm.extend.height) / shader_local_size); + + vkCmdDispatch(cmd_buffer, dispatch_size.x, dispatch_size.y, 1); + + if (is_fdm_enabled()) + { + vkb::image_layout_transition(cmd_buffer, + fdm.image.image, + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, + VK_ACCESS_SHADER_WRITE_BIT, + VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT, + VK_IMAGE_LAYOUT_GENERAL, + VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, + subresource_range); + } + debug_utils.cmd_end_label(cmd_buffer); + } + else + { + debug_utils.cmd_begin_label(cmd_buffer, "Write FDM (fragment)", glm::vec4()); + + VkClearValue clear_value{ + .color = {{0.0f, 0.0f, 0.0f, 0.0f}}}; + VkRect2D scissor = vkb::initializers::rect2D(fdm.extend.width, fdm.extend.height, 0, 0); + VkViewport viewport = vkb::initializers::viewport(static_cast(scissor.extent.width), static_cast(scissor.extent.height), 0.0f, 1.0f); + + VkRenderPassBeginInfo render_pass_begin_info = vkb::initializers::render_pass_begin_info(); + render_pass_begin_info.renderPass = fdm.generate.render_pass; + render_pass_begin_info.renderArea.extent = scissor.extent; + render_pass_begin_info.clearValueCount = 1; + render_pass_begin_info.pClearValues = &clear_value; + + render_pass_begin_info.framebuffer = fdm.generate.framebuffer; + + vkCmdBeginRenderPass(cmd_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBindPipeline(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, fdm.generate.pipeline.pipeline); + + vkCmdBindDescriptorSets(cmd_buffer, + VK_PIPELINE_BIND_POINT_GRAPHICS, + fdm.generate.pipeline.pipeline_layout, + 0, 1, + &fdm.generate.set, + 0, nullptr); + + vkCmdSetViewport(cmd_buffer, 0, 1, &viewport); + vkCmdSetScissor(cmd_buffer, 0, 1, &scissor); + vkCmdDraw(cmd_buffer, 3, 1, 0, 0); + + vkCmdEndRenderPass(cmd_buffer); + debug_utils.cmd_end_label(cmd_buffer); + } +} + +void FragmentDensityMap::setup_render_pass() +{ + setup_color(); + setup_fragment_density_map(); + + VkImageLayout density_map_initial_layout = VK_IMAGE_LAYOUT_GENERAL; + if (is_fdm_enabled()) + { + density_map_initial_layout = VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT; + } + VkDevice device_handle = get_device().get_handle(); + // Main render pass (forward render). + { + std::array attachments{ + // Color attachment. + VkAttachmentDescription2{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = get_render_context().get_format(), + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL}, + // Depth attachment. + VkAttachmentDescription2{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = depth_format, + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL}, + + // Density map attachment. + VkAttachmentDescription2{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = VK_FORMAT_R8G8_UNORM, + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = density_map_initial_layout, + .finalLayout = density_map_initial_layout}}; + + VkAttachmentReference2 color_attachment_ref{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, + .attachment = 0, + .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT}; + + VkAttachmentReference2 depth_reference = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, + .attachment = 1, + .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT}; + + VkSubpassDescription2 subpass{ + .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .viewMask = 0u, + .inputAttachmentCount = 0, + .pInputAttachments = nullptr, + .colorAttachmentCount = 1, + .pColorAttachments = &color_attachment_ref, + .pResolveAttachments = nullptr, + .pDepthStencilAttachment = &depth_reference, + .preserveAttachmentCount = 0, + .pPreserveAttachments = nullptr}; + + VkSubpassDependency2 dependency{ + .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, + .pNext = nullptr, + .srcSubpass = 0, + .dstSubpass = VK_SUBPASS_EXTERNAL, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, + .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT, + .viewOffset = 0}; + + VkRenderPassFragmentDensityMapCreateInfoEXT density_map_info{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT, + .pNext = nullptr, + .fragmentDensityMapAttachment{ + .attachment = 2, + .layout = density_map_initial_layout}, + }; + + VkRenderPassCreateInfo2 render_pass_info{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, + .pNext = is_fdm_enabled() ? &density_map_info : nullptr, + .flags = 0, + .attachmentCount = is_fdm_enabled() ? vkb::to_u32(attachments.size()) : (vkb::to_u32(attachments.size()) - 1), + .pAttachments = attachments.data(), + .subpassCount = 1, + .pSubpasses = &subpass, + .dependencyCount = 1, + .pDependencies = &dependency, + .correlatedViewMaskCount = 0, + .pCorrelatedViewMasks = nullptr, + }; + + vkDestroyRenderPass(device_handle, render_pass, nullptr); + VK_CHECK(vkCreateRenderPass2KHR(device_handle, &render_pass_info, nullptr, &render_pass)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_RENDER_PASS, get_object_handle(render_pass), "Main Renderpass (Forward rendering)"); + } + + // Write FDM (fragment). + if (is_fdm_enabled() && !is_generate_fdm_compute()) + { + std::array attachments{ + VkAttachmentDescription2{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = VK_FORMAT_R8G8_UNORM, + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .finalLayout = VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT}}; + + VkAttachmentReference2 attachment_ref{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, + .attachment = 0, + .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT}; + + VkSubpassDescription2 subpass{ + .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .viewMask = 0, + .inputAttachmentCount = 0, + .pInputAttachments = nullptr, + .colorAttachmentCount = 1, + .pColorAttachments = &attachment_ref, + .pResolveAttachments = nullptr, + .pDepthStencilAttachment = nullptr, + .preserveAttachmentCount = 0, + .pPreserveAttachments = nullptr}; + + VkSubpassDependency2 dependency{ + .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, + .pNext = nullptr, + .srcSubpass = VK_SUBPASS_EXTERNAL, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .srcAccessMask = 0, + .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dependencyFlags = 0, + .viewOffset = 0}; + + VkRenderPassCreateInfo2 render_pass_info{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, + .pNext = nullptr, + .flags = 0, + .attachmentCount = attachments.size(), + .pAttachments = attachments.data(), + .subpassCount = 1, + .pSubpasses = &subpass, + .dependencyCount = 1, + .pDependencies = &dependency, + .correlatedViewMaskCount = 0, + .pCorrelatedViewMasks = nullptr}; + + vkDestroyRenderPass(device_handle, fdm.generate.render_pass, nullptr); + VK_CHECK(vkCreateRenderPass2KHR(device_handle, &render_pass_info, nullptr, &fdm.generate.render_pass)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_RENDER_PASS, get_object_handle(fdm.generate.render_pass), "Write FDM Renderpass"); + } + // Present + { + std::array attachments{ + VkAttachmentDescription2{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = get_render_context().get_format(), + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR}}; + + VkAttachmentReference2 attachment_ref{ + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, + .attachment = 0, + .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT}; + + VkSubpassDescription2 subpass{ + .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .viewMask = 0, + .inputAttachmentCount = 0, + .pInputAttachments = nullptr, + .colorAttachmentCount = 1, + .pColorAttachments = &attachment_ref, + .pResolveAttachments = nullptr, + .pDepthStencilAttachment = nullptr, + .preserveAttachmentCount = 0, + .pPreserveAttachments = nullptr}; + + VkSubpassDependency2 dependency{ + .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, + .pNext = nullptr, + .srcSubpass = VK_SUBPASS_EXTERNAL, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .srcAccessMask = 0, + .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dependencyFlags = 0, + .viewOffset = 0}; + + VkRenderPassCreateInfo2 render_pass_info{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, + .pNext = nullptr, + .flags = 0, + .attachmentCount = attachments.size(), + .pAttachments = attachments.data(), + .subpassCount = 1, + .pSubpasses = &subpass, + .dependencyCount = 1, + .pDependencies = &dependency, + .correlatedViewMaskCount = 0, + .pCorrelatedViewMasks = nullptr}; + + vkDestroyRenderPass(device_handle, present.render_pass, nullptr); + VK_CHECK(vkCreateRenderPass2KHR(device_handle, &render_pass_info, nullptr, &present.render_pass)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_RENDER_PASS, get_object_handle(present.render_pass), "Present Renderpass"); + } +} +void FragmentDensityMap::setup_framebuffer() +{ + VkDevice device_handle = get_device().get_handle(); + + // Main pass framebuffer. + { + std::array attachments{ + main_pass.image.view, + depth_stencil.view, + fdm.image.view}; + VkFramebufferCreateInfo framebuffer_create_info{ + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .pNext = nullptr, + .renderPass = render_pass, + .attachmentCount = is_fdm_enabled() ? vkb::to_u32(attachments.size()) : (vkb::to_u32(attachments.size()) - 1u), + .pAttachments = attachments.data(), + .width = main_pass.extend.width, + .height = main_pass.extend.height, + .layers = 1}; + + vkDestroyFramebuffer(device_handle, main_pass.framebuffer, nullptr); + VK_CHECK(vkCreateFramebuffer(device_handle, &framebuffer_create_info, nullptr, &main_pass.framebuffer)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_FRAMEBUFFER, get_object_handle(main_pass.framebuffer), "Main pass Framebuffer"); + } + + // Present framebuffer. + { + // Delete existing framebuffers. + if (!framebuffers.empty()) + { + for (auto &framebuffer : framebuffers) + { + vkDestroyFramebuffer(device_handle, framebuffer, nullptr); + } + } + + VkFramebufferCreateInfo framebuffer_create_info{ + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .pNext = nullptr, + .renderPass = present.render_pass, + .attachmentCount = 1, + .width = get_render_context().get_surface_extent().width, + .height = get_render_context().get_surface_extent().height, + .layers = 1}; + + // Create framebuffers for every swap chain image. + framebuffers.resize(get_render_context().get_render_frames().size()); + for (uint32_t i = 0; i < framebuffers.size(); i++) + { + framebuffer_create_info.pAttachments = &swapchain_buffers[i].view; + VK_CHECK(vkCreateFramebuffer(device_handle, &framebuffer_create_info, nullptr, &framebuffers[i])); + std::string object_debug_name{fmt::format("Swapchain Framebuffer {}", i)}; + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_FRAMEBUFFER, get_object_handle(framebuffers[i]), object_debug_name.c_str()); + object_debug_name = fmt::format("Swapchain Image {}", i); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE, get_object_handle(swapchain_buffers[i].image), object_debug_name.c_str()); + object_debug_name = fmt::format("Swapchain Image View {}", i); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE_VIEW, get_object_handle(swapchain_buffers[i].view), object_debug_name.c_str()); + } + } + + // Write FDM (fragment) framebuffer. + { + vkDestroyFramebuffer(device_handle, fdm.generate.framebuffer, nullptr); + if (is_fdm_enabled() && !is_generate_fdm_compute()) + { + std::array attachments{fdm.image.view}; + VkFramebufferCreateInfo framebuffer_create_info{ + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .pNext = nullptr, + .renderPass = fdm.generate.render_pass, + .attachmentCount = vkb::to_u32(attachments.size()), + .pAttachments = attachments.data(), + .width = fdm.extend.width, + .height = fdm.extend.height, + .layers = 1}; + + VK_CHECK(vkCreateFramebuffer(device_handle, &framebuffer_create_info, nullptr, &fdm.generate.framebuffer)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_FRAMEBUFFER, get_object_handle(fdm.generate.framebuffer), "Write FDM Framebuffer"); + } + else + { + fdm.generate.framebuffer = VK_NULL_HANDLE; + } + } +} + +void FragmentDensityMap::update_extents() +{ + // Rendering at 4× the resolution to make performance improvements more noticeable. + glm::vec2 rendering_factor{4.0f, 4.0f}; + fdm.extend = { + std::max(1u, + static_cast(std::ceil(static_cast(rendering_factor.x * get_render_context().get_surface_extent().width) / static_cast(fdm.texel_size.width)))), + std::max(1u, + static_cast(std::ceil(static_cast(rendering_factor.y * get_render_context().get_surface_extent().height) / static_cast(fdm.texel_size.height)))), + 1}; + + main_pass.extend = { + fdm.extend.width * fdm.texel_size.width, + fdm.extend.height * fdm.texel_size.height}; + + camera.update_aspect_ratio(static_cast(main_pass.extend.width) / static_cast(main_pass.extend.height)); +} + +void FragmentDensityMap::setup_depth_stencil() +{ + destroy_image(depth_stencil); + + update_extents(); + assert(main_pass.extend.width == (fdm.extend.width * fdm.texel_size.width)); + assert(main_pass.extend.height == (fdm.extend.height * fdm.texel_size.height)); + assert((main_pass.extend.height > 0) && (main_pass.extend.width > 0)); + + // Create depth stencil image. + { + // This sample needs to add the subsampled flag so we cannot use the framework function. + VkImageCreateInfo image_create_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .flags = is_fdm_enabled() ? VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT : 0u, + .imageType = VK_IMAGE_TYPE_2D, + .format = depth_format, + .extent{main_pass.extend.width, main_pass.extend.height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT}; + + VkDevice device_handle = get_device().get_handle(); + VK_CHECK(vkCreateImage(device_handle, &image_create_info, nullptr, &depth_stencil.image)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE, get_object_handle(depth_stencil.image), "Main pass Depth Image"); + + VkMemoryRequirements memReqs{}; + vkGetImageMemoryRequirements(device_handle, depth_stencil.image, &memReqs); + + VkMemoryAllocateInfo memory_allocation{ + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = memReqs.size, + .memoryTypeIndex = get_device().get_gpu().get_memory_type(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)}; + VK_CHECK(vkAllocateMemory(device_handle, &memory_allocation, nullptr, &depth_stencil.mem)); + VK_CHECK(vkBindImageMemory(device_handle, depth_stencil.image, depth_stencil.mem, 0)); + + VkImageViewCreateInfo image_view_create_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = depth_stencil.image, + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = depth_format, + .subresourceRange{ + .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1}}; + // Stencil aspect should only be set on depth + stencil formats. + if (depth_format >= VK_FORMAT_D16_UNORM_S8_UINT) + { + image_view_create_info.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + VK_CHECK(vkCreateImageView(device_handle, &image_view_create_info, nullptr, &depth_stencil.view)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE_VIEW, get_object_handle(depth_stencil.view), "Main pass depth image view"); + } +} + +void FragmentDensityMap::setup_color() +{ + assert(main_pass.extend.width == (fdm.extend.width * fdm.texel_size.width)); + assert(main_pass.extend.height == (fdm.extend.height * fdm.texel_size.height)); + assert((main_pass.extend.height > 0) && (main_pass.extend.width > 0)); + + destroy_image(main_pass.image); + + // Create images used to render the framebuffer. + // Note: We need to add the subsampled flag. + VkImageCreateInfo image_create_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .flags = is_fdm_enabled() ? VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT : 0u, + .imageType = VK_IMAGE_TYPE_2D, + .format = get_render_context().get_format(), + .extent{main_pass.extend.width, main_pass.extend.height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT}; + + VkDevice device_handle = get_device().get_handle(); + VK_CHECK(vkCreateImage(device_handle, &image_create_info, nullptr, &main_pass.image.image)); + + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE, get_object_handle(main_pass.image.image), "Main pass color image"); + + VkMemoryRequirements mem_reqs{}; + vkGetImageMemoryRequirements(device_handle, main_pass.image.image, &mem_reqs); + + VkMemoryAllocateInfo mem_alloc{ + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = mem_reqs.size, + .memoryTypeIndex = get_device().get_gpu().get_memory_type(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)}; + VK_CHECK(vkAllocateMemory(device_handle, &mem_alloc, nullptr, &main_pass.image.mem)); + VK_CHECK(vkBindImageMemory(device_handle, main_pass.image.image, main_pass.image.mem, 0)); + + VkImageViewCreateInfo image_view_create_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = nullptr, + .image = main_pass.image.image, + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = get_render_context().get_format(), + .components = vkb::initializers::component_mapping(), + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }}; + VK_CHECK(vkCreateImageView(device_handle, &image_view_create_info, nullptr, &main_pass.image.view)); + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE_VIEW, get_object_handle(main_pass.image.view), "Main pass color image view"); +} + +bool FragmentDensityMap::is_fdm_supported() +{ + return available_options.supports_fdm; +} + +bool FragmentDensityMap::is_generate_fdm_compute() +{ + return is_fdm_enabled() && last_options.generate_fdm_compute; +} + +bool FragmentDensityMap::is_show_fdm_enabled() +{ + return is_fdm_enabled() && last_options.show_fdm; +} + +bool FragmentDensityMap::is_show_stats() +{ + return has_gui() && last_options.show_stats; +} + +bool FragmentDensityMap::is_debug_fdm_enabled() +{ + return is_fdm_enabled() && last_options.debug_fdm; +} + +bool FragmentDensityMap::is_update_fdm_enabled() +{ + return is_fdm_enabled() && last_options.update_fdm && available_options.supports_dynamic_fdm; +} + +bool FragmentDensityMap::is_fdm_enabled() +{ + return last_options.enable_fdm && is_fdm_supported(); +} + +void FragmentDensityMap::setup_fragment_density_map() +{ + assert(main_pass.extend.width == (fdm.extend.width * fdm.texel_size.width)); + assert(main_pass.extend.height == (fdm.extend.height * fdm.texel_size.height)); + + destroy_image(fdm.image); + if (!is_fdm_enabled()) + { + return; + } + + VkImageCreateInfo image_create_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .flags = 0u, + .imageType = VK_IMAGE_TYPE_2D, + .format = VK_FORMAT_R8G8_UNORM, + .extent = fdm.extend, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = 0u}; + + if (is_generate_fdm_compute()) + { + image_create_info.usage |= VK_IMAGE_USAGE_STORAGE_BIT; + } + else + { + image_create_info.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + } + + if (is_fdm_enabled()) + { + image_create_info.usage |= VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT; + } + if (is_show_fdm_enabled()) + { + image_create_info.usage |= VK_IMAGE_USAGE_SAMPLED_BIT; + } + + VkDevice device_handle = get_device().get_handle(); + VK_CHECK(vkCreateImage(device_handle, &image_create_info, nullptr, &fdm.image.image)); + + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE, get_object_handle(fdm.image.image), "FDM Image"); + + VkMemoryRequirements mem_reqs{}; + vkGetImageMemoryRequirements(device_handle, fdm.image.image, &mem_reqs); + + VkMemoryAllocateInfo mem_alloc{ + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = mem_reqs.size, + .memoryTypeIndex = get_device().get_gpu().get_memory_type(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)}; + VK_CHECK(vkAllocateMemory(device_handle, &mem_alloc, nullptr, &fdm.image.mem)); + VK_CHECK(vkBindImageMemory(device_handle, fdm.image.image, fdm.image.mem, 0)); + + VkImageViewCreateInfo image_view_create_info{ + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = nullptr, + .flags = is_update_fdm_enabled() ? VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT : 0u, + .image = fdm.image.image, + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = VK_FORMAT_R8G8_UNORM, + .components = vkb::initializers::component_mapping(), + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }}; + VK_CHECK(vkCreateImageView(device_handle, &image_view_create_info, nullptr, &fdm.image.view)); + + debug_utils.set_debug_name(device_handle, VK_OBJECT_TYPE_IMAGE_VIEW, get_object_handle(fdm.image.view), "FDM Image View"); +} + +void FragmentDensityMap::prepare_gui() +{ + vkb::CounterSamplingConfig config{ + .mode = vkb::CounterSamplingMode::Continuous, + .speed = 0.1f}; + get_stats().request_stats({ + vkb::StatIndex::frame_times, + vkb::StatIndex::gpu_cycles, + }, + config); + + create_gui(*window, &get_stats(), 15.0f, true); + get_gui().prepare(pipeline_cache, present.render_pass, + {load_shader("uioverlay/uioverlay.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("uioverlay/uioverlay.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}); +} + +void FragmentDensityMap::on_update_ui_overlay(vkb::Drawer &drawer) +{ + if (is_fdm_supported()) + { + drawer.checkbox("Enable FDM", reinterpret_cast(¤t_options.enable_fdm)); + if (is_fdm_enabled()) + { + if (available_options.supports_dynamic_fdm) + { + drawer.checkbox("Update FDM each frame", reinterpret_cast(¤t_options.update_fdm)); + } + else + { + drawer.text("Dynamic FDM is not supported"); + } + drawer.checkbox("Generate FDM with compute", reinterpret_cast(¤t_options.generate_fdm_compute)); + drawer.checkbox("Show FDM", reinterpret_cast(¤t_options.show_fdm)); + drawer.checkbox("Debug FDM", reinterpret_cast(¤t_options.debug_fdm)); + } + } + else + { + drawer.text("FDM is not supported"); + } + if (has_gui()) + { + drawer.checkbox("Show stats", ¤t_options.show_stats); + if (is_show_stats()) + { + get_gui().show_stats(get_stats()); + } + } +} + +std::unique_ptr create_fragment_density_map() +{ + return std::make_unique(); +} diff --git a/samples/extensions/fragment_density_map/fragment_density_map.h b/samples/extensions/fragment_density_map/fragment_density_map.h new file mode 100644 index 0000000000..7ae39bc4f2 --- /dev/null +++ b/samples/extensions/fragment_density_map/fragment_density_map.h @@ -0,0 +1,189 @@ +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "api_vulkan_sample.h" +#include + +class FragmentDensityMap : public ApiVulkanSample +{ + public: + FragmentDensityMap(); + ~FragmentDensityMap() override; + + void prepare_pipelines(); + + // Override basic framework functionality + void build_command_buffers() override; + void render(float delta_time) override; + bool resize(const uint32_t width, const uint32_t height) override; + bool prepare(const vkb::ApplicationOptions &options) override; + void setup_render_pass() override; + void setup_framebuffer() override; + void setup_color(); + void setup_depth_stencil() override; + void setup_samplers(); + void prepare_gui() override; + + void on_update_ui_overlay(vkb::Drawer &drawer) override; + + protected: + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + + private: + struct PipelineData + { + VkPipeline pipeline{VK_NULL_HANDLE}; + VkPipelineLayout pipeline_layout{VK_NULL_HANDLE}; + VkDescriptorSetLayout set_layout{VK_NULL_HANDLE}; + }; + + struct SubmeshData + { + const vkb::sg::SubMesh *submesh; + glm::mat4 world_matrix; + std::unique_ptr vertex_ubo; + vkb::sg::Texture *base_color_texture; + }; + + struct ConfigOptions + { + bool operator==(const ConfigOptions &) const = default; + bool enable_fdm{true}; + bool update_fdm{true}; + bool debug_fdm{false}; + bool show_stats{false}; + bool generate_fdm_compute{false}; + bool show_fdm{false}; + }; + + struct UBOVS + { + glm::mat4 projection; + glm::mat4 modelview; + }; + + struct FDMUBO + { + bool operator==(const FDMUBO &) const = default; + glm::vec4 eye_center{glm::vec4(0.0f)}; + glm::vec4 circle_radius{glm::vec4(0.0f)}; + }; + + struct + { + VkSampler subsampled_nearest{VK_NULL_HANDLE}; + VkSampler nearest{VK_NULL_HANDLE}; + } samplers{}; + + struct + { + bool supports_dynamic_fdm{true}; + bool supports_fdm{false}; + } available_options{}; + + struct + { + ImageData image{}; + struct + { + PipelineData pipeline{}; + VkDescriptorSet set{VK_NULL_HANDLE}; + VkRenderPass render_pass = VK_NULL_HANDLE; + VkFramebuffer framebuffer = VK_NULL_HANDLE; + } generate{}; + + FDMUBO ubo_data{}; + std::unique_ptr ubo; + VkExtent2D texel_size{32, 32}; + VkExtent3D extend{}; + } fdm{}; + + struct + { + ImageData image{}; + VkExtent2D extend{}; + VkFramebuffer framebuffer{VK_NULL_HANDLE}; + VkDescriptorPool descriptor_pool{VK_NULL_HANDLE}; + + PipelineData sky_pipeline{}; + + struct + { + PipelineData pipeline{}; + std::vector descriptor_sets; + } meshes; + } main_pass{}; + + struct + { + PipelineData pipeline{}; + + VkRenderPass render_pass = VK_NULL_HANDLE; + VkDescriptorSet set{VK_NULL_HANDLE}; + } present{}; + + vkb::DebugUtilsExtDebugUtils debug_utils; + + std::unique_ptr sg_scene; + + std::vector scene_data; + + ConfigOptions current_options; + ConfigOptions last_options; + + uint32_t frame_idx{0}; + + void reset_fdm_gpu_data(); + void setup_fragment_density_map(); + + void write_density_map(VkCommandBuffer cmd_buffer); + + bool is_generate_fdm_compute(); + bool is_fdm_supported(); + bool is_fdm_enabled(); + bool is_update_fdm_enabled(); + bool is_show_fdm_enabled(); + bool is_show_stats(); + bool is_debug_fdm_enabled(); + + void update_extents(); + + void load_assets(); + + void update_uniform_buffer(float delta_time); + + void prepare_uniform_buffers_main_pass(); + void setup_descriptor_pool_main_pass(); + void setup_descriptor_set_layout_main_pass(); + void setup_descriptor_set_main_pass(); + + void prepare_uniform_buffers_fdm(); + void setup_additional_descriptor_pool(); + + void setup_descriptor_set_layout_fdm(); + void setup_descriptor_set_fdm(); + + void setup_descriptor_set_layout_present(); + void setup_descriptor_set_present(); + + void destroy_pipeline(PipelineData &pipeline_data); + void destroy_image(ApiVulkanSample::ImageData &image_data); +}; + +std::unique_ptr create_fragment_density_map(); diff --git a/samples/extensions/fragment_shader_barycentric/CMakeLists.txt b/samples/extensions/fragment_shader_barycentric/CMakeLists.txt index 11fe0bb477..58302e74b1 100644 --- a/samples/extensions/fragment_shader_barycentric/CMakeLists.txt +++ b/samples/extensions/fragment_shader_barycentric/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -26,7 +26,12 @@ add_sample( NAME "Fragment shader barycentric" DESCRIPTION "Demonstrate how to use fragment shader barycentric feature, which allows accessing barycentric coordinates for each processed fragment." SHADER_FILES_GLSL - "fragment_shader_barycentric/object.vert" - "fragment_shader_barycentric/object.frag" - "fragment_shader_barycentric/skybox.vert" - "fragment_shader_barycentric/skybox.frag") + "fragment_shader_barycentric/glsl/object.vert" + "fragment_shader_barycentric/glsl/object.frag" + "fragment_shader_barycentric/glsl/skybox.vert" + "fragment_shader_barycentric/glsl/skybox.frag" + SHADER_FILES_SLANG + "fragment_shader_barycentric/slang/object.vert.slang" + "fragment_shader_barycentric/slang/object.frag.slang" + "fragment_shader_barycentric/slang/skybox.vert.slang" + "fragment_shader_barycentric/slang/skybox.frag.slang") diff --git a/samples/extensions/fragment_shader_barycentric/README.adoc b/samples/extensions/fragment_shader_barycentric/README.adoc index d6f79f9526..ac5d3df9f6 100644 --- a/samples/extensions/fragment_shader_barycentric/README.adoc +++ b/samples/extensions/fragment_shader_barycentric/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -29,7 +29,7 @@ Fragment shader barycentric feature provides support for accessing the barycentr == Overview -The https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_fragment_shader_barycentric.html[VK_KHR_fragment_shader_barycentric] extension is based on https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_NV_fragment_shader_barycentric.html[VK_NV_fragment_shader_barycentric]. +The https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_fragment_shader_barycentric.html[VK_KHR_fragment_shader_barycentric] extension is based on https://registry.khronos.org/vulkan/specs/latest/man/html/VK_NV_fragment_shader_barycentric.html[VK_NV_fragment_shader_barycentric]. The extension provides access to additional built-in variables and decorations: @@ -50,7 +50,7 @@ The extension provides access to additional built-in variables and decorations: |=== The built-in fragment shader input variables `gl_BaryCoordEXT` and `gl_BaryCoordNoPerspEXT` are three-component floating-point vectors that provide the barycentric coordinates for the fragment. -The values for these built-ins are derived as described in https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#interfaces-builtin-variables[the Vulkan API Specifications]. +The values for these built-ins are derived as described in https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-builtin-variables[the Vulkan API Specifications]. The built-in variables hold barycentric weights for the fragment produced using: * perspective interpolation: `gl_BaryCoordEXT` @@ -64,8 +64,8 @@ layout(location = 0) pervertexEXT in vec4 perVertexAttr[]; ---- Each array element corresponds to one of the vertices of the primitive that produced the fragment. -The order of the vertices is defined in https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#primsrast-barycentric[the Vulkan API Specifications]. -Interpolated values are not available for inputs declared with the https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#shaders-interpolation-decorations-pervertexkhr[`pervertexEXT`]. +The order of the vertices is defined in https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#primsrast-barycentric[the Vulkan API Specifications]. +Interpolated values are not available for inputs declared with the https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#shaders-interpolation-decorations-pervertexkhr[`pervertexEXT`]. The fragment shader barycentric sample demonstrates feature usage by applying different effects on a cube. The effects are implemented using the `pervertexEXT` decoration and built-in variables `gl_BaryCoordEXT` and `gl_BaryCoordNoPerspEXT`. @@ -80,8 +80,8 @@ The following effects are available from the GUI: == Enabling the Extension -Enabling the fragment shader barycentric feature is done using the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR.html[`VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR`] structure, where `fragmentShaderBarycentric` indicates barycentric support in fragment shaders. -The structure should be passed to `vkGetPhysicalDeviceFeatures2` in the pNext member of the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceFeatures2.html[`VkPhysicalDeviceFeatures2`] structure. +Enabling the fragment shader barycentric feature is done using the https://registry.khronos.org/vulkan/specs/latest/man/html/VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR.html[`VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR`] structure, where `fragmentShaderBarycentric` indicates barycentric support in fragment shaders. +The structure should be passed to `vkGetPhysicalDeviceFeatures2` in the pNext member of the https://registry.khronos.org/vulkan/specs/latest/man/html/VkPhysicalDeviceFeatures2.html[`VkPhysicalDeviceFeatures2`] structure. [,C++] ---- diff --git a/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.cpp b/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.cpp index c8d6f86778..55a915033b 100644 --- a/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.cpp +++ b/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -252,8 +252,8 @@ void FragmentShaderBarycentric::create_pipeline() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("fragment_shader_barycentric/skybox.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("fragment_shader_barycentric/skybox.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("fragment_shader_barycentric", "skybox.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("fragment_shader_barycentric", "skybox.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Use the pNext to point to the rendering create struct VkGraphicsPipelineCreateInfo graphics_create{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; @@ -275,8 +275,8 @@ void FragmentShaderBarycentric::create_pipeline() VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &graphics_create, VK_NULL_HANDLE, &pipelines.skybox)); // Object pipeline - shader_stages[0] = load_shader("fragment_shader_barycentric/object.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("fragment_shader_barycentric/object.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("fragment_shader_barycentric", "object.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("fragment_shader_barycentric", "object.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Flip cull mode rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; @@ -383,15 +383,12 @@ void FragmentShaderBarycentric::on_update_ui_overlay(vkb::Drawer &drawer) } /** - * @fn void FragmentShaderBarycentric::request_gpu_features(vkb::PhysicalDevice &gpu) + * @fn void FragmentShaderBarycentric::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) * @brief Enabling features related to Vulkan extensions */ -void FragmentShaderBarycentric::request_gpu_features(vkb::PhysicalDevice &gpu) +void FragmentShaderBarycentric::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, - fragmentShaderBarycentric); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR, fragmentShaderBarycentric); if (gpu.get_features().samplerAnisotropy) { diff --git a/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.h b/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.h index 65441f7fa7..63f8c6c0cb 100644 --- a/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.h +++ b/samples/extensions/fragment_shader_barycentric/fragment_shader_barycentric.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -71,7 +71,7 @@ class FragmentShaderBarycentric : public ApiVulkanSample void render(float delta_time) override; void build_command_buffers() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; private: diff --git a/samples/extensions/fragment_shading_rate/CMakeLists.txt b/samples/extensions/fragment_shading_rate/CMakeLists.txt index 2db27c05da..2412abc54b 100644 --- a/samples/extensions/fragment_shading_rate/CMakeLists.txt +++ b/samples/extensions/fragment_shading_rate/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2024, Sascha Willems +# Copyright (c) 2020-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -31,4 +31,7 @@ add_sample_with_tags( SHADER_FILES_HLSL "fragment_shading_rate/hlsl/scene.vert.hlsl" "fragment_shading_rate/hlsl/scene.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_fragment_shading_rate") + DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_fragment_shading_rate" + SHADER_FILES_SLANG + "fragment_shading_rate/slang/scene.vert.slang" + "fragment_shading_rate/slang/scene.frag.slang") diff --git a/samples/extensions/fragment_shading_rate/README.adoc b/samples/extensions/fragment_shading_rate/README.adoc index fa6f0c96ed..beb99a1cc7 100644 --- a/samples/extensions/fragment_shading_rate/README.adoc +++ b/samples/extensions/fragment_shading_rate/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2023, The Khronos Group +- Copyright (c) 2019-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] Uses a special framebuffer attachment to control fragment shading rates for different framebuffer regions. This allows explicit control over the number of fragment shader invocations for each pixel covered by a fragment, which is e.g. diff --git a/samples/extensions/fragment_shading_rate/fragment_shading_rate.cpp b/samples/extensions/fragment_shading_rate/fragment_shading_rate.cpp index 83a23064ef..388ac54a9b 100644 --- a/samples/extensions/fragment_shading_rate/fragment_shading_rate.cpp +++ b/samples/extensions/fragment_shading_rate/fragment_shading_rate.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Sascha Willems +/* Copyright (c) 2020-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -48,14 +48,11 @@ FragmentShadingRate::~FragmentShadingRate() } } -void FragmentShadingRate::request_gpu_features(vkb::PhysicalDevice &gpu) +void FragmentShadingRate::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable the shading rate attachment feature required by this sample // These are passed to device creation via a pNext structure chain - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceFragmentShadingRateFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, - attachmentFragmentShadingRate); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceFragmentShadingRateFeaturesKHR, attachmentFragmentShadingRate); // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -104,7 +101,7 @@ void FragmentShadingRate::create_shading_rate_attachment() VkMemoryAllocateInfo memory_allocate_info{}; memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &shading_rate_image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), shading_rate_image.image, shading_rate_image.memory, 0)); @@ -632,8 +629,8 @@ void FragmentShadingRate::prepare_pipelines() pipeline_create_info.renderPass = render_pass; // Skysphere - shader_stages[0] = load_shader("fragment_shading_rate", "scene.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("fragment_shading_rate", "scene.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("fragment_shading_rate", "scene.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("fragment_shading_rate", "scene.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.skysphere)); // Objects diff --git a/samples/extensions/fragment_shading_rate/fragment_shading_rate.h b/samples/extensions/fragment_shading_rate/fragment_shading_rate.h index cfb6d28d62..ec89b6b306 100644 --- a/samples/extensions/fragment_shading_rate/fragment_shading_rate.h +++ b/samples/extensions/fragment_shading_rate/fragment_shading_rate.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Sascha Willems +/* Copyright (c) 2020-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -84,7 +84,7 @@ class FragmentShadingRate : public ApiVulkanSample FragmentShadingRate(); ~FragmentShadingRate(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void create_shading_rate_attachment(); void invalidate_shading_rate_attachment(); void setup_render_pass() override; diff --git a/samples/extensions/fragment_shading_rate_dynamic/README.adoc b/samples/extensions/fragment_shading_rate_dynamic/README.adoc index bd78bbc7d9..5758792790 100644 --- a/samples/extensions/fragment_shading_rate_dynamic/README.adoc +++ b/samples/extensions/fragment_shading_rate_dynamic/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2022-2023, Holochip +- Copyright (c) 2022-2025, Holochip - - SPDX-License-Identifier: Apache-2.0 - @@ -28,8 +28,8 @@ The KHR fragment shading rate extension introduces the ability to selectively re This can be useful when rendering at very high resolutions or when the frequency content is not evenly spread through the rendered image. This tutorial demonstrates one way of controlling that sample rate by estimating the frequency content of each pixel of the rendered image. -The fragment shading rate extension can be enabled through the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] device extension and the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkPhysicalDeviceFragmentShadingRateFeaturesKHR.html[`VkPhysicalDeviceFragmentShadingRateFeaturesKHR`] device features. -This sample demonstrates the attachment capability, in which the render pass directly references the shading rate image through a https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkFragmentShadingRateAttachmentInfoKHR.html[`VkFragmentShadingRateAttachmentInfoKHR`] struct attached to the `.pNext` of a sub-pass. +The fragment shading rate extension can be enabled through the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_fragment_shading_rate.html[`VK_KHR_fragment_shading_rate`] device extension and the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkPhysicalDeviceFragmentShadingRateFeaturesKHR.html[`VkPhysicalDeviceFragmentShadingRateFeaturesKHR`] device features. +This sample demonstrates the attachment capability, in which the render pass directly references the shading rate image through a https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkFragmentShadingRateAttachmentInfoKHR.html[`VkFragmentShadingRateAttachmentInfoKHR`] struct attached to the `.pNext` of a sub-pass. The image below shows the scene from this sample. Note the areas of high image variation in the center of each cube face, and the areas of low image variation in the sky and plain corners of each cube face. @@ -40,7 +40,7 @@ image::./rendered.png[Rendered image] When used as an attachment, each pixel within the shading rate image controls a "texel", or fixed region within the output image, specified by `shadingRateAttachmentTexelSize`. For example, each pixel in the shading rate image might control the shading rate of a 4x4 texel within the rendered image, since all output pixels of the texel are shaded at the same rate, the shading rate image has a lower resolution. -The number and type of possible shading rates is controlled by the device and can be queried through the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceFragmentShadingRatesKHR.html[`vkGetPhysicalDeviceFragmentShadingRatesKHR`] function, and may include shading rates that vary in both the x- and y-directions, for instance 1x2 or 4x2 pixel texels. +The number and type of possible shading rates is controlled by the device and can be queried through the https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceFragmentShadingRatesKHR.html[`vkGetPhysicalDeviceFragmentShadingRatesKHR`] function, and may include shading rates that vary in both the x- and y-directions, for instance 1x2 or 4x2 pixel texels. These supported shading rate values are provided to the "compute shader" when determining the optimal shading rate. This sample demonstrates how to use a dynamic shading rate that responds to the frequency content of the image. diff --git a/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.cpp b/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.cpp index 153560c91f..a6cbcf01fc 100644 --- a/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.cpp +++ b/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Holochip +/* Copyright (c) 2021-2025, Holochip * * SPDX-License-Identifier: Apache-2.0 * @@ -60,18 +60,12 @@ FragmentShadingRateDynamic::~FragmentShadingRateDynamic() } } -void FragmentShadingRateDynamic::request_gpu_features(vkb::PhysicalDevice &gpu) +void FragmentShadingRateDynamic::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable the shading rate attachment feature required by this sample // These are passed to device creation via a pNext structure chain - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceFragmentShadingRateFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, - attachmentFragmentShadingRate); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceFragmentShadingRateFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, - pipelineFragmentShadingRate); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceFragmentShadingRateFeaturesKHR, attachmentFragmentShadingRate); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceFragmentShadingRateFeaturesKHR, pipelineFragmentShadingRate); // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -173,47 +167,41 @@ void FragmentShadingRateDynamic::create_shading_rate_attachment() submit.commandBufferCount = 1; submit.pCommandBuffers = &cmd; - auto fence = get_device().request_fence(); + auto fence = get_device().get_fence_pool().request_fence(); VK_CHECK(vkQueueSubmit(queue, 1, &submit, fence)); VK_CHECK(vkWaitForFences(get_device().get_handle(), 1, &fence, VK_TRUE, UINT64_MAX)); - shading_rate_image_view = std::make_unique(*shading_rate_image, VK_IMAGE_VIEW_TYPE_2D, - VK_FORMAT_R8_UINT); - shading_rate_image_compute_view = std::make_unique(*shading_rate_image_compute, - VK_IMAGE_VIEW_TYPE_2D, - VK_FORMAT_R8_UINT); + shading_rate_image_view = std::make_unique(*shading_rate_image, VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8_UINT); + shading_rate_image_compute_view = std::make_unique(*shading_rate_image_compute, VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8_UINT); // Create an attachment to store the frequency content of the rendered image during the render pass VkExtent3D frequency_image_extent{}; frequency_image_extent.width = this->width; frequency_image_extent.height = this->height; frequency_image_extent.depth = 1; - frequency_content_image = std::make_unique(get_device(), - frequency_image_extent, - VK_FORMAT_R8G8_UINT, - VK_IMAGE_USAGE_STORAGE_BIT | - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | - VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, - VMA_MEMORY_USAGE_GPU_ONLY); - frequency_content_image_view = std::make_unique(*frequency_content_image, - VK_IMAGE_VIEW_TYPE_2D, - VK_FORMAT_R8G8_UINT); + frequency_content_image = + std::make_unique(get_device(), + frequency_image_extent, + VK_FORMAT_R8G8_UINT, + VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, + VMA_MEMORY_USAGE_GPU_ONLY); + frequency_content_image_view = std::make_unique(*frequency_content_image, VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8_UINT); { - auto &_cmd = get_device().request_command_buffer(); - _cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + auto _cmd = get_device().get_command_pool().request_command_buffer(); + _cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); auto _memory_barrier = vkb::ImageMemoryBarrier(); _memory_barrier.dst_access_mask = 0; _memory_barrier.src_access_mask = 0; _memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; _memory_barrier.new_layout = VK_IMAGE_LAYOUT_GENERAL; - _cmd.image_memory_barrier(*shading_rate_image_compute_view, _memory_barrier); - _cmd.image_memory_barrier(*frequency_content_image_view, _memory_barrier); - _cmd.end(); + _cmd->image_memory_barrier(*shading_rate_image_compute_view, _memory_barrier); + _cmd->image_memory_barrier(*frequency_content_image_view, _memory_barrier); + _cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - auto _fence = get_device().request_fence(); - queue.submit(_cmd, _fence); + auto _fence = get_device().get_fence_pool().request_fence(); + queue.submit(*_cmd, _fence); VK_CHECK(vkWaitForFences(get_device().get_handle(), 1, &_fence, VK_TRUE, UINT64_MAX)); } } @@ -765,7 +753,7 @@ void FragmentShadingRateDynamic::create_compute_pipeline() // Pipeline VkComputePipelineCreateInfo pipeline_create_info = vkb::initializers::compute_pipeline_create_info( compute.pipeline_layout); - pipeline_create_info.stage = load_shader("fragment_shading_rate_dynamic/generate_shading_rate.comp", + pipeline_create_info.stage = load_shader("fragment_shading_rate_dynamic/generate_shading_rate.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, VK_NULL_HANDLE, &compute.pipeline)); @@ -1014,8 +1002,8 @@ void FragmentShadingRateDynamic::prepare_pipelines() pipeline_create_info.subpass = 0; // Sky-sphere - shader_stages[0] = load_shader("fragment_shading_rate_dynamic/scene.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("fragment_shading_rate_dynamic/scene.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("fragment_shading_rate_dynamic/scene.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("fragment_shading_rate_dynamic/scene.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.skysphere)); @@ -1120,9 +1108,8 @@ bool FragmentShadingRateDynamic::prepare(const vkb::ApplicationOptions &options) const auto enabled_instance_extensions = get_instance().get_extensions(); debug_utils_supported = - std::find_if(enabled_instance_extensions.cbegin(), enabled_instance_extensions.cend(), [](const char *ext) { - return strcmp(ext, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0; - }) != enabled_instance_extensions.cend(); + std::ranges::find_if(enabled_instance_extensions, [](const char *ext) { return strcmp(ext, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0; }) != + enabled_instance_extensions.cend(); camera.type = vkb::CameraType::FirstPerson; camera.set_position(glm::vec3(0.0f, 0.0f, -4.0f)); diff --git a/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.h b/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.h index 5e4fe24d6a..25ebccb3b2 100644 --- a/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.h +++ b/samples/extensions/fragment_shading_rate_dynamic/fragment_shading_rate_dynamic.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Holochip +/* Copyright (c) 2021-2025, Holochip * * SPDX-License-Identifier: Apache-2.0 * @@ -31,7 +31,7 @@ class FragmentShadingRateDynamic : public ApiVulkanSample ~FragmentShadingRateDynamic() override; bool prepare(const vkb::ApplicationOptions &options) override; bool resize(uint32_t new_width, uint32_t new_height) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void render(float delta_time) override; void build_command_buffers() override; void setup_framebuffer() override; diff --git a/samples/extensions/full_screen_exclusive/full_screen_exclusive.cpp b/samples/extensions/full_screen_exclusive/full_screen_exclusive.cpp index 6d92b7ab0c..4e93de8b82 100644 --- a/samples/extensions/full_screen_exclusive/full_screen_exclusive.cpp +++ b/samples/extensions/full_screen_exclusive/full_screen_exclusive.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ #include "full_screen_exclusive.h" #include "filesystem/legacy.h" -#include "glsl_compiler.h" #include "platform/window.h" #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) @@ -70,60 +69,6 @@ bool FullScreenExclusive::validate_extensions(const std::vector &r return true; } -bool FullScreenExclusive::validate_layers(const std::vector &required, const std::vector &available) -{ - for (auto extension : required) - { - bool found = false; - - for (auto &available_extension : available) - { - if (strcmp(available_extension.layerName, extension) == 0) - { - found = true; - break; - } - } - - if (!found) - { - return false; - } - } - - return true; -} - -VkShaderStageFlagBits FullScreenExclusive::find_shader_stage(const std::string &ext) -{ - if (ext == "vert") - { - return VK_SHADER_STAGE_VERTEX_BIT; - } - else if (ext == "frag") - { - return VK_SHADER_STAGE_FRAGMENT_BIT; - } - else if (ext == "comp") - { - return VK_SHADER_STAGE_COMPUTE_BIT; - } - else if (ext == "geom") - { - return VK_SHADER_STAGE_GEOMETRY_BIT; - } - else if (ext == "tesc") - { - return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; - } - else if (ext == "tese") - { - return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; - } - - throw std::runtime_error("No Vulkan shader stage found for the file extension name."); -} - void FullScreenExclusive::init_instance(const std::vector &required_instance_extensions, const std::vector &required_validation_layers) { LOGI("Initializing vulkan instance.") @@ -161,42 +106,40 @@ void FullScreenExclusive::init_instance(const std::vector &require { throw std::runtime_error("Required instance extensions are missing."); } + + std::vector requested_instance_layers(required_validation_layers); + +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + char const *validationLayer = "VK_LAYER_KHRONOS_validation"; + uint32_t instance_layer_count; VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr)); - std::vector supported_validation_layers(instance_layer_count); - VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_validation_layers.data())); - std::vector requested_validation_layers(required_validation_layers); -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) - // Determine the optimal validation layers to enable that are necessary for useful debugging - std::vector optimal_validation_layers = vkb::get_optimal_validation_layers(supported_validation_layers); - requested_validation_layers.insert(requested_validation_layers.end(), optimal_validation_layers.begin(), optimal_validation_layers.end()); -#endif + std::vector supported_instance_layers(instance_layer_count); + VK_CHECK(vkEnumerateInstanceLayerProperties(&instance_layer_count, supported_instance_layers.data())); - if (validate_layers(requested_validation_layers, supported_validation_layers)) + if (std::ranges::any_of(supported_instance_layers, [&validationLayer](auto const &lp) { return strcmp(lp.layerName, validationLayer) == 0; })) { - LOGI("Enabled Validation Layers:") - for (const auto &layer : requested_validation_layers) - { - LOGI(" \t{}", layer) - } + requested_instance_layers.push_back(validationLayer); + LOGI("Enabled Validation Layer {}", validationLayer); } else { - throw std::runtime_error("Required validation layers are missing."); + LOGW("Validation Layer {} is not available", validationLayer); } +#endif VkApplicationInfo app{VK_STRUCTURE_TYPE_APPLICATION_INFO}; app.pApplicationName = "Full Screen Exclusive"; app.pEngineName = "Vulkan Samples"; - app.apiVersion = VK_MAKE_VERSION(1, 0, 0); + app.apiVersion = VK_API_VERSION_1_1; VkInstanceCreateInfo instance_info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; instance_info.pApplicationInfo = &app; instance_info.enabledExtensionCount = vkb::to_u32(active_instance_extensions.size()); instance_info.ppEnabledExtensionNames = active_instance_extensions.data(); - instance_info.enabledLayerCount = vkb::to_u32(requested_validation_layers.size()); - instance_info.ppEnabledLayerNames = requested_validation_layers.data(); + instance_info.enabledLayerCount = vkb::to_u32(requested_instance_layers.size()); + instance_info.ppEnabledLayerNames = requested_instance_layers.data(); #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; @@ -277,7 +220,7 @@ void FullScreenExclusive::init_device(const std::vector &required_ throw std::runtime_error("Required device extensions are missing, will try without."); } - float queue_priority = 1.0f; + float queue_priority = 0.5f; VkDeviceQueueCreateInfo queue_info{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO}; queue_info.queueFamilyIndex = context.graphics_queue_index; @@ -552,26 +495,12 @@ void FullScreenExclusive::init_render_pass() VkShaderModule FullScreenExclusive::load_shader_module(const char *path) const { - vkb::GLSLCompiler glsl_compiler; - - auto buffer = vkb::fs::read_shader_binary(path); - - std::string file_ext = path; - - file_ext = file_ext.substr(file_ext.find_last_of('.') + 1); - - std::vector spirv; - std::string info_log; - - if (!glsl_compiler.compile_to_spirv(find_shader_stage(file_ext), buffer, "main", {}, spirv, info_log)) - { - LOGE("Failed to compile shader, Error: {}", info_log.c_str()) - return VK_NULL_HANDLE; - } + std::vector spirv = vkb::fs::read_shader_binary_u32(path); - VkShaderModuleCreateInfo module_info{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO}; - module_info.codeSize = spirv.size() * sizeof(uint32_t); - module_info.pCode = spirv.data(); + VkShaderModuleCreateInfo module_info{ + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = spirv.size() * sizeof(uint32_t), + .pCode = spirv.data()}; VkShaderModule shader_module; VK_CHECK(vkCreateShaderModule(context.device, &module_info, nullptr, &shader_module)); @@ -620,12 +549,12 @@ void FullScreenExclusive::init_pipeline() shader_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; - shader_stages[0].module = load_shader_module("triangle.vert"); + shader_stages[0].module = load_shader_module("triangle.vert.spv"); shader_stages[0].pName = "main"; shader_stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; - shader_stages[1].module = load_shader_module("triangle.frag"); + shader_stages[1].module = load_shader_module("triangle.frag.spv"); shader_stages[1].pName = "main"; VkGraphicsPipelineCreateInfo pipe{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; @@ -895,7 +824,7 @@ bool FullScreenExclusive::prepare(const vkb::ApplicationOptions &options) init_instance({VK_KHR_SURFACE_EXTENSION_NAME}, {}); - vk_instance = std::make_unique(context.instance); + vk_instance = std::make_unique(context.instance); context.surface = window->create_surface(*vk_instance); if (!context.surface) diff --git a/samples/extensions/full_screen_exclusive/full_screen_exclusive.h b/samples/extensions/full_screen_exclusive/full_screen_exclusive.h index b428478682..d10450906a 100644 --- a/samples/extensions/full_screen_exclusive/full_screen_exclusive.h +++ b/samples/extensions/full_screen_exclusive/full_screen_exclusive.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -75,8 +75,8 @@ class FullScreenExclusive : public vkb::Application }; private: - Context context{}; - std::unique_ptr vk_instance{}; + Context context{}; + std::unique_ptr vk_instance{}; HWND HWND_application_window{}; // sync the application HWND handle bool is_windowed = true; // this is to tell if the application window is already set in the desired mode @@ -98,27 +98,25 @@ class FullScreenExclusive : public vkb::Application public: FullScreenExclusive() = default; ~FullScreenExclusive() override; - void initialize_windows(); - bool prepare(const vkb::ApplicationOptions &options) override; // This syncs all required extensions and booleans is a Windows platform is detected - void update(float delta_time) override; - bool resize(uint32_t width, uint32_t height) override; - static bool validate_extensions(const std::vector &required, const std::vector &available); - static bool validate_layers(const std::vector &required, const std::vector &available); - static VkShaderStageFlagBits find_shader_stage(const std::string &ext); - void init_instance(const std::vector &required_instance_extensions, const std::vector &required_validation_layers); - void init_device(const std::vector &required_device_extensions); - void init_per_frame(PerFrame &per_frame) const; - void teardown_per_frame(PerFrame &per_frame) const; - void init_swapchain(); - void init_render_pass(); - VkShaderModule load_shader_module(const char *path) const; - void init_pipeline(); - VkResult acquire_next_image(uint32_t *image); - void render_triangle(uint32_t swapchain_index); - VkResult present_image(uint32_t index); - void init_framebuffers(); - void teardown_framebuffers(); - void teardown(); + void initialize_windows(); + bool prepare(const vkb::ApplicationOptions &options) override; // This syncs all required extensions and booleans is a Windows platform is detected + void update(float delta_time) override; + bool resize(uint32_t width, uint32_t height) override; + static bool validate_extensions(const std::vector &required, const std::vector &available); + void init_instance(const std::vector &required_instance_extensions, const std::vector &required_validation_layers); + void init_device(const std::vector &required_device_extensions); + void init_per_frame(PerFrame &per_frame) const; + void teardown_per_frame(PerFrame &per_frame) const; + void init_swapchain(); + void init_render_pass(); + VkShaderModule load_shader_module(const char *path) const; + void init_pipeline(); + VkResult acquire_next_image(uint32_t *image); + void render_triangle(uint32_t swapchain_index); + VkResult present_image(uint32_t index); + void init_framebuffers(); + void teardown_framebuffers(); + void teardown(); }; std::unique_ptr create_full_screen_exclusive(); diff --git a/samples/extensions/graphics_pipeline_library/CMakeLists.txt b/samples/extensions/graphics_pipeline_library/CMakeLists.txt index 5e65d94eb4..067adce5e2 100644 --- a/samples/extensions/graphics_pipeline_library/CMakeLists.txt +++ b/samples/extensions/graphics_pipeline_library/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, Sascha Willems +# Copyright (c) 2022-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample( "graphics_pipeline_library/glsl/uber.frag" SHADER_FILES_HLSL "graphics_pipeline_library/hlsl/shared.vert.hlsl" - "graphics_pipeline_library/hlsl/uber.frag.hlsl") \ No newline at end of file + "graphics_pipeline_library/hlsl/uber.frag.hlsl" + SHADER_FILES_SLANG + "graphics_pipeline_library/slang/shared.vert.slang" + "graphics_pipeline_library/slang/uber.frag.slang") \ No newline at end of file diff --git a/samples/extensions/graphics_pipeline_library/README.adoc b/samples/extensions/graphics_pipeline_library/README.adoc index 1e88c2f50f..6f6d0d3b1f 100644 --- a/samples/extensions/graphics_pipeline_library/README.adoc +++ b/samples/extensions/graphics_pipeline_library/README.adoc @@ -1,5 +1,6 @@ //// -- Copyright (c) 2022-2023, Sascha Willems +- Copyright (c) 2022-2025, Sascha Willems +- Copyright (c) 2025, LunarG, Inc. - - SPDX-License-Identifier: Apache-2.0 - @@ -25,7 +26,7 @@ endif::[] == Overview -The https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_graphics_pipeline_library.html[`VK_EXT_graphics_pipeline_library`] extensions allows separate compilation of different parts of the graphics pipeline. +The https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_graphics_pipeline_library.html[`VK_EXT_graphics_pipeline_library`] extensions allows separate compilation of different parts of the graphics pipeline. With this it's now possible to split up the monolithic pipeline creation into different steps and re-use common parts shared across different pipelines. Compared to monolithic pipeline state, this results in faster pipeline creation times, making this extension a good fit for applications and games that do a lot of pipeline creation at runtime. @@ -34,10 +35,10 @@ Compared to monolithic pipeline state, this results in faster pipeline creation As noted above, the monolithic pipeline state has been split into distinct parts that can be compiled independently: -* https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#pipeline-graphics-subsets-vertex-input[Vertex Input Interface] -* https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#pipeline-graphics-subsets-pre-rasterization[Pre-Rasterization Shaders] -* https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#pipeline-graphics-subsets-fragment-shader[Fragment Shader] -* https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#pipeline-graphics-subsets-fragment-output[Fragment Output Interface] +* https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#pipeline-graphics-subsets-vertex-input[Vertex Input Interface] +* https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#pipeline-graphics-subsets-pre-rasterization[Pre-Rasterization Shaders] +* https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#pipeline-graphics-subsets-fragment-shader[Fragment Shader] +* https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#pipeline-graphics-subsets-fragment-output[Fragment Output Interface] == Creating pipeline libraries @@ -144,10 +145,31 @@ image::./images/sample.jpg[Sample] This sample demonstrates that functionality by creating the shared vertex input interface, pre-rasterization shader state and fragment output interface parts only once up-front, and then re-uses them to create pipelines with customized fragment shaders using random lighting models at runtime. Pipelines are created in a background thread and once they're created, command buffers are updated to display a mesh using the new pipeline. +== Independent Descriptor Sets + +While this sample doesn't use it, this extension has a `VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT` flag that can be used. + +Imagine a situation where the vertex and fragment stage accesses two different descriptor sets: + +[source,glsl] +---- +// Vertex Shader +layout(set = 0) UBO_X; + +// Fragment Shader +layout(set = 1) UBO_Y; +---- + +Normally when compiling a pipeline, both stages are together and internally a driver will reserve 2 separate descriptor slots for `UBO_X` and `UBO_Y`. +When using graphics pipeline libraries, the driver will see the fragment shader only uses a single descriptor set. +It might internally map it to `set 0`, but when linking the two libraries, there will be a collision. +The `VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT` flag ensures the driver will be able to handle this case and not have any collisions. +There are some extra constraints when using this flag, but the Validation Layers will detect them for you. + == Additional resources * https://www.khronos.org/blog/reducing-draw-time-hitching-with-vk-ext-graphics-pipeline-library[Reducing Draw Time Hitching with VK_EXT_graphics_pipeline_library] -* https://github.com/KhronosGroup/Vulkan-Docs/blob/main/proposals/VK_EXT_graphics_pipeline_library.adoc[Extension proposal] +* https://docs.vulkan.org/features/latest/features/proposals/VK_EXT_graphics_pipeline_library.html[Extension proposal] == Conclusion diff --git a/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.cpp b/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.cpp index 5d3a0538bb..ee986fa2f4 100644 --- a/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.cpp +++ b/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Sascha Willems +/* Copyright (c) 2022-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -27,7 +27,6 @@ #include "graphics_pipeline_library.h" #include "scene_graph/components/sub_mesh.h" -#include void GraphicsPipelineLibrary::pipeline_creation_threadfn() { @@ -59,13 +58,10 @@ GraphicsPipelineLibrary::GraphicsPipelineLibrary() add_device_extension(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME); } -void GraphicsPipelineLibrary::request_gpu_features(vkb::PhysicalDevice &gpu) +void GraphicsPipelineLibrary::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable extension features required by this sample - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, - graphicsPipelineLibrary); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT, graphicsPipelineLibrary); } GraphicsPipelineLibrary::~GraphicsPipelineLibrary() @@ -221,30 +217,7 @@ void GraphicsPipelineLibrary::setup_descriptor_sets() // Compiling shaders can be simplified with the new extension, so we only require code to generate the SPIR-V in this sample void GraphicsPipelineLibrary::load_shader(const std::string shader, VkShaderStageFlagBits shader_stage, std::vector &spirv) { - switch (get_shading_language()) - { - case vkb::ShadingLanguage::GLSL: - { - // The framework currently compiles GLSL shaders at runtime - // Note: this can be reworked once offline compilation for GLSL shaders is added - vkb::GLSLCompiler glsl_compiler; - auto buffer = vkb::fs::read_shader_binary("graphics_pipeline_library/glsl/" + shader); - std::string info_log; - if (!glsl_compiler.compile_to_spirv(shader_stage, buffer, "main", {}, spirv, info_log)) - { - LOGE("Failed to compile shader, Error: {}", info_log.c_str()); - throw std::runtime_error{"Failed to compile shader"}; - } - break; - } - case vkb::ShadingLanguage::HLSL: - { - // HLSL shaders are compiled offline, so we can simply load the SPIR-V from disk - auto buffer = vkb::fs::read_shader_binary("graphics_pipeline_library/hlsl/" + shader + ".spv"); - spirv = std::vector(reinterpret_cast(buffer.data()), reinterpret_cast(buffer.data()) + buffer.size() / sizeof(uint32_t)); - break; - } - } + spirv = vkb::fs::read_shader_binary_u32("graphics_pipeline_library/" + get_shader_folder() + "/" + shader); } // This function pre-built shared pipeline parts ("pipeline library") @@ -307,7 +280,7 @@ void GraphicsPipelineLibrary::prepare_pipeline_library() // Using the pipeline library extension, we can skip the pipeline shader module creation and directly pass the shader code to the pipeline std::vector spirv; - load_shader("shared.vert", VK_SHADER_STAGE_VERTEX_BIT, spirv); + load_shader("shared.vert.spv", VK_SHADER_STAGE_VERTEX_BIT, spirv); VkShaderModuleCreateInfo shader_module_create_info{}; shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; @@ -370,7 +343,7 @@ void GraphicsPipelineLibrary::prepare_new_pipeline() // Using the pipeline library extension, we can skip the pipeline shader module creation and directly pass the shader code to the pipeline std::vector spirv; - load_shader("uber.frag", VK_SHADER_STAGE_FRAGMENT_BIT, spirv); + load_shader("uber.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT, spirv); VkShaderModuleCreateInfo shader_module_create_info{}; shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; diff --git a/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.h b/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.h index ae3b65272e..60dc4833b1 100644 --- a/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.h +++ b/samples/extensions/graphics_pipeline_library/graphics_pipeline_library.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -72,7 +72,7 @@ class GraphicsPipelineLibrary : public ApiVulkanSample GraphicsPipelineLibrary(); ~GraphicsPipelineLibrary(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void load_assets(); void setup_descriptor_pool(); diff --git a/samples/extensions/gshader_to_mshader/CMakeLists.txt b/samples/extensions/gshader_to_mshader/CMakeLists.txt index fb48c09f34..d199dae029 100644 --- a/samples/extensions/gshader_to_mshader/CMakeLists.txt +++ b/samples/extensions/gshader_to_mshader/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -26,10 +26,21 @@ add_sample( NAME "Geometry shader to mesh shader" DESCRIPTION "Sample shows migration from geometry shader pipeline to mesh shader one" SHADER_FILES_GLSL - "gshader_to_mshader/gshader_to_mshader.vert" - "gshader_to_mshader/gshader_to_mshader.frag" - "gshader_to_mshader/gshader_to_mshader.geom" - "gshader_to_mshader/gshader_to_mshader.mesh" - "gshader_to_mshader/gshader_to_mshader_base.frag" - "gshader_to_mshader/gshader_to_mshader_base.vert" - "gshader_to_mshader/gshader_to_mshader_mesh.frag") + "gshader_to_mshader/glsl/gshader_to_mshader.vert" + "gshader_to_mshader/glsl/gshader_to_mshader.frag" + "gshader_to_mshader/glsl/gshader_to_mshader.geom" + "gshader_to_mshader/glsl/gshader_to_mshader.mesh" + "gshader_to_mshader/glsl/gshader_to_mshader_base.frag" + "gshader_to_mshader/glsl/gshader_to_mshader_base.vert" + "gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" + SHADER_FILES_SLANG + "gshader_to_mshader/slang/gshader_to_mshader.vert.slang" + "gshader_to_mshader/slang/gshader_to_mshader.frag.slang" + "gshader_to_mshader/slang/gshader_to_mshader.geom.slang" + "gshader_to_mshader/slang/gshader_to_mshader.mesh.slang" + "gshader_to_mshader/slang/gshader_to_mshader_base.frag.slang" + "gshader_to_mshader/slang/gshader_to_mshader_base.vert.slang" + "gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.slang" + ) diff --git a/samples/extensions/gshader_to_mshader/gshader_to_mshader.cpp b/samples/extensions/gshader_to_mshader/gshader_to_mshader.cpp index e743cba7bd..7c96d70439 100644 --- a/samples/extensions/gshader_to_mshader/gshader_to_mshader.cpp +++ b/samples/extensions/gshader_to_mshader/gshader_to_mshader.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Mobica Limited +/* Copyright (c) 2024-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -25,7 +25,6 @@ GshaderToMshader::GshaderToMshader() add_device_extension(VK_EXT_MESH_SHADER_EXTENSION_NAME); add_device_extension(VK_KHR_SPIRV_1_4_EXTENSION_NAME); add_device_extension(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); } GshaderToMshader::~GshaderToMshader() @@ -135,10 +134,11 @@ void GshaderToMshader::update_uniform_buffers() { for (auto &ubo : ubos) { - ubo.proj = camera.matrices.perspective; - ubo.view = camera.matrices.view; - ubo.model = glm::mat4(1.f); - ubo.model = glm::rotate(ubo.model, glm::pi(), glm::vec3(0, 0, 1)); + ubo.proj = camera.matrices.perspective; + ubo.view = camera.matrices.view; + ubo.model = glm::mat4(1.f); + ubo.model = glm::rotate(ubo.model, glm::pi(), glm::vec3(0, 0, 1)); + ubo.normal = glm::transpose(glm::inverse(ubo.view * ubo.model)); } uniform_buffer_vs->convert_and_update(ubos[0]); uniform_buffer_gs->convert_and_update(ubos[1]); @@ -148,18 +148,18 @@ void GshaderToMshader::update_uniform_buffers() void GshaderToMshader::prepare_pipelines() { std::array model_stages; - model_stages[0] = load_shader("gshader_to_mshader/gshader_to_mshader.vert", VK_SHADER_STAGE_VERTEX_BIT); - model_stages[1] = load_shader("gshader_to_mshader/gshader_to_mshader.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + model_stages[0] = load_shader("gshader_to_mshader", "gshader_to_mshader.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + model_stages[1] = load_shader("gshader_to_mshader", "gshader_to_mshader.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); std::array geometry_stages; - geometry_stages[0] = load_shader("gshader_to_mshader/gshader_to_mshader_base.vert", VK_SHADER_STAGE_VERTEX_BIT); - geometry_stages[1] = load_shader("gshader_to_mshader/gshader_to_mshader_base.frag", VK_SHADER_STAGE_FRAGMENT_BIT); - geometry_stages[2] = load_shader("gshader_to_mshader/gshader_to_mshader.geom", VK_SHADER_STAGE_GEOMETRY_BIT); + geometry_stages[0] = load_shader("gshader_to_mshader", "gshader_to_mshader_base.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + geometry_stages[1] = load_shader("gshader_to_mshader", "gshader_to_mshader_base.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + geometry_stages[2] = load_shader("gshader_to_mshader", "gshader_to_mshader.geom.spv", VK_SHADER_STAGE_GEOMETRY_BIT); // task shader is not used, the amount of spawned mesh shaders is determined by amount of meshlets stored in the storage_buffer_object->vertex_indices std::array mesh_stages; - mesh_stages[0] = load_shader("gshader_to_mshader/gshader_to_mshader.mesh", VK_SHADER_STAGE_MESH_BIT_EXT); - mesh_stages[1] = load_shader("gshader_to_mshader/gshader_to_mshader_mesh.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + mesh_stages[0] = load_shader("gshader_to_mshader", "gshader_to_mshader.mesh.spv", VK_SHADER_STAGE_MESH_BIT_EXT); + mesh_stages[1] = load_shader("gshader_to_mshader", "gshader_to_mshader_mesh.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Dynamic State std::vector dynamic_state_enables = { @@ -425,9 +425,9 @@ void GshaderToMshader::on_update_ui_overlay(vkb::Drawer &drawer) } } -void GshaderToMshader::request_gpu_features(vkb::PhysicalDevice &gpu) +void GshaderToMshader::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, meshShader); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, meshShader); if (gpu.get_features().geometryShader) { diff --git a/samples/extensions/gshader_to_mshader/gshader_to_mshader.h b/samples/extensions/gshader_to_mshader/gshader_to_mshader.h index f65056814b..986ec64f56 100644 --- a/samples/extensions/gshader_to_mshader/gshader_to_mshader.h +++ b/samples/extensions/gshader_to_mshader/gshader_to_mshader.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" #include "gltf_loader.h" class GshaderToMshader : public ApiVulkanSample @@ -32,6 +31,7 @@ class GshaderToMshader : public ApiVulkanSample glm::mat4 model; glm::mat4 view; glm::mat4 proj; + glm::mat4 normal; }; std::array ubos; @@ -56,7 +56,7 @@ class GshaderToMshader : public ApiVulkanSample GshaderToMshader(); ~GshaderToMshader(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual void render(float delta_time) override; virtual void build_command_buffers() override; virtual bool prepare(const vkb::ApplicationOptions &options) override; diff --git a/samples/extensions/host_image_copy/CMakeLists.txt b/samples/extensions/host_image_copy/CMakeLists.txt index cff8474d81..48b7c74cf3 100644 --- a/samples/extensions/host_image_copy/CMakeLists.txt +++ b/samples/extensions/host_image_copy/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Sascha Willems +# Copyright (c) 2024-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "texture_loading/glsl/texture.frag" SHADER_FILES_HLSL "texture_loading/hlsl/texture.vert.hlsl" - "texture_loading/hlsl/texture.frag.hlsl") + "texture_loading/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_loading/slang/texture.vert.slang" + "texture_loading/slang/texture.frag.slang") diff --git a/samples/extensions/host_image_copy/README.adoc b/samples/extensions/host_image_copy/README.adoc index 6cdd049a28..65b52e46e7 100644 --- a/samples/extensions/host_image_copy/README.adoc +++ b/samples/extensions/host_image_copy/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2024, Sascha Willems +- Copyright (c) 2024-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -38,7 +38,7 @@ NOTE: A staged upload usually has to first perform a CPU copy of data to a GPU-v == Enabling the Extension -The `VK_EXT_host_image_copy` extension needs to be enabled at device level. Depending on the Vulkan version you target, additional extensions might need to be enabled. See the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_host_image_copy.html#_extension_and_version_dependencies[extension and version dependencies] of the extension spec for details. +The `VK_EXT_host_image_copy` extension needs to be enabled at device level. Depending on the Vulkan version you target, additional extensions might need to be enabled. See the https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_host_image_copy.html#_extension_and_version_dependencies[extension and version dependencies] of the extension spec for details. In addition to the extension(s) you also need to enable the `hostImageCopy` for the extension structure: @@ -165,5 +165,5 @@ Aside from the use-case shown in this sample, the `VK_EXT_host_image_copy` exten * https://www.khronos.org/blog/copying-images-on-the-host-in-vulkan[Copying Images on the Host in Vulkan] * https://docs.vulkan.org/features/latest/features/proposals/VK_EXT_host_image_copy.html[Extension proposal] -* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_host_image_copy.html[Specification] +* https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_host_image_copy.html[Specification] * https://vulkan.gpuinfo.org/displayextensiondetail?extension=VK_EXT_host_image_copy[Extension device support] diff --git a/samples/extensions/host_image_copy/host_image_copy.cpp b/samples/extensions/host_image_copy/host_image_copy.cpp index 055a7a00ed..54614a9780 100644 --- a/samples/extensions/host_image_copy/host_image_copy.cpp +++ b/samples/extensions/host_image_copy/host_image_copy.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -43,10 +43,10 @@ HostImageCopy::~HostImageCopy() } // Enable physical device features required for this example -void HostImageCopy::request_gpu_features(vkb::PhysicalDevice &gpu) +void HostImageCopy::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable host image copy feature (required for this sample to work) - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceHostImageCopyFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT, hostImageCopy); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceHostImageCopyFeaturesEXT, hostImageCopy); // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -127,7 +127,7 @@ void HostImageCopy::load_texture() VkMemoryRequirements memory_requirements = {}; vkGetImageMemoryRequirements(get_device().get_handle(), texture.image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &texture.device_memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), texture.image, texture.device_memory, 0)); @@ -389,8 +389,8 @@ void HostImageCopy::prepare_pipelines() vkb::initializers::pipeline_dynamic_state_create_info(dynamic_state_enables.data(), static_cast(dynamic_state_enables.size()), 0); const std::array shader_stages = { - load_shader("texture_loading", "texture.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("texture_loading", "texture.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}; + load_shader("texture_loading", "texture.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("texture_loading", "texture.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}; // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/extensions/host_image_copy/host_image_copy.h b/samples/extensions/host_image_copy/host_image_copy.h index eb9a976832..f727132df1 100644 --- a/samples/extensions/host_image_copy/host_image_copy.h +++ b/samples/extensions/host_image_copy/host_image_copy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -55,7 +55,7 @@ class HostImageCopy : public ApiVulkanSample HostImageCopy(); ~HostImageCopy(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void load_texture(); void load_assets(); void destroy_texture(Texture texture); diff --git a/samples/extensions/hpp_mesh_shading/CMakeLists.txt b/samples/extensions/hpp_mesh_shading/CMakeLists.txt index 90d99974a5..95d481027c 100644 --- a/samples/extensions/hpp_mesh_shading/CMakeLists.txt +++ b/samples/extensions/hpp_mesh_shading/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Holochip Corporation +# Copyright (c) 2024-2025 Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -28,7 +28,14 @@ add_sample_with_tags( SHADER_FILES_GLSL "mesh_shading/glsl/ms.mesh" "mesh_shading/glsl/ps.frag" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" SHADER_FILES_HLSL "mesh_shading/hlsl/ms.mesh.hlsl" "mesh_shading/hlsl/ps.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_mesh_shader") + DXC_ADDITIONAL_ARGUMENTS + "-fspv-extension=SPV_EXT_mesh_shader" + SHADER_FILES_SLANG + "mesh_shading/slang/ms.mesh.slang" + "mesh_shading/slang/ps.frag.slang" + ) diff --git a/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.cpp b/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.cpp index cd7c2c6c4e..74e4c8757a 100644 --- a/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.cpp +++ b/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -22,8 +22,6 @@ #include "hpp_mesh_shading.h" -#include "glsl_compiler.h" - HPPMeshShading::HPPMeshShading() { title = "Mesh shading"; @@ -34,8 +32,6 @@ HPPMeshShading::HPPMeshShading() add_device_extension(VK_EXT_MESH_SHADER_EXTENSION_NAME); add_device_extension(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); add_device_extension(VK_KHR_SPIRV_1_4_EXTENSION_NAME); - - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); } HPPMeshShading::~HPPMeshShading() @@ -58,13 +54,14 @@ bool HPPMeshShading::prepare(const vkb::ApplicationOptions &options) { vk::Device device = get_device().get_handle(); - descriptor_pool = device.createDescriptorPool({{}, 2, {}}); + descriptor_pool = device.createDescriptorPool({.maxSets = 2}); descriptor_set_layout = device.createDescriptorSetLayout({}); - descriptor_set = device.allocateDescriptorSets({descriptor_pool, descriptor_set_layout}).front(); + descriptor_set = + device.allocateDescriptorSets({.descriptorPool = descriptor_pool, .descriptorSetCount = 1, .pSetLayouts = &descriptor_set_layout}).front(); // Create a blank pipeline layout. // We are not binding any resources to the pipeline in this first sample. - pipeline_layout = device.createPipelineLayout({{}, descriptor_set_layout}); + pipeline_layout = device.createPipelineLayout({.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}); pipeline = create_pipeline(); @@ -76,11 +73,11 @@ bool HPPMeshShading::prepare(const vkb::ApplicationOptions &options) return prepared; } -void HPPMeshShading::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPMeshShading::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable extension features required by this sample // These are passed to device creation via a pNext structure chain - HPP_REQUEST_REQUIRED_FEATURE(gpu, vk::PhysicalDeviceMeshShaderFeaturesEXT, meshShader); + REQUEST_REQUIRED_FEATURE(gpu, vk::PhysicalDeviceMeshShaderFeaturesEXT, meshShader); } /* @@ -90,9 +87,12 @@ void HPPMeshShading::build_command_buffers() { vk::CommandBufferBeginInfo command_buffer_begin_info; - std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue(0.0f, 0)}}; + std::array clear_values = {{default_clear_color, vk::ClearDepthStencilValue{0.0f, 0}}}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; for (size_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -128,50 +128,41 @@ void HPPMeshShading::render(float delta_time) vk::Pipeline HPPMeshShading::create_pipeline() { // Load our SPIR-V shaders. - std::vector shader_stages = {load_shader("mesh_shading", "ms.mesh", vk::ShaderStageFlagBits::eMeshEXT), - load_shader("mesh_shading", "ps.frag", vk::ShaderStageFlagBits::eFragment)}; + std::vector shader_stages = {load_shader("mesh_shading", "ms.mesh.spv", vk::ShaderStageFlagBits::eMeshEXT), + load_shader("mesh_shading", "ps.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // We will have one viewport and scissor box. - vk::PipelineViewportStateCreateInfo viewport_state({}, 1, nullptr, 1, nullptr); + vk::PipelineViewportStateCreateInfo viewport_state{.viewportCount = 1, .scissorCount = 1}; - vk::PipelineRasterizationStateCreateInfo rasterization_state; - rasterization_state.polygonMode = vk::PolygonMode::eFill; - rasterization_state.cullMode = vk::CullModeFlagBits::eNone; - rasterization_state.frontFace = vk::FrontFace::eCounterClockwise; - rasterization_state.lineWidth = 1.0f; + vk::PipelineRasterizationStateCreateInfo rasterization_state{ + .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eNone, .frontFace = vk::FrontFace::eCounterClockwise, .lineWidth = 1.0f}; // No multisampling. - vk::PipelineMultisampleStateCreateInfo multisample_state({}, vk::SampleCountFlagBits::e1); + vk::PipelineMultisampleStateCreateInfo multisample_state{.rasterizationSamples = vk::SampleCountFlagBits::e1}; - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state; - depth_stencil_state.depthTestEnable = false; - depth_stencil_state.depthWriteEnable = true; - depth_stencil_state.depthCompareOp = vk::CompareOp::eGreater; - depth_stencil_state.back.compareOp = vk::CompareOp::eGreater; + vk::PipelineDepthStencilStateCreateInfo depth_stencil_state{ + .depthTestEnable = false, .depthWriteEnable = true, .depthCompareOp = vk::CompareOp::eGreater, .back = {.compareOp = vk::CompareOp::eGreater}}; - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; - vk::PipelineColorBlendStateCreateInfo color_blend_state({}, false, {}, blend_attachment_state); + vk::PipelineColorBlendStateCreateInfo color_blend_state{.attachmentCount = 1, .pAttachments = &blend_attachment_state}; // Specify that these states will be dynamic, i.e. not part of pipeline state object. std::array dynamic_state_enables = {vk::DynamicState::eViewport, vk::DynamicState::eScissor}; - vk::PipelineDynamicStateCreateInfo dynamic_state({}, dynamic_state_enables); - - vk::GraphicsPipelineCreateInfo graphics_pipeline_create_info({}, - shader_stages, - nullptr, - nullptr, - nullptr, - &viewport_state, - &rasterization_state, - &multisample_state, - &depth_stencil_state, - &color_blend_state, - &dynamic_state, - pipeline_layout, - render_pass); + vk::PipelineDynamicStateCreateInfo dynamic_state{.dynamicStateCount = static_cast(dynamic_state_enables.size()), + .pDynamicStates = dynamic_state_enables.data()}; + + vk::GraphicsPipelineCreateInfo graphics_pipeline_create_info{.stageCount = static_cast(shader_stages.size()), + .pStages = shader_stages.data(), + .pViewportState = &viewport_state, + .pRasterizationState = &rasterization_state, + .pMultisampleState = &multisample_state, + .pDepthStencilState = &depth_stencil_state, + .pColorBlendState = &color_blend_state, + .pDynamicState = &dynamic_state, + .layout = pipeline_layout, + .renderPass = render_pass}; vk::Result result; vk::Pipeline pipeline; diff --git a/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.h b/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.h index 1fcc926d47..d3632840d0 100644 --- a/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.h +++ b/samples/extensions/hpp_mesh_shading/hpp_mesh_shading.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -24,9 +24,6 @@ #include -// #include "api_vulkan_sample.h" -// #include "glsl_compiler.h" - class HPPMeshShading : public HPPApiVulkanSample { public: @@ -38,7 +35,7 @@ class HPPMeshShading : public HPPApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/extensions/hpp_push_descriptors/CMakeLists.txt b/samples/extensions/hpp_push_descriptors/CMakeLists.txt index 8756600e94..e349019201 100644 --- a/samples/extensions/hpp_push_descriptors/CMakeLists.txt +++ b/samples/extensions/hpp_push_descriptors/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "push_descriptors/glsl/cube.frag" SHADER_FILES_HLSL "push_descriptors/hlsl/cube.vert.hlsl" - "push_descriptors/hlsl/cube.frag.hlsl") + "push_descriptors/hlsl/cube.frag.hlsl" + SHADER_FILES_SLANG + "push_descriptors/slang/cube.vert.slang" + "push_descriptors/slang/cube.frag.slang") \ No newline at end of file diff --git a/samples/extensions/hpp_push_descriptors/README.adoc b/samples/extensions/hpp_push_descriptors/README.adoc index eead6ceede..3bc47e4ecc 100644 --- a/samples/extensions/hpp_push_descriptors/README.adoc +++ b/samples/extensions/hpp_push_descriptors/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2020-2024, Arm Limited and Contributors +- Copyright (c) 2020-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_push_descriptor[`VK_KHR_push_descriptor`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_push_descriptor[`VK_KHR_push_descriptor`] Push descriptors apply the push constants concept to descriptor sets. Instead of creating per-object descriptor sets, this example passes descriptors at command buffer creation time. diff --git a/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.cpp b/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.cpp index ef52c660b3..3ce0487093 100644 --- a/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.cpp +++ b/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems - * Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -84,7 +84,7 @@ bool HPPPushDescriptors::prepare(const vkb::ApplicationOptions &options) return prepared; } -void HPPPushDescriptors::request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) +void HPPPushDescriptors::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -99,19 +99,22 @@ void HPPPushDescriptors::build_command_buffers() std::array clear_values; clear_values[0].color = default_clear_color; - clear_values[1].depthStencil = vk::ClearDepthStencilValue(0.0f, 0); + clear_values[1].depthStencil = vk::ClearDepthStencilValue{0.0f, 0}; - vk::RenderPassBeginInfo render_pass_begin_info(render_pass, {}, {{0, 0}, extent}, clear_values); + vk::RenderPassBeginInfo render_pass_begin_info{.renderPass = render_pass, + .renderArea = {{0, 0}, extent}, + .clearValueCount = static_cast(clear_values.size()), + .pClearValues = clear_values.data()}; - vk::Viewport viewport(0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f); - vk::Rect2D scissor({0, 0}, extent); + vk::Viewport viewport{0.0f, 0.0f, static_cast(extent.width), static_cast(extent.height), 0.0f, 1.0f}; + vk::Rect2D scissor{{0, 0}, extent}; vk::Buffer vertex_buffer = models.cube->get_vertex_buffer("vertex_buffer").get_handle(); vk::Buffer index_buffer = models.cube->get_index_buffer().get_handle(); vk::DeviceSize offset = 0; - vk::DescriptorBufferInfo scene_buffer_descriptor(uniform_buffers.scene->get_handle(), 0, VK_WHOLE_SIZE); + vk::DescriptorBufferInfo scene_buffer_descriptor{uniform_buffers.scene->get_handle(), 0, vk::WholeSize}; for (int32_t i = 0; i < draw_cmd_buffers.size(); ++i) { @@ -134,16 +137,16 @@ void HPPPushDescriptors::build_command_buffers() // This allows a more dynamic approach without the need to create descriptor sets for each model // Note: dstSet for each descriptor set write is left at nullptr as this is ignored when using push descriptors - vk::DescriptorBufferInfo cube_buffer_descriptor(cube.uniform_buffer->get_handle(), 0, VK_WHOLE_SIZE); - vk::DescriptorImageInfo cube_image_descriptor( - cube.texture.sampler, - cube.texture.image->get_vk_image_view().get_handle(), - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, cube.texture.image->get_vk_image_view().get_format())); + vk::DescriptorBufferInfo cube_buffer_descriptor{cube.uniform_buffer->get_handle(), 0, vk::WholeSize}; + vk::DescriptorImageInfo cube_image_descriptor{cube.texture.sampler, + cube.texture.image->get_vk_image_view().get_handle(), + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, + cube.texture.image->get_vk_image_view().get_format())}; std::array write_descriptor_sets = { - {{nullptr, 0, 0, vk::DescriptorType::eUniformBuffer, {}, scene_buffer_descriptor}, - {nullptr, 1, 0, vk::DescriptorType::eUniformBuffer, {}, cube_buffer_descriptor}, - {nullptr, 2, 0, vk::DescriptorType::eCombinedImageSampler, cube_image_descriptor}}}; + {{.dstBinding = 0, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eUniformBuffer, .pBufferInfo = &scene_buffer_descriptor}, + {.dstBinding = 1, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eUniformBuffer, .pBufferInfo = &cube_buffer_descriptor}, + {.dstBinding = 2, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eCombinedImageSampler, .pImageInfo = &cube_image_descriptor}}}; command_buffer.pushDescriptorSetKHR(vk::PipelineBindPoint::eGraphics, pipeline_layout, 0, write_descriptor_sets); @@ -192,28 +195,34 @@ void HPPPushDescriptors::create_descriptor_set_layout() {1, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex}, {2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}}}; - vk::DescriptorSetLayoutCreateInfo descriptor_layout_create_info(vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR, set_layout_bindings); + vk::DescriptorSetLayoutCreateInfo descriptor_layout_create_info{.flags = vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR, + .bindingCount = static_cast(set_layout_bindings.size()), + .pBindings = set_layout_bindings.data()}; descriptor_set_layout = get_device().get_handle().createDescriptorSetLayout(descriptor_layout_create_info); } void HPPPushDescriptors::create_pipeline() { - const std::vector shader_stages = {load_shader("push_descriptors", "cube.vert", vk::ShaderStageFlagBits::eVertex), - load_shader("push_descriptors", "cube.frag", vk::ShaderStageFlagBits::eFragment)}; + const std::vector shader_stages = {load_shader("push_descriptors", "cube.vert.spv", vk::ShaderStageFlagBits::eVertex), + load_shader("push_descriptors", "cube.frag.spv", vk::ShaderStageFlagBits::eFragment)}; // Vertex bindings and attributes - vk::VertexInputBindingDescription vertex_input_binding(0, sizeof(HPPVertex), vk::VertexInputRate::eVertex); - std::array vertex_input_attributes = {{{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)}, // Location 0: Position - {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, normal)}, // Location 1 : Normal - {2, 0, vk::Format::eR32G32Sfloat, offsetof(HPPVertex, uv)}}}; // Location 2: UV - vk::PipelineVertexInputStateCreateInfo vertex_input_state({}, vertex_input_binding, vertex_input_attributes); - - vk::PipelineColorBlendAttachmentState blend_attachment_state; - blend_attachment_state.colorWriteMask = - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; + vk::VertexInputBindingDescription vertex_input_binding{0, sizeof(HPPVertex), vk::VertexInputRate::eVertex}; + std::array vertex_input_attributes = { + {{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, pos)}, // Location 0: Position + {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(HPPVertex, normal)}, // Location 1 : Normal + {2, 0, vk::Format::eR32G32Sfloat, offsetof(HPPVertex, uv)}}}; // Location 2: UV + vk::PipelineVertexInputStateCreateInfo vertex_input_state{.vertexBindingDescriptionCount = 1, + .pVertexBindingDescriptions = &vertex_input_binding, + .vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()), + .pVertexAttributeDescriptions = vertex_input_attributes.data()}; + + vk::PipelineColorBlendAttachmentState blend_attachment_state{.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; // Note: Using reversed depth-buffer for increased precision, so Greater depth values are kept - vk::PipelineDepthStencilStateCreateInfo depth_stencil_state({}, true, true, vk::CompareOp::eGreater, {}, {}, {}, {{}, {}, {}, vk::CompareOp::eAlways}); + vk::PipelineDepthStencilStateCreateInfo depth_stencil_state{ + .depthTestEnable = true, .depthWriteEnable = true, .depthCompareOp = vk::CompareOp::eGreater, .back = {.compareOp = vk::CompareOp::eAlways}}; pipeline = vkb::common::create_graphics_pipeline(get_device().get_handle(), pipeline_cache, @@ -253,7 +262,7 @@ void HPPPushDescriptors::create_uniform_buffers() void HPPPushDescriptors::create_pipeline_layout() { - vk::PipelineLayoutCreateInfo pipeline_layout_create_info({}, descriptor_set_layout); + vk::PipelineLayoutCreateInfo pipeline_layout_create_info{.setLayoutCount = 1, .pSetLayouts = &descriptor_set_layout}; pipeline_layout = get_device().get_handle().createPipelineLayout(pipeline_layout_create_info); } diff --git a/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.h b/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.h index 5647a7af3f..4f048ba62d 100644 --- a/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.h +++ b/samples/extensions/hpp_push_descriptors/hpp_push_descriptors.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems - * Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -41,7 +41,7 @@ class HPPPushDescriptors : public HPPApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; // from vkb::VulkanSample - void request_gpu_features(vkb::core::HPPPhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) override; // from HPPApiVulkanSample void build_command_buffers() override; diff --git a/samples/extensions/logic_op_dynamic_state/CMakeLists.txt b/samples/extensions/logic_op_dynamic_state/CMakeLists.txt index f3933079f6..f43ed724b6 100644 --- a/samples/extensions/logic_op_dynamic_state/CMakeLists.txt +++ b/samples/extensions/logic_op_dynamic_state/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample( "logic_op_dynamic_state/hlsl/background.vert.hlsl" "logic_op_dynamic_state/hlsl/background.frag.hlsl" "logic_op_dynamic_state/hlsl/baseline.vert.hlsl" - "logic_op_dynamic_state/hlsl/baseline.frag.hlsl") + "logic_op_dynamic_state/hlsl/baseline.frag.hlsl" + SHADER_FILES_SLANG + "logic_op_dynamic_state/slang/background.vert.slang" + "logic_op_dynamic_state/slang/background.frag.slang" + "logic_op_dynamic_state/slang/baseline.vert.slang" + "logic_op_dynamic_state/slang/baseline.frag.slang") diff --git a/samples/extensions/logic_op_dynamic_state/README.adoc b/samples/extensions/logic_op_dynamic_state/README.adoc index ae963c06dc..d66ed57873 100644 --- a/samples/extensions/logic_op_dynamic_state/README.adoc +++ b/samples/extensions/logic_op_dynamic_state/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -27,7 +27,7 @@ image::./images/logic_op_dynamic_state_screenshot.png[Sample] == Overview -The https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html[VK_EXT_extended_dynamic_state2] extension allows to use dynamic states e.g. +The https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html[VK_EXT_extended_dynamic_state2] extension allows to use dynamic states e.g. the VK_DYNAMIC_STATE_LOGIC_OP_EXT. This may help an application to change a logical operation used without creating a new pipeline. @@ -35,7 +35,7 @@ The sample demonstrates usage of this extension with dynamically changed logical == Surface format setting -Logical operations are applied only for https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#framebuffer-logicop[signed and unsigned integer and normalized integer framebuffers]. +Logical operations are applied only for https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#framebuffer-logicop[signed and unsigned integer and normalized integer framebuffers]. In the sample the surface format is changed to `VK_FORMAT_B8G8R8A8_UNORM` by overriding the virtual method `create_render_context` (derived from `ApiVulkanSample` class). @@ -56,7 +56,7 @@ In the sample two pipelines are created: The cube model is used to present blending effect achieved using the dynamic logical operations. -The `logicOpEnable` member of the `VkPipelineColorBlendStateCreateInfo` structure https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPipelineColorBlendStateCreateInfo.html[controls if logical operations should be applied]. +The `logicOpEnable` member of the `VkPipelineColorBlendStateCreateInfo` structure https://registry.khronos.org/vulkan/specs/latest/man/html/VkPipelineColorBlendStateCreateInfo.html[controls if logical operations should be applied]. The `logicOpEnable` member is set to `VK_TRUE` during creation of the baseline pipeline in the `create_pipeline` method. @@ -69,7 +69,7 @@ VkPipelineColorBlendStateCreateInfo color_blend_state = color_blend_state.logicOpEnable = VK_TRUE; ---- -In the same method `VK_DYNAMIC_STATE_LOGIC_OP_EXT` is added to the vector of `VkDynamicState` (used to define pipeline dynamic state in https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPipelineDynamicStateCreateInfo.html[`VkPipelineDynamicStateCreateInfo`]). +In the same method `VK_DYNAMIC_STATE_LOGIC_OP_EXT` is added to the vector of `VkDynamicState` (used to define pipeline dynamic state in https://registry.khronos.org/vulkan/specs/latest/man/html/VkPipelineDynamicStateCreateInfo.html[`VkPipelineDynamicStateCreateInfo`]). [,C++] ---- @@ -85,7 +85,7 @@ VkPipelineDynamicStateCreateInfo dynamic_state = 0); ---- -Both structures: `color_blend_state` and `dynamic_state` are used to define https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkGraphicsPipelineCreateInfo.html[`VkGraphicsPipelineCreateInfo`] needed to create the graphics pipeline. +Both structures: `color_blend_state` and `dynamic_state` are used to define https://registry.khronos.org/vulkan/specs/latest/man/html/VkGraphicsPipelineCreateInfo.html[`VkGraphicsPipelineCreateInfo`] needed to create the graphics pipeline. [,C++] ---- @@ -112,9 +112,9 @@ color_blend_state.logicOpEnable = VK_FALSE; == Logical operation dynamic setting in command buffer creation -Calling https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdSetLogicOpEXT.html[`vkCmdSetLogicOpEXT`] allows to set the logic operation dynamically. +Calling https://registry.khronos.org/vulkan/specs/latest/man/html/vkCmdSetLogicOpEXT.html[`vkCmdSetLogicOpEXT`] allows to set the logic operation dynamically. In the sample it is called before drawing the model in the `build_command_buffers` method using a value provided by the GUI. -Available logical operations are defined by the `VkLogicOp` enumeration (check the Vulkan specification for details of https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VkLogicOp[the logical operations]). +Available logical operations are defined by the `VkLogicOp` enumeration (check the Vulkan specification for details of https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkLogicOp[the logical operations]). The background model is drawn before the cube model (with logical operations enabled) to observe blending results on the cube model. [,C++] @@ -139,7 +139,7 @@ VK_CHECK(vkEndCommandBuffer(draw_cmd_buffer)); == Enabling the required extensions The extended dynamic state 2 API requires Vulkan 1.0 and the appropriate headers / SDK is required. -This extension has been https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html#_promotion_to_vulkan_1_3[partially] promoted to Vulkan 1.3. +This extension has been https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html#_promotion_to_vulkan_1_3[partially] promoted to Vulkan 1.3. The device extension `VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME` requires `VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME` instance extension to be enabled. diff --git a/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.cpp b/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.cpp index 2996f33a25..19851eaba7 100644 --- a/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.cpp +++ b/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -196,31 +196,19 @@ void LogicOpDynamicState::build_command_buffers() } /** - * @fn void LogicOpDynamicState::request_gpu_features(vkb::PhysicalDevice &gpu) + * @fn void LogicOpDynamicState::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) * @brief Enabling features related to Vulkan extensions */ -void LogicOpDynamicState::request_gpu_features(vkb::PhysicalDevice &gpu) +void LogicOpDynamicState::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { /* Enable extension features required by this sample These are passed to device creation via a pNext structure chain */ - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, - extendedDynamicState2); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, - extendedDynamicState2LogicOp); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, - extendedDynamicState); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, - primitiveTopologyListRestart); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2LogicOp); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, extendedDynamicState); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, primitiveTopologyListRestart); if (gpu.get_features().samplerAnisotropy) { @@ -332,8 +320,8 @@ void LogicOpDynamicState::create_pipeline() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("logic_op_dynamic_state", "baseline.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("logic_op_dynamic_state", "baseline.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("logic_op_dynamic_state", "baseline.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("logic_op_dynamic_state", "baseline.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); /* Use the pNext to point to the rendering create structure */ VkGraphicsPipelineCreateInfo graphics_create{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; @@ -386,8 +374,8 @@ void LogicOpDynamicState::create_pipeline() rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - shader_stages[0] = load_shader("logic_op_dynamic_state", "background.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("logic_op_dynamic_state", "background.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("logic_op_dynamic_state", "background.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("logic_op_dynamic_state", "background.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &graphics_create, VK_NULL_HANDLE, &pipeline.background)); } diff --git a/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.h b/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.h index e7f50d57b4..253707bfe9 100644 --- a/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.h +++ b/samples/extensions/logic_op_dynamic_state/logic_op_dynamic_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -122,7 +122,7 @@ class LogicOpDynamicState : public ApiVulkanSample bool prepare(const vkb::ApplicationOptions &options) override; void render(float delta_time) override; void build_command_buffers() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; void prepare_uniform_buffers(); diff --git a/samples/extensions/memory_budget/CMakeLists.txt b/samples/extensions/memory_budget/CMakeLists.txt index d3ec3fc8b3..02d387b6a4 100644 --- a/samples/extensions/memory_budget/CMakeLists.txt +++ b/samples/extensions/memory_budget/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (c) 2019-2024, Sascha Willems -# Copyright (c) 2024, Holochip Corporation +# Copyright (c) 2019-2025, Sascha Willems +# Copyright (c) 2024-2025, Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -39,4 +39,11 @@ add_sample_with_tags( "instancing/hlsl/planet.vert.hlsl" "instancing/hlsl/planet.frag.hlsl" "instancing/hlsl/starfield.vert.hlsl" - "instancing/hlsl/starfield.frag.hlsl") + "instancing/hlsl/starfield.frag.hlsl" + SHADER_FILES_SLANG + "instancing/slang/instancing.vert.slang" + "instancing/slang/instancing.frag.slang" + "instancing/slang/planet.vert.slang" + "instancing/slang/planet.frag.slang" + "instancing/slang/starfield.vert.slang" + "instancing/slang/starfield.frag.slang") diff --git a/samples/extensions/memory_budget/memory_budget.cpp b/samples/extensions/memory_budget/memory_budget.cpp index 96f208e1b1..11cd717a50 100644 --- a/samples/extensions/memory_budget/memory_budget.cpp +++ b/samples/extensions/memory_budget/memory_budget.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems - * Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -50,7 +50,7 @@ MemoryBudget::~MemoryBudget() } } -void MemoryBudget::request_gpu_features(vkb::PhysicalDevice &gpu) +void MemoryBudget::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { auto &requested_features = gpu.get_mutable_requested_features(); @@ -403,16 +403,16 @@ void MemoryBudget::prepare_pipelines() pipeline_create_info.pVertexInputState = &input_state; // Instancing pipeline - shader_stages[0] = load_shader("instancing", "instancing.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("instancing", "instancing.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("instancing", "instancing.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("instancing", "instancing.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Use all input bindings and attribute descriptions input_state.vertexBindingDescriptionCount = static_cast(binding_descriptions.size()); input_state.vertexAttributeDescriptionCount = static_cast(attribute_descriptions.size()); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.instanced_rocks)); // Planet rendering pipeline - shader_stages[0] = load_shader("instancing", "planet.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("instancing", "planet.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("instancing", "planet.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("instancing", "planet.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Only use the non-instanced input bindings and attribute descriptions input_state.vertexBindingDescriptionCount = 1; input_state.vertexAttributeDescriptionCount = 3; @@ -422,8 +422,8 @@ void MemoryBudget::prepare_pipelines() rasterization_state.cullMode = VK_CULL_MODE_NONE; depth_stencil_state.depthWriteEnable = VK_FALSE; depth_stencil_state.depthTestEnable = VK_FALSE; - shader_stages[0] = load_shader("instancing", "starfield.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("instancing", "starfield.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("instancing", "starfield.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("instancing", "starfield.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertices are generated in the vertex shader input_state.vertexBindingDescriptionCount = 0; input_state.vertexAttributeDescriptionCount = 0; diff --git a/samples/extensions/memory_budget/memory_budget.h b/samples/extensions/memory_budget/memory_budget.h index 3a360a6468..e8d4d29677 100644 --- a/samples/extensions/memory_budget/memory_budget.h +++ b/samples/extensions/memory_budget/memory_budget.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2019-2024, Sascha Willems - * Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -118,7 +118,7 @@ class MemoryBudget : public ApiVulkanSample public: MemoryBudget(); ~MemoryBudget() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void load_assets(); diff --git a/samples/extensions/mesh_shader_culling/CMakeLists.txt b/samples/extensions/mesh_shader_culling/CMakeLists.txt index 138daf4414..0ad1747ee4 100644 --- a/samples/extensions/mesh_shader_culling/CMakeLists.txt +++ b/samples/extensions/mesh_shader_culling/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Holochip Corporation +# Copyright (c) 2023-2025, Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -20,13 +20,16 @@ get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) add_sample_with_tags( - ID ${FOLDER_NAME} - CATEGORY ${CATEGORY_NAME} - AUTHOR "Holochip Corporation" - NAME "Mesh Shader Culling" - DESCRIPTION "Demonstrate and showcase a sample application using mesh shader culling functionality" - SHADER_FILES_GLSL + ID ${FOLDER_NAME} + CATEGORY ${CATEGORY_NAME} + AUTHOR "Holochip Corporation" + NAME "Mesh Shader Culling" + DESCRIPTION "Demonstrate and showcase a sample application using mesh shader culling functionality" + SHADER_FILES_GLSL "mesh_shader_culling/mesh_shader_culling.task" "mesh_shader_culling/mesh_shader_culling.mesh" "mesh_shader_culling/mesh_shader_culling.frag" - "mesh_shader_culling/mesh_shader_shared.h") + "mesh_shader_culling/mesh_shader_shared.h" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" + ) diff --git a/samples/extensions/mesh_shader_culling/README.adoc b/samples/extensions/mesh_shader_culling/README.adoc index 46f8ca125f..0456ca8d85 100644 --- a/samples/extensions/mesh_shader_culling/README.adoc +++ b/samples/extensions/mesh_shader_culling/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Holochip Corporation +- Copyright (c) 2025, Holochip Corporation - - SPDX-License-Identifier: Apache-2.0 - @@ -27,7 +27,7 @@ image::./images/mesh_shader_culling.png[Mesh Shader Culling] == Overview -This sample demonstrates how to incorporate the Vulkan extension https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_mesh_shader[`VK_EXT_mesh_shader`], and introduces per primitive culling in a mesh shader. +This sample demonstrates how to incorporate the Vulkan extension https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_EXT_mesh_shader[`VK_EXT_mesh_shader`], and introduces per primitive culling in a mesh shader. == Contents diff --git a/samples/extensions/mesh_shader_culling/mesh_shader_culling.cpp b/samples/extensions/mesh_shader_culling/mesh_shader_culling.cpp index 0de6ab68af..bc56f79835 100644 --- a/samples/extensions/mesh_shader_culling/mesh_shader_culling.cpp +++ b/samples/extensions/mesh_shader_culling/mesh_shader_culling.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -31,8 +31,6 @@ MeshShaderCulling::MeshShaderCulling() add_device_extension(VK_KHR_SPIRV_1_4_EXTENSION_NAME); add_device_extension(VK_EXT_MESH_SHADER_EXTENSION_NAME); add_device_extension(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); - // Targeting SPIR-V version - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); } MeshShaderCulling::~MeshShaderCulling() @@ -52,12 +50,12 @@ MeshShaderCulling::~MeshShaderCulling() } } -void MeshShaderCulling::request_gpu_features(vkb::PhysicalDevice &gpu) +void MeshShaderCulling::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Check whether the device supports task and mesh shaders - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, meshShader); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, meshShaderQueries); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, taskShader); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, meshShader); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, meshShaderQueries); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, taskShader); // Pipeline statistics auto &requested_features = gpu.get_mutable_requested_features(); @@ -227,9 +225,9 @@ void MeshShaderCulling::prepare_pipelines() // Shader state std::vector shader_stages{}; - shader_stages.push_back(load_shader("mesh_shader_culling/mesh_shader_culling.task", VK_SHADER_STAGE_TASK_BIT_EXT)); - shader_stages.push_back(load_shader("mesh_shader_culling/mesh_shader_culling.mesh", VK_SHADER_STAGE_MESH_BIT_EXT)); - shader_stages.push_back(load_shader("mesh_shader_culling/mesh_shader_culling.frag", VK_SHADER_STAGE_FRAGMENT_BIT)); + shader_stages.push_back(load_shader("mesh_shader_culling/mesh_shader_culling.task.spv", VK_SHADER_STAGE_TASK_BIT_EXT)); + shader_stages.push_back(load_shader("mesh_shader_culling/mesh_shader_culling.mesh.spv", VK_SHADER_STAGE_MESH_BIT_EXT)); + shader_stages.push_back(load_shader("mesh_shader_culling/mesh_shader_culling.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)); pipeline_create_info.pVertexInputState = nullptr; pipeline_create_info.pInputAssemblyState = nullptr; @@ -376,8 +374,9 @@ void MeshShaderCulling::setup_query_result_buffer() // Results are saved in a host visible buffer for easy access by the application VK_CHECK(vkCreateBuffer(get_device().get_handle(), &buffer_create_info, nullptr, &query_result.buffer)); vkGetBufferMemoryRequirements(get_device().get_handle(), query_result.buffer, &memory_requirements); - memory_allocation.allocationSize = memory_requirements.size; - memory_allocation.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + memory_allocation.allocationSize = memory_requirements.size; + memory_allocation.memoryTypeIndex = + get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation, nullptr, &query_result.memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), query_result.buffer, query_result.memory, 0)); diff --git a/samples/extensions/mesh_shader_culling/mesh_shader_culling.h b/samples/extensions/mesh_shader_culling/mesh_shader_culling.h index f330228644..dd2ee765d2 100644 --- a/samples/extensions/mesh_shader_culling/mesh_shader_culling.h +++ b/samples/extensions/mesh_shader_culling/mesh_shader_culling.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" class MeshShaderCulling : public ApiVulkanSample { @@ -53,7 +52,7 @@ class MeshShaderCulling : public ApiVulkanSample } ubo_cull{}; MeshShaderCulling(); ~MeshShaderCulling() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void setup_descriptor_pool(); void setup_descriptor_set_layout(); diff --git a/samples/extensions/mesh_shading/CMakeLists.txt b/samples/extensions/mesh_shading/CMakeLists.txt index d385f9448a..b84166c374 100644 --- a/samples/extensions/mesh_shading/CMakeLists.txt +++ b/samples/extensions/mesh_shading/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Holochip Corporation +# Copyright (c) 2023-2025 Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -28,7 +28,14 @@ add_sample_with_tags( SHADER_FILES_GLSL "mesh_shading/glsl/ms.mesh" "mesh_shading/glsl/ps.frag" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" SHADER_FILES_HLSL "mesh_shading/hlsl/ms.mesh.hlsl" "mesh_shading/hlsl/ps.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_mesh_shader") + DXC_ADDITIONAL_ARGUMENTS + "-fspv-extension=SPV_EXT_mesh_shader" + SHADER_FILES_SLANG + "mesh_shading/slang/ms.mesh.slang" + "mesh_shading/slang/ps.frag.slang" + ) diff --git a/samples/extensions/mesh_shading/mesh_shading.cpp b/samples/extensions/mesh_shading/mesh_shading.cpp index ed02e4db5e..a5465a4ba3 100644 --- a/samples/extensions/mesh_shading/mesh_shading.cpp +++ b/samples/extensions/mesh_shading/mesh_shading.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024 Holochip Corporation +/* Copyright (c) 2023-2025 Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -33,7 +33,6 @@ MeshShading::MeshShading() : add_device_extension(VK_KHR_SPIRV_1_4_EXTENSION_NAME); add_device_extension(VK_EXT_MESH_SHADER_EXTENSION_NAME); add_device_extension(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); } MeshShading::~MeshShading() @@ -46,11 +45,11 @@ MeshShading::~MeshShading() } } -void MeshShading::request_gpu_features(vkb::PhysicalDevice &gpu) +void MeshShading::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable extension features required by this sample // These are passed to device creation via a pNext structure chain - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, meshShader); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceMeshShaderFeaturesEXT, meshShader); } /* @@ -206,8 +205,8 @@ void MeshShading::prepare_pipelines() // Load our SPIR-V shaders. std::array shader_stages{}; - shader_stages[0] = load_shader("mesh_shading", "ms.mesh", VK_SHADER_STAGE_MESH_BIT_EXT); - shader_stages[1] = load_shader("mesh_shading", "ps.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("mesh_shading", "ms.mesh.spv", VK_SHADER_STAGE_MESH_BIT_EXT); + shader_stages[1] = load_shader("mesh_shading", "ps.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info( diff --git a/samples/extensions/mesh_shading/mesh_shading.h b/samples/extensions/mesh_shading/mesh_shading.h index 0d92ffaad8..728bb8c8ad 100644 --- a/samples/extensions/mesh_shading/mesh_shading.h +++ b/samples/extensions/mesh_shading/mesh_shading.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024 Holochip Corporation +/* Copyright (c) 2023-2025 Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -23,7 +23,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" class MeshShading : public ApiVulkanSample { @@ -36,7 +35,7 @@ class MeshShading : public ApiVulkanSample MeshShading(); ~MeshShading() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void prepare_pipelines(); void build_command_buffers() override; diff --git a/samples/extensions/open_cl_interop/CMakeLists.txt b/samples/extensions/open_cl_interop/CMakeLists.txt index 274ac3ad4b..3616892ce6 100644 --- a/samples/extensions/open_cl_interop/CMakeLists.txt +++ b/samples/extensions/open_cl_interop/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Sascha Willems +# Copyright (c) 2023-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -40,5 +40,8 @@ if (NOT APPLE) open_cl_interop/procedural_texture.cl SHADER_FILES_HLSL open_cl_interop/hlsl/texture_display.vert.hlsl - open_cl_interop/hlsl/texture_display.frag.hlsl) + open_cl_interop/hlsl/texture_display.frag.hlsl + SHADER_FILES_SLANG + open_cl_interop/slang/texture_display.vert.slang + open_cl_interop/slang/texture_display.frag.slang) endif() \ No newline at end of file diff --git a/samples/extensions/open_cl_interop/README.adoc b/samples/extensions/open_cl_interop/README.adoc index fc774f103d..6671f6143c 100644 --- a/samples/extensions/open_cl_interop/README.adoc +++ b/samples/extensions/open_cl_interop/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023-2024, Sascha Willems +- Copyright (c) 2023-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -38,15 +38,15 @@ To fully understand how this sample works it's advised to have experience with b Both Vulkan and OpenCL offer extensions for so called external objects. An external object is something that can be referenced in multiple apis. In this sample we share images and semaphores, so we need to enable related extensions on both apis. -For *sharing the memory* backing up the image, in *Vulkan* we need to enable https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory_capabilities.html[`VK_KHR_external_memory_capabilities`] at instance level and https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`] at device level. We also need to enable specific extensions based on the platform we're running on. For Windows that's https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory_win32.html[`VK_KHR_external_memory_win32`] and for all Unix based platforms we need to enable https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory_fd.html[`VK_KHR_external_memory_fd`]. The OpenCl equivalents to these extensions are https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#cl_khr_external_memory[`cl_khr_external_memory`], `cl_khr_external_memory_win32` (Windows) and `cl_khr_external_memory_opaque_fd` (Unix based platforms). +For *sharing the memory* backing up the image, in *Vulkan* we need to enable https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory_capabilities.html[`VK_KHR_external_memory_capabilities`] at instance level and https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`] at device level. We also need to enable specific extensions based on the platform we're running on. For Windows that's https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory_win32.html[`VK_KHR_external_memory_win32`] and for all Unix based platforms we need to enable https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory_fd.html[`VK_KHR_external_memory_fd`]. The OpenCl equivalents to these extensions are https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#cl_khr_external_memory[`cl_khr_external_memory`], `cl_khr_external_memory_win32` (Windows) and `cl_khr_external_memory_opaque_fd` (Unix based platforms). -For *sharing the semaphores* used to sync image access between the apis, in *Vulkan* we need to enable https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore_capabilities.html[`VK_KHR_external_semaphore_capabilities`] at the instance level and https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] at the device level. The platform specific extension to enable are https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore_win32.html[`VK_KHR_external_semaphore_win32`] for Windows and https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore_fd.html[`VK_KHR_external_semaphore_fd`] for Unix based platforms. The *OpenCL equivalents* to these are https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#cl_khr_external_semaphore[`cl_khr_external_semaphore`], `cl_khr_external_semaphore_win32` (Windows) and `cl_khr_external_semaphore_opaque_fd` (Unix based platforms). +For *sharing the semaphores* used to sync image access between the apis, in *Vulkan* we need to enable https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_semaphore_capabilities.html[`VK_KHR_external_semaphore_capabilities`] at the instance level and https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] at the device level. The platform specific extension to enable are https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_semaphore_win32.html[`VK_KHR_external_semaphore_win32`] for Windows and https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_semaphore_fd.html[`VK_KHR_external_semaphore_fd`] for Unix based platforms. The *OpenCL equivalents* to these are https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#cl_khr_external_semaphore[`cl_khr_external_semaphore`], `cl_khr_external_semaphore_win32` (Windows) and `cl_khr_external_semaphore_opaque_fd` (Unix based platforms). -We also need to match devices between Vulkan and OpenCL. In Vulkan this functionality is provided e.g. by the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory_capabilities.html[`VK_KHR_external_memory_capabilities`] extension, in OpenCL this requires the `cl_khr_device_uuid`. More on this later. +We also need to match devices between Vulkan and OpenCL. In Vulkan this functionality is provided e.g. by the https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory_capabilities.html[`VK_KHR_external_memory_capabilities`] extension, in OpenCL this requires the `cl_khr_device_uuid`. More on this later. == Matching devices -For the type of external objects we are going to share between Vulkan and OpenCL in this sample, we must make sure that we use the same device in Vulkan and OpenCL. See https://registry.khronos.org/vulkan/specs/1.3-extensions/html/chap49.html#capabilities-image[this chapter of the spec] as to why this is required and to what types of external objects this applies. Esp. on desktop systems you may have multiple Vulkan and/or OpenCL implementations, and they may be reported by both apis in different orders. So just assuming that the first Vulkan device is also the first OpenCL device may not work. +For the type of external objects we are going to share between Vulkan and OpenCL in this sample, we must make sure that we use the same device in Vulkan and OpenCL. See https://registry.khronos.org/vulkan/specs/latest/html/chap49.html#capabilities-image[this chapter of the spec] as to why this is required and to what types of external objects this applies. Esp. on desktop systems you may have multiple Vulkan and/or OpenCL implementations, and they may be reported by both apis in different orders. So just assuming that the first Vulkan device is also the first OpenCL device may not work. For that, both apis expose universally unique (device) identifiers (uuid) that we can use to match the devices between the apis. This is done in the `prepare_opencl_resources` function. Since this is a Vulkan sample we'll try to find the OpenCL device that matches the UUID of our Vulkan sample: @@ -114,7 +114,7 @@ for (auto &platform_id : platform_ids) == A note on Windows security -On Windows we need to ensure read and write access to the shared memory for external handles (see https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkExportMemoryWin32HandleInfoKHR.html#_description[spec]). This requires setting up security attributes using the Windows API. To simplify this, the sample implements that in the `WinSecurityAttributes` class. This is then used in all places where we share memory on Windows. +On Windows we need to ensure read and write access to the shared memory for external handles (see https://registry.khronos.org/vulkan/specs/latest/man/html/VkExportMemoryWin32HandleInfoKHR.html#_description[spec]). This requires setting up security attributes using the Windows API. To simplify this, the sample implements that in the `WinSecurityAttributes` class. This is then used in all places where we share memory on Windows. == Creating and sharing the image diff --git a/samples/extensions/open_cl_interop/open_cl_interop.cpp b/samples/extensions/open_cl_interop/open_cl_interop.cpp index 193d90f489..f68f2cc548 100644 --- a/samples/extensions/open_cl_interop/open_cl_interop.cpp +++ b/samples/extensions/open_cl_interop/open_cl_interop.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -406,8 +406,8 @@ void OpenCLInterop::prepare_pipelines() // Load shaders std::array shader_stages{}; - shader_stages[0] = load_shader("open_cl_interop", "texture_display.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("open_cl_interop", "texture_display.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("open_cl_interop", "texture_display.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("open_cl_interop", "texture_display.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { @@ -567,7 +567,7 @@ void OpenCLInterop::prepare_shared_image() VkMemoryAllocateInfo memory_allocate_info = vkb::initializers::memory_allocate_info(); memory_allocate_info.pNext = &export_memory_allocate_info; memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, 0); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, 0); VK_CHECK(vkAllocateMemory(device_handle, &memory_allocate_info, nullptr, &shared_image.memory)); VK_CHECK(vkBindImageMemory(device_handle, shared_image.image, shared_image.memory, 0)); @@ -799,7 +799,7 @@ void OpenCLInterop::prepare_opencl_resources() while (std::getline(extension_stream, extension, ' ')) { // Remove trailing zeroes from all extensions (which otherwise may make support checks fail) - extension.erase(std::find(extension.begin(), extension.end(), '\0'), extension.end()); + extension.erase(std::ranges::find(extension, '\0'), extension.end()); available_extensions.push_back(extension); } @@ -807,7 +807,7 @@ void OpenCLInterop::prepare_opencl_resources() for (auto &extension : required_extensions) { - if (std::find(available_extensions.begin(), available_extensions.end(), extension) == available_extensions.end()) + if (std::ranges::find(available_extensions, extension) == available_extensions.end()) { extensions_present = false; break; @@ -857,8 +857,8 @@ void OpenCLInterop::prepare_opencl_resources() if ((selected_platform_id == nullptr) || (selected_device_id == nullptr)) { - const std::string message{"Could not find an OpenCL platform + device that matches the required extensions and also matches the Vulkan device UUID "}; - LOGE(message); + const std::string message{"Could not find an OpenCL platform + device that matches the required extensions and also matches the Vulkan device UUID"}; + LOGE("{}", message); throw std::runtime_error(message); } @@ -872,7 +872,7 @@ void OpenCLInterop::prepare_opencl_resources() opencl_objects.command_queue = clCreateCommandQueue(opencl_objects.context, opencl_objects.device_id, 0, &cl_result); CL_CHECK(cl_result); - std::string kernel_source = vkb::fs::read_shader("open_cl_interop/procedural_texture.cl"); + std::string kernel_source = vkb::fs::read_text_file("open_cl_interop/procedural_texture.cl"); auto kernel_source_data = kernel_source.c_str(); size_t kernel_source_size = kernel_source.size(); diff --git a/samples/extensions/open_cl_interop_arm/README.adoc b/samples/extensions/open_cl_interop_arm/README.adoc index 1e2f2e0258..7c651731eb 100644 --- a/samples/extensions/open_cl_interop_arm/README.adoc +++ b/samples/extensions/open_cl_interop_arm/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2023, Arm Limited and Contributors +- Copyright (c) 2021-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -51,7 +51,7 @@ image::./images/shared_hardware_buffer.png[Sample] === Support by Vulkan API -In Vulkan hardware buffers can be imported or exported using https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html[VK_ANDROID_external_memory_android_hardware_buffer] extension. +In Vulkan hardware buffers can be imported or exported using https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html[VK_ANDROID_external_memory_android_hardware_buffer] extension. AHardwareBuffer can be bound to a `VkDeviceMemory` object, which serves as an allocation for objects of type `VkImage` or `VkBuffer`. If we need to use an image backed by an AHardwareBuffer, we must specify while creating the image. @@ -87,7 +87,7 @@ export_memory_allocate_Info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID ---- This is specified as `pNext` of `VkMemoryAllocateInfo`, while `allocationSize` is set to 0. -You can find more info on this in the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkMemoryRequirements[specification]. +You can find more info on this in the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VkMemoryRequirements[specification]. Once the memory is allocated *and* bound to the image (or buffer), we can export a handle of type `AHardwareBuffer`: @@ -178,5 +178,5 @@ In this sample one of such handle types is demonstrated: Android Hardware Buffer The extensions used in this case are: -* https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html[VK_ANDROID_external_memory_android_hardware_buffer] +* https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html[VK_ANDROID_external_memory_android_hardware_buffer] * https://www.khronos.org/registry/OpenCL/extensions/arm/cl_arm_import_memory.txt[cl_arm_import_memory] diff --git a/samples/extensions/open_cl_interop_arm/open_cl_interop_arm.cpp b/samples/extensions/open_cl_interop_arm/open_cl_interop_arm.cpp index 1708f11dd4..eb484c3cf0 100644 --- a/samples/extensions/open_cl_interop_arm/open_cl_interop_arm.cpp +++ b/samples/extensions/open_cl_interop_arm/open_cl_interop_arm.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -487,7 +487,7 @@ void OpenCLInteropArm::prepare_shared_resources() VkMemoryAllocateInfo memory_allocate_info = vkb::initializers::memory_allocate_info(); memory_allocate_info.pNext = &export_memory_allocate_Info; memory_allocate_info.allocationSize = 0; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(device_handle, &memory_allocate_info, nullptr, &shared_texture.memory)); VK_CHECK(vkBindImageMemory(device_handle, shared_texture.image, shared_texture.memory, 0)); @@ -617,7 +617,7 @@ void OpenCLInteropArm::prepare_open_cl_resources() cl_data->command_queue = clCreateCommandQueue(cl_data->context, cl_data->device_id, 0, &result); - std::string kernel_source = vkb::fs::read_shader("open_cl_interop_arm/procedural_texture.cl"); + std::string kernel_source = vkb::fs::read_text_file("open_cl_interop_arm/procedural_texture.cl"); auto kernel_source_data = kernel_source.c_str(); size_t kernel_source_size = kernel_source.size(); diff --git a/samples/extensions/open_gl_interop/CMakeLists.txt b/samples/extensions/open_gl_interop/CMakeLists.txt index 87ae1976f8..8a08b628f5 100644 --- a/samples/extensions/open_gl_interop/CMakeLists.txt +++ b/samples/extensions/open_gl_interop/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (c) 2020-2024, Bradley Austin Davis -# Copyright (c) 2020-2024, Arm Limited +# Copyright (c) 2020-2025, Bradley Austin Davis +# Copyright (c) 2020-2025, Arm Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -60,5 +60,8 @@ if (NOT (ANDROID OR DIRECT_TO_DISPLAY OR IOS)) "texture_loading/glsl/texture.frag" SHADER_FILES_HLSL "texture_loading/hlsl/texture.vert.hlsl" - "texture_loading/hlsl/texture.frag.hlsl") + "texture_loading/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_loading/slang/texture.vert.slang" + "texture_loading/slang/texture.frag.slang") endif() \ No newline at end of file diff --git a/samples/extensions/open_gl_interop/README.adoc b/samples/extensions/open_gl_interop/README.adoc index c5f09535c9..9820478cc9 100644 --- a/samples/extensions/open_gl_interop/README.adoc +++ b/samples/extensions/open_gl_interop/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2020-2023, The Khronos Group +- Copyright (c) 2020-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_external_memory.html[`VK_KHR_external_memory`], https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_external_semaphore.html[`VK_KHR_external_semaphore`] Render a procedural image using OpenGL and incorporate that rendered content into a Vulkan scene. Demonstrates using the same backing memory for a texture in both OpenGL and Vulkan and how to synchronize the APIs using shared semaphores and barriers. diff --git a/samples/extensions/open_gl_interop/open_gl_interop.cpp b/samples/extensions/open_gl_interop/open_gl_interop.cpp index 93e8969765..a43efaa87a 100644 --- a/samples/extensions/open_gl_interop/open_gl_interop.cpp +++ b/samples/extensions/open_gl_interop/open_gl_interop.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2020-2024, Bradley Austin Davis - * Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Bradley Austin Davis + * Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -236,8 +236,7 @@ void OpenGLInterop::prepare_shared_resources() VkMemoryAllocateInfo memAllocInfo{VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, &export_memory_allocate_Info}; memAllocInfo.allocationSize = sharedTexture.allocationSize = memReqs.size; - memAllocInfo.memoryTypeIndex = get_device().get_memory_type(memReqs.memoryTypeBits, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memAllocInfo.memoryTypeIndex = get_device().get_gpu().get_memory_type(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(deviceHandle, &memAllocInfo, nullptr, &sharedTexture.memory)); VK_CHECK(vkBindImageMemory(deviceHandle, sharedTexture.image, sharedTexture.memory, 0)); @@ -464,8 +463,8 @@ void OpenGLInterop::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("texture_loading", "texture.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("texture_loading", "texture.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("texture_loading", "texture.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("texture_loading", "texture.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/extensions/patch_control_points/CMakeLists.txt b/samples/extensions/patch_control_points/CMakeLists.txt index 4955638d0d..854932815a 100644 --- a/samples/extensions/patch_control_points/CMakeLists.txt +++ b/samples/extensions/patch_control_points/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample( "patch_control_points/hlsl/tess.frag.hlsl" "patch_control_points/hlsl/tess.tesc.hlsl" "patch_control_points/hlsl/tess.tese.hlsl" - "patch_control_points/hlsl/tess.vert.hlsl") + "patch_control_points/hlsl/tess.vert.hlsl" + SHADER_FILES_SLANG + "patch_control_points/slang/tess.frag.slang" + "patch_control_points/slang/tess.tesc.slang" + "patch_control_points/slang/tess.tese.slang" + "patch_control_points/slang/tess.vert.slang") diff --git a/samples/extensions/patch_control_points/README.adoc b/samples/extensions/patch_control_points/README.adoc index a2d9ce99bc..7eb0d2a51a 100644 --- a/samples/extensions/patch_control_points/README.adoc +++ b/samples/extensions/patch_control_points/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2023, Mobica Limited +- Copyright (c) 2023-2025, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - @@ -155,7 +155,7 @@ VK_CHECK(vkEndCommandBuffer(draw_cmd_buffer)); == Enabling the Extension The extended dynamic state 2 API requires Vulkan 1.0 and the appropriate headers / SDK is required. -This extension has been https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_extended_dynamic_state2.html#_promotion_to_vulkan_1_3[partially] promoted to Vulkan 1.3. +This extension has been https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_extended_dynamic_state2.html#_promotion_to_vulkan_1_3[partially] promoted to Vulkan 1.3. The device extension is provided by `VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME`. It also requires `VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME` instance extension to be enabled. @@ -166,5 +166,5 @@ add_instance_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); add_device_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); ---- -If the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceExtendedDynamicState2FeaturesEXT.html[`VkPhysicalDeviceExtendedDynamicState2FeaturesEXT`] structure is included in the pNext chain of the `VkPhysicalDeviceFeatures2` structure passed to vkGetPhysicalDeviceFeatures2, it is filled in to indicate whether each corresponding feature is supported. +If the https://registry.khronos.org/vulkan/specs/latest/man/html/VkPhysicalDeviceExtendedDynamicState2FeaturesEXT.html[`VkPhysicalDeviceExtendedDynamicState2FeaturesEXT`] structure is included in the pNext chain of the `VkPhysicalDeviceFeatures2` structure passed to vkGetPhysicalDeviceFeatures2, it is filled in to indicate whether each corresponding feature is supported. `VkPhysicalDeviceExtendedDynamicState2FeaturesEXT` can also be used in the pNext chain of `VkDeviceCreateInfo` to selectively enable these features. diff --git a/samples/extensions/patch_control_points/patch_control_points.cpp b/samples/extensions/patch_control_points/patch_control_points.cpp index cdf02a0e2b..ed5cda7dad 100644 --- a/samples/extensions/patch_control_points/patch_control_points.cpp +++ b/samples/extensions/patch_control_points/patch_control_points.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -243,10 +243,10 @@ void PatchControlPoints::create_pipelines() vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); std::array shader_stages{}; - shader_stages[0] = load_shader("patch_control_points", "tess.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("patch_control_points", "tess.frag", VK_SHADER_STAGE_FRAGMENT_BIT); - shader_stages[2] = load_shader("patch_control_points", "tess.tesc", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); - shader_stages[3] = load_shader("patch_control_points", "tess.tese", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); + shader_stages[0] = load_shader("patch_control_points", "tess.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("patch_control_points", "tess.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[2] = load_shader("patch_control_points", "tess.tesc.spv", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); + shader_stages[3] = load_shader("patch_control_points", "tess.tese.spv", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); /* Use the pNext to point to the rendering create struct */ VkGraphicsPipelineCreateInfo graphics_create{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO}; @@ -544,26 +544,17 @@ void PatchControlPoints::create_descriptor_sets() } /** - * @fn void PatchControlPoints::request_gpu_features(vkb::PhysicalDevice &gpu) + * @fn void PatchControlPoints::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) * @brief Enabling features related to Vulkan extensions */ -void PatchControlPoints::request_gpu_features(vkb::PhysicalDevice &gpu) +void PatchControlPoints::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { /* Enable extension features required by this sample These are passed to device creation via a pNext structure chain */ - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, - extendedDynamicState2); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, - extendedDynamicState2PatchControlPoints); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, - extendedDynamicState); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT, extendedDynamicState2PatchControlPoints); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, extendedDynamicState); // Tessellation shader support is required for this example auto &requested_features = gpu.get_mutable_requested_features(); diff --git a/samples/extensions/patch_control_points/patch_control_points.h b/samples/extensions/patch_control_points/patch_control_points.h index 059a25bf04..b216176319 100644 --- a/samples/extensions/patch_control_points/patch_control_points.h +++ b/samples/extensions/patch_control_points/patch_control_points.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -91,7 +91,7 @@ class PatchControlPoints : public ApiVulkanSample void render(float delta_time) override; void build_command_buffers() override; bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; void prepare_uniform_buffers(); diff --git a/samples/extensions/portability/CMakeLists.txt b/samples/extensions/portability/CMakeLists.txt index 18270e3aca..fe24612680 100644 --- a/samples/extensions/portability/CMakeLists.txt +++ b/samples/extensions/portability/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, Holochip +# Copyright (c) 2022-2025, Holochip # # SPDX-License-Identifier: Apache-2.0 # @@ -38,4 +38,11 @@ add_sample( "debug_utils/hlsl/bloom.vert.hlsl" "debug_utils/hlsl/bloom.frag.hlsl" "debug_utils/hlsl/gbuffer.vert.hlsl" - "debug_utils/hlsl/gbuffer.frag.hlsl") + "debug_utils/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "debug_utils/slang/composition.vert.slang" + "debug_utils/slang/composition.frag.slang" + "debug_utils/slang/bloom.vert.slang" + "debug_utils/slang/bloom.frag.slang" + "debug_utils/slang/gbuffer.vert.slang" + "debug_utils/slang/gbuffer.frag.slang") diff --git a/samples/extensions/portability/README.adoc b/samples/extensions/portability/README.adoc index eea6f080b2..9649374c66 100644 --- a/samples/extensions/portability/README.adoc +++ b/samples/extensions/portability/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2022-2023, Holochip +- Copyright (c) 2022-2025, Holochip - - SPDX-License-Identifier: Apache-2.0 - @@ -25,11 +25,11 @@ endif::[] == Overview -This tutorial, along with the accompanying example code, demonstrates the use of the https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VK_KHR_portability_subset[VK_KHR_portability_subset] extension. +This tutorial, along with the accompanying example code, demonstrates the use of the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_portability_subset[VK_KHR_portability_subset] extension. When the VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR is set in the `Instance` class, Vulkan will consider devices that aren't fully conformant such as https://github.com/KhronosGroup/MoltenVK[MoltenVk] to be identified as a conformant implementation. -When this happens, use the VkPhysicalDevicePortabilitySubsetPropertiesKHR extension with the https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#vkGetPhysicalDeviceFeatures2[vkGetPhysicalDeviceFeatures2] as detailed below to get the list of supported/unsupported features. +When this happens, use the VkPhysicalDevicePortabilitySubsetPropertiesKHR extension with the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#vkGetPhysicalDeviceFeatures2[vkGetPhysicalDeviceFeatures2] as detailed below to get the list of supported/unsupported features. -This tutorial along with the accompanying code also demonstrates the use of the https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VkPhysicalDevicePortabilitySubsetPropertiesKHR[VkPhysicalDevicePortabilitySubsetPropertiesKHR] which is currently a beta khronos extension. +This tutorial along with the accompanying code also demonstrates the use of the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VkPhysicalDevicePortabilitySubsetPropertiesKHR[VkPhysicalDevicePortabilitySubsetPropertiesKHR] which is currently a beta khronos extension. This extension provides a list of supported and unsupported parts of Vulkan on a non-conformant Vulkan instance. Build with VK_ENABLE_BETA_EXTENSIONS set to enable this. diff --git a/samples/extensions/portability/portability.cpp b/samples/extensions/portability/portability.cpp index 03c4a1cb06..a600960e7f 100644 --- a/samples/extensions/portability/portability.cpp +++ b/samples/extensions/portability/portability.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Holochip +/* Copyright (c) 2022-2025, Holochip * * SPDX-License-Identifier: Apache-2.0 * @@ -76,7 +76,7 @@ Portability::~Portability() } } -void Portability::request_gpu_features(vkb::PhysicalDevice &gpu) +void Portability::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -277,7 +277,7 @@ void Portability::create_attachment(VkFormat format, VkImageUsageFlagBits usage, VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment->image)); vkGetImageMemoryRequirements(get_device().get_handle(), attachment->image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment->mem)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment->image, attachment->mem, 0)); @@ -708,8 +708,8 @@ void Portability::prepare_pipelines() pipeline_create_info.pVertexInputState = &empty_input_state; // Final fullscreen composition pass pipeline - shader_stages[0] = load_shader("debug_utils", "composition.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("debug_utils", "composition.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("debug_utils", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("debug_utils", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); pipeline_create_info.layout = pipeline_layouts.composition; pipeline_create_info.renderPass = render_pass; rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; @@ -718,8 +718,8 @@ void Portability::prepare_pipelines() VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.composition)); // Bloom pass - shader_stages[0] = load_shader("debug_utils", "bloom.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("debug_utils", "bloom.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("debug_utils", "bloom.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("debug_utils", "bloom.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); color_blend_state.pAttachments = &blend_attachment_state; blend_attachment_state.colorWriteMask = 0xF; blend_attachment_state.blendEnable = VK_TRUE; @@ -777,8 +777,8 @@ void Portability::prepare_pipelines() color_blend_state.attachmentCount = 2; color_blend_state.pAttachments = blend_attachment_states.data(); - shader_stages[0] = load_shader("debug_utils", "gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("debug_utils", "gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("debug_utils", "gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("debug_utils", "gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &pipelines.skysphere)); // Enable depth test and write diff --git a/samples/extensions/portability/portability.h b/samples/extensions/portability/portability.h index 726c897f64..dd0beed11d 100644 --- a/samples/extensions/portability/portability.h +++ b/samples/extensions/portability/portability.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Holochip +/* Copyright (c) 2022-2025, Holochip * * SPDX-License-Identifier: Apache-2.0 * @@ -128,7 +128,7 @@ class Portability : public ApiVulkanSample Portability(); ~Portability() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void create_attachment(VkFormat format, VkImageUsageFlagBits usage, FrameBufferAttachment *attachment); void prepare_offscreen_buffer(); diff --git a/samples/extensions/push_descriptors/CMakeLists.txt b/samples/extensions/push_descriptors/CMakeLists.txt index 673feadf97..07297f782c 100644 --- a/samples/extensions/push_descriptors/CMakeLists.txt +++ b/samples/extensions/push_descriptors/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "push_descriptors/glsl/cube.frag" SHADER_FILES_HLSL "push_descriptors/hlsl/cube.vert.hlsl" - "push_descriptors/hlsl/cube.frag.hlsl") + "push_descriptors/hlsl/cube.frag.hlsl" + SHADER_FILES_SLANG + "push_descriptors/slang/cube.vert.slang" + "push_descriptors/slang/cube.frag.slang") diff --git a/samples/extensions/push_descriptors/README.adoc b/samples/extensions/push_descriptors/README.adoc index b7610817d9..428ed51ce9 100644 --- a/samples/extensions/push_descriptors/README.adoc +++ b/samples/extensions/push_descriptors/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2020-2023, Arm Limited and Contributors +- Copyright (c) 2020-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extension*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_push_descriptor[`VK_KHR_push_descriptor`] +*Extension*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_push_descriptor[`VK_KHR_push_descriptor`] Push descriptors apply the push constants concept to descriptor sets. Instead of creating per-object descriptor sets, this example passes descriptors at command buffer creation time. diff --git a/samples/extensions/push_descriptors/push_descriptors.cpp b/samples/extensions/push_descriptors/push_descriptors.cpp index 8659cdecaa..ec18d4a3ea 100644 --- a/samples/extensions/push_descriptors/push_descriptors.cpp +++ b/samples/extensions/push_descriptors/push_descriptors.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -57,7 +57,7 @@ PushDescriptors::~PushDescriptors() } } -void PushDescriptors::request_gpu_features(vkb::PhysicalDevice &gpu) +void PushDescriptors::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -237,8 +237,8 @@ void PushDescriptors::prepare_pipelines() pipeline_create_info.pDynamicState = &dynamic_state; const std::array shader_stages = { - load_shader("push_descriptors", "cube.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("push_descriptors", "cube.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}; + load_shader("push_descriptors", "cube.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("push_descriptors", "cube.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}; pipeline_create_info.stageCount = static_cast(shader_stages.size()); pipeline_create_info.pStages = shader_stages.data(); diff --git a/samples/extensions/push_descriptors/push_descriptors.h b/samples/extensions/push_descriptors/push_descriptors.h index 6802e4bba6..6e89f6447c 100644 --- a/samples/extensions/push_descriptors/push_descriptors.h +++ b/samples/extensions/push_descriptors/push_descriptors.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -69,7 +69,7 @@ class PushDescriptors : public ApiVulkanSample PushDescriptors(); ~PushDescriptors(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void load_assets(); void setup_descriptor_set_layout(); diff --git a/samples/extensions/ray_queries/CMakeLists.txt b/samples/extensions/ray_queries/CMakeLists.txt index f6f403421d..65bc2dda9d 100644 --- a/samples/extensions/ray_queries/CMakeLists.txt +++ b/samples/extensions/ray_queries/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, Holochip Corporation +# Copyright (c) 2021-2025, Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -31,5 +31,8 @@ add_sample_with_tags( SHADER_FILES_HLSL "ray_queries/hlsl/ray_shadow.vert.hlsl" "ray_queries/hlsl/ray_shadow.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_ray_query") + DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_ray_query" + SHADER_FILES_SLANG + "ray_queries/slang/ray_shadow.vert.slang" + "ray_queries/slang/ray_shadow.frag.slang") diff --git a/samples/extensions/ray_queries/README.adoc b/samples/extensions/ray_queries/README.adoc index 8dfaca36ab..05346324df 100644 --- a/samples/extensions/ray_queries/README.adoc +++ b/samples/extensions/ray_queries/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2020-2023, The Khronos Group +- Copyright (c) 2020-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_ray_query[`VK_KHR_ray_query`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_query[`VK_KHR_ray_query`], https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] Render a sponza scene using the ray query extension. Shows how to set up all data structures required for ray queries, including the bottom and top level acceleration structures for the geometry and a standard vertex/fragment shader pipeline. diff --git a/samples/extensions/ray_queries/ray_queries.cpp b/samples/extensions/ray_queries/ray_queries.cpp index f076af1a06..73fff200a7 100644 --- a/samples/extensions/ray_queries/ray_queries.cpp +++ b/samples/extensions/ray_queries/ray_queries.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2021-2024, Holochip Corporation - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Holochip Corporation + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -96,20 +96,11 @@ RayQueries::~RayQueries() } } -void RayQueries::request_gpu_features(vkb::PhysicalDevice &gpu) +void RayQueries::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceBufferDeviceAddressFeatures, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, - bufferDeviceAddress); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceAccelerationStructureFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, - accelerationStructure); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceRayQueryFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, - rayQuery); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddress); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, accelerationStructure); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayQueryFeaturesKHR, rayQuery); } void RayQueries::render(float delta_time) @@ -184,6 +175,12 @@ bool RayQueries::prepare(const vkb::ApplicationOptions &options) device_features.pNext = &acceleration_structure_features; vkGetPhysicalDeviceFeatures2(get_device().get_gpu().get_handle(), &device_features); + acceleration_structure_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR; + VkPhysicalDeviceProperties2 device_properties{}; + device_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + device_properties.pNext = &acceleration_structure_properties; + vkGetPhysicalDeviceProperties2(get_device().get_gpu().get_handle(), &device_properties); + camera.type = vkb::CameraType::FirstPerson; camera.set_perspective(60.0f, static_cast(width) / static_cast(height), 0.1f, 512.0f); camera.set_rotation(glm::vec3(0.0f, 90.0f, 0.0f)); @@ -234,6 +231,7 @@ void RayQueries::create_top_level_acceleration_structure() // Top Level AS with single instance top_level_acceleration_structure = std::make_unique(get_device(), VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR); top_level_acceleration_structure->add_instance_geometry(instances_buffer, 1); + top_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); top_level_acceleration_structure->build(queue); } @@ -279,10 +277,11 @@ void RayQueries::create_bottom_level_acceleration_structure() get_buffer_device_address(vertex_buffer->get_handle()), get_buffer_device_address(index_buffer->get_handle())); } + bottom_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); bottom_level_acceleration_structure->build(queue, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR); } -void RayQueries::load_node(vkb::sg::Node &node) +void RayQueries::load_node(vkb::scene_graph::NodeC &node) { if (node.has_component()) { @@ -459,8 +458,8 @@ void RayQueries::prepare_pipelines() pipeline_create_info.pDynamicState = &dynamic_state; const std::array shader_stages = { - load_shader("ray_queries", "ray_shadow.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("ray_queries", "ray_shadow.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}; + load_shader("ray_queries", "ray_shadow.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("ray_queries", "ray_shadow.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}; pipeline_create_info.stageCount = static_cast(shader_stages.size()); pipeline_create_info.pStages = shader_stages.data(); diff --git a/samples/extensions/ray_queries/ray_queries.h b/samples/extensions/ray_queries/ray_queries.h index 808de69667..b7f33b44c7 100644 --- a/samples/extensions/ray_queries/ray_queries.h +++ b/samples/extensions/ray_queries/ray_queries.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Holochip Corporation +/* Copyright (c) 2021-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -29,7 +29,6 @@ namespace vkb namespace sg { class Scene; -class Node; class Mesh; class SubMesh; class Camera; @@ -41,7 +40,7 @@ class RayQueries : public ApiVulkanSample public: RayQueries(); ~RayQueries() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void render(float delta_time) override; bool prepare(const vkb::ApplicationOptions &options) override; @@ -74,12 +73,13 @@ class RayQueries : public ApiVulkanSample std::unique_ptr uniform_buffer{nullptr}; // Ray tracing structures - VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{}; - std::unique_ptr top_level_acceleration_structure = nullptr; - std::unique_ptr bottom_level_acceleration_structure = nullptr; - uint64_t get_buffer_device_address(VkBuffer buffer); - void create_top_level_acceleration_structure(); - void create_bottom_level_acceleration_structure(); + VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{}; + VkPhysicalDeviceAccelerationStructurePropertiesKHR acceleration_structure_properties{}; + std::unique_ptr top_level_acceleration_structure = nullptr; + std::unique_ptr bottom_level_acceleration_structure = nullptr; + uint64_t get_buffer_device_address(VkBuffer buffer); + void create_top_level_acceleration_structure(); + void create_bottom_level_acceleration_structure(); VkPipeline pipeline{VK_NULL_HANDLE}; VkPipelineLayout pipeline_layout{VK_NULL_HANDLE}; @@ -88,7 +88,7 @@ class RayQueries : public ApiVulkanSample void build_command_buffers() override; void create_uniforms(); - void load_node(vkb::sg::Node &node); + void load_node(vkb::scene_graph::NodeC &node); void load_scene(); void create_descriptor_pool(); void create_descriptor_sets(); diff --git a/samples/extensions/ray_tracing_basic/CMakeLists.txt b/samples/extensions/ray_tracing_basic/CMakeLists.txt index 9561a1e057..73b09082e6 100644 --- a/samples/extensions/ray_tracing_basic/CMakeLists.txt +++ b/samples/extensions/ray_tracing_basic/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2024, Sascha Willems +# Copyright (c) 2019-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -29,10 +29,16 @@ add_sample_with_tags( "ray_tracing_basic/glsl/raygen.rgen" "ray_tracing_basic/glsl/miss.rmiss" "ray_tracing_basic/glsl/closesthit.rchit" - SHADER_FILES_HLSL + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" + SHADER_FILES_HLSL "ray_tracing_basic/hlsl/raygen.rgen.hlsl" "ray_tracing_basic/hlsl/miss.rmiss.hlsl" "ray_tracing_basic/hlsl/closesthit.rchit.hlsl" DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_ray_query" -) + SHADER_FILES_SLANG + "ray_tracing_basic/slang/raygen.rgen.slang" + "ray_tracing_basic/slang/miss.rmiss.slang" + "ray_tracing_basic/slang/closesthit.rchit.slang" + ) diff --git a/samples/extensions/ray_tracing_basic/README.adoc b/samples/extensions/ray_tracing_basic/README.adoc index dafd396135..27d570f317 100644 --- a/samples/extensions/ray_tracing_basic/README.adoc +++ b/samples/extensions/ray_tracing_basic/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2020-2023, The Khronos Group +- Copyright (c) 2020-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extensions*: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] +*Extensions*: https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_ray_tracing_pipeline[`VK_KHR_ray_tracing_pipeline`], https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_acceleration_structure[`VK_KHR_acceleration_structure`] Render a basic scene using the official cross-vendor ray tracing extension. Shows how to setup all data structures required for ray tracing, including the bottom and top level acceleration structures for the geometry, the shader binding table and the ray tracing pipelines with shader groups for ray generation, ray hits, and ray misses. diff --git a/samples/extensions/ray_tracing_basic/ray_tracing_basic.cpp b/samples/extensions/ray_tracing_basic/ray_tracing_basic.cpp index 9378e3614a..ab66c0481f 100644 --- a/samples/extensions/ray_tracing_basic/ray_tracing_basic.cpp +++ b/samples/extensions/ray_tracing_basic/ray_tracing_basic.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -62,24 +62,15 @@ RaytracingBasic::~RaytracingBasic() } } -void RaytracingBasic::request_gpu_features(vkb::PhysicalDevice &gpu) +void RaytracingBasic::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable extension features required by this sample // These are passed to device creation via a pNext structure chain - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceBufferDeviceAddressFeatures, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, - bufferDeviceAddress); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceRayTracingPipelineFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, - rayTracingPipeline); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceAccelerationStructureFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, - accelerationStructure); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddress); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, rayTracingPipeline); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, accelerationStructure); } /* @@ -108,7 +99,7 @@ void RaytracingBasic::create_storage_image() vkGetImageMemoryRequirements(get_device().get_handle(), storage_image.image, &memory_requirements); VkMemoryAllocateInfo memory_allocate_info = vkb::initializers::memory_allocate_info(); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &storage_image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), storage_image.image, storage_image.memory, 0)); @@ -172,7 +163,7 @@ ScratchBuffer RaytracingBasic::create_scratch_buffer(VkDeviceSize size) memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; memory_allocate_info.pNext = &memory_allocate_flags_info; memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &scratch_buffer.memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), scratch_buffer.handle, scratch_buffer.memory, 0)); @@ -592,9 +583,6 @@ void RaytracingBasic::create_ray_tracing_pipeline() VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout)); - // Ray tracing shaders require SPIR-V 1.4, so we need to set the appropriate target environment for the glslang compiler - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); - /* Setup ray tracing shader groups Each shader group points at the corresponding shader in the pipeline @@ -603,7 +591,7 @@ void RaytracingBasic::create_ray_tracing_pipeline() // Ray generation group { - shader_stages.push_back(load_shader("ray_tracing_basic", "raygen.rgen", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_basic", "raygen.rgen.spv", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR raygen_group_ci{}; raygen_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; raygen_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; @@ -616,7 +604,7 @@ void RaytracingBasic::create_ray_tracing_pipeline() // Ray miss group { - shader_stages.push_back(load_shader("ray_tracing_basic", "miss.rmiss", VK_SHADER_STAGE_MISS_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_basic", "miss.rmiss.spv", VK_SHADER_STAGE_MISS_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR miss_group_ci{}; miss_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; miss_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; @@ -629,7 +617,7 @@ void RaytracingBasic::create_ray_tracing_pipeline() // Ray closest hit group { - shader_stages.push_back(load_shader("ray_tracing_basic", "closesthit.rchit", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_basic", "closesthit.rchit.spv", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR closes_hit_group_ci{}; closes_hit_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; closes_hit_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR; @@ -757,8 +745,13 @@ void RaytracingBasic::build_command_buffers() // Prepare current swap chain image as transfer destination vkb::image_layout_transition(draw_cmd_buffers[i], get_render_context().get_swapchain().get_images()[i], + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + {}, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresource_range); // Prepare ray tracing output image as transfer source vkb::image_layout_transition(draw_cmd_buffers[i], diff --git a/samples/extensions/ray_tracing_basic/ray_tracing_basic.h b/samples/extensions/ray_tracing_basic/ray_tracing_basic.h index c34c60c4ab..2a0160fe52 100644 --- a/samples/extensions/ray_tracing_basic/ray_tracing_basic.h +++ b/samples/extensions/ray_tracing_basic/ray_tracing_basic.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Sascha Willems +/* Copyright (c) 2019-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" // Holds data for a scratch buffer used as a temporary storage during acceleration structure builds struct ScratchBuffer @@ -83,7 +82,7 @@ class RaytracingBasic : public ApiVulkanSample RaytracingBasic(); ~RaytracingBasic(); - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; uint64_t get_buffer_device_address(VkBuffer buffer); ScratchBuffer create_scratch_buffer(VkDeviceSize size); void delete_scratch_buffer(ScratchBuffer &scratch_buffer); diff --git a/samples/extensions/ray_tracing_extended/CMakeLists.txt b/samples/extensions/ray_tracing_extended/CMakeLists.txt index e171dcdc1d..4dd2bf591d 100644 --- a/samples/extensions/ray_tracing_extended/CMakeLists.txt +++ b/samples/extensions/ray_tracing_extended/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024 Holochip Corporation +# Copyright (c) 2021-2025 Holochip Corporation # # SPDX-License-Identifier: Apache-2.0 # @@ -29,9 +29,17 @@ add_sample_with_tags( "ray_tracing_extended/glsl/raygen.rgen" "ray_tracing_extended/glsl/miss.rmiss" "ray_tracing_extended/glsl/closesthit.rchit" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" SHADER_FILES_HLSL "ray_tracing_extended/hlsl/raygen.rgen.hlsl" "ray_tracing_extended/hlsl/miss.rmiss.hlsl" "ray_tracing_extended/hlsl/closesthit.rchit.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_descriptor_indexing -fspv-extension=SPV_KHR_ray_query") + DXC_ADDITIONAL_ARGUMENTS + "-fspv-extension=SPV_EXT_descriptor_indexing -fspv-extension=SPV_KHR_ray_query" + SHADER_FILES_SLANG + "ray_tracing_extended/slang/raygen.rgen.slang" + "ray_tracing_extended/slang/miss.rmiss.slang" + "ray_tracing_extended/slang/closesthit.rchit.slang" + ) diff --git a/samples/extensions/ray_tracing_extended/ray_tracing_extended.cpp b/samples/extensions/ray_tracing_extended/ray_tracing_extended.cpp index d95373b614..ef8afdb626 100644 --- a/samples/extensions/ray_tracing_extended/ray_tracing_extended.cpp +++ b/samples/extensions/ray_tracing_extended/ray_tracing_extended.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024 Holochip Corporation +/* Copyright (c) 2021-2025 Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -133,29 +133,17 @@ RaytracingExtended::~RaytracingExtended() } } -void RaytracingExtended::request_gpu_features(vkb::PhysicalDevice &gpu) +void RaytracingExtended::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable extension features required by this sample // These are passed to device creation via a pNext structure chain - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceBufferDeviceAddressFeatures, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, - bufferDeviceAddress); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceRayTracingPipelineFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, - rayTracingPipeline); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceAccelerationStructureFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, - accelerationStructure); - - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDescriptorIndexingFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - shaderSampledImageArrayNonUniformIndexing); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddress); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, rayTracingPipeline); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, accelerationStructure); + + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, shaderSampledImageArrayNonUniformIndexing); if (gpu.get_features().samplerAnisotropy) { @@ -189,7 +177,7 @@ void RaytracingExtended::create_storage_image() vkGetImageMemoryRequirements(get_device().get_handle(), storage_image.image, &memory_requirements); VkMemoryAllocateInfo memory_allocate_info = vkb::initializers::memory_allocate_info(); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &storage_image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), storage_image.image, storage_image.memory, 0)); @@ -306,26 +294,26 @@ void RaytracingExtended::create_static_object_buffers() // now transfer over to the end buffer if (scene_options.use_vertex_staging_buffer) { - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); auto copy = [this, &cmd](vkb::core::BufferC &staging_buffer) { auto output_buffer = std::make_unique(get_device(), staging_buffer.get_size(), buffer_usage_flags | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_ONLY); - cmd.copy_buffer(staging_buffer, *output_buffer, staging_buffer.get_size()); + cmd->copy_buffer(staging_buffer, *output_buffer, staging_buffer.get_size()); vkb::BufferMemoryBarrier barrier; barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; barrier.dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; barrier.src_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; - cmd.buffer_memory_barrier(*output_buffer, 0, VK_WHOLE_SIZE, barrier); + cmd->buffer_memory_barrier(*output_buffer, 0, VK_WHOLE_SIZE, barrier); return output_buffer; }; vertex_buffer = copy(*staging_vertex_buffer); index_buffer = copy(*staging_index_buffer); - cmd.end(); + cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(cmd, get_device().request_fence()); + queue.submit(*cmd, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); } else @@ -417,6 +405,7 @@ void RaytracingExtended::create_bottom_level_acceleration_structure(bool is_upda model_buffer.vertex_offset + (model_buffer.is_static ? static_vertex_handle : dynamic_vertex_handle), model_buffer.index_offset + (model_buffer.is_static ? static_index_handle : dynamic_index_handle)); } + model_buffer.bottom_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); model_buffer.bottom_level_acceleration_structure->build(queue, model_buffer.is_static ? VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR : VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR | VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR, is_update ? VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR : VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR); @@ -470,6 +459,7 @@ void RaytracingExtended::create_bottom_level_acceleration_structure(bool is_upda uint32_t primitive_count = model_buffer.num_triangles; auto &acceleration_structure_build_sizes_info = model_buffer.buildSize; + acceleration_structure_build_sizes_info.pNext = nullptr; acceleration_structure_build_sizes_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR; vkGetAccelerationStructureBuildSizesKHR( get_device().get_handle(), @@ -502,10 +492,11 @@ void RaytracingExtended::create_bottom_level_acceleration_structure(bool is_upda // The actual build process starts here // Create a scratch buffer as a temporary storage for the acceleration structure build - auto scratch_buffer = std::make_unique(get_device(), - model_buffer.buildSize.buildScratchSize, - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); + auto scratch_buffer = std::make_unique(get_device(), vkb::core::BufferBuilderC(model_buffer.buildSize.buildScratchSize) + .with_usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) + .with_vma_usage(VMA_MEMORY_USAGE_GPU_ONLY) + .with_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment)); + { VkAccelerationStructureBuildGeometryInfoKHR acceleration_build_geometry_info{}; acceleration_build_geometry_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR; @@ -632,7 +623,7 @@ void RaytracingExtended::create_top_level_acceleration_structure(bool print_time { // find the flame particle object, then add the particles as instances auto &model_buffers = raytracing_scene->model_buffers; - auto iter = std::find_if(model_buffers.begin(), model_buffers.end(), [](const ModelBuffer &model_buffer) { + auto iter = std::ranges::find_if(model_buffers, [](const ModelBuffer &model_buffer) { return model_buffer.object_type == ObjectType::OBJECT_FLAME; }); ASSERT_LOG(iter != model_buffers.cend(), "Can't find flame object.") @@ -671,6 +662,7 @@ void RaytracingExtended::create_top_level_acceleration_structure(bool print_time { top_level_acceleration_structure->update_instance_geometry(instance_uid, instances_buffer, static_cast(instances.size())); } + top_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); top_level_acceleration_structure->build(queue); #else VkDeviceOrHostAddressConstKHR instance_data_device_address{}; @@ -735,9 +727,10 @@ void RaytracingExtended::create_top_level_acceleration_structure(bool print_time // Create a scratch buffer as a temporary storage for the acceleration structure build auto scratch_buffer = std::make_unique(get_device(), - acceleration_structure_build_sizes_info.buildScratchSize, - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); + vkb::core::BufferBuilderC(acceleration_structure_build_sizes_info.buildScratchSize) + .with_usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT) + .with_vma_usage(VMA_MEMORY_USAGE_GPU_ONLY) + .with_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment)); VkAccelerationStructureBuildGeometryInfoKHR acceleration_build_geometry_info{}; acceleration_build_geometry_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR; @@ -869,9 +862,21 @@ void RaytracingExtended::create_shader_binding_tables() // Raygen // Create binding table buffers for each shader type - raygen_shader_binding_table = std::make_unique(get_device(), handle_size, sbt_buffer_usage_flags, sbt_memory_usage, 0); - miss_shader_binding_table = std::make_unique(get_device(), handle_size, sbt_buffer_usage_flags, sbt_memory_usage, 0); - hit_shader_binding_table = std::make_unique(get_device(), handle_size, sbt_buffer_usage_flags, sbt_memory_usage, 0); + raygen_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_vma_flags(0) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); + miss_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_vma_flags(0) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); + hit_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_vma_flags(0) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); // Copy the pipeline's shader handles into a host buffer std::vector shader_handle_storage(sbt_size); @@ -1133,9 +1138,6 @@ void RaytracingExtended::create_ray_tracing_pipeline() VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout)); - // Ray tracing shaders require SPIR-V 1.4, so we need to set the appropriate target environment for the GLSLang compiler - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); - /* Setup ray tracing shader groups Each shader group points at the corresponding shader in the pipeline @@ -1144,7 +1146,7 @@ void RaytracingExtended::create_ray_tracing_pipeline() // Ray generation group { - shader_stages.push_back(load_shader("ray_tracing_extended", "raygen.rgen", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_extended", "raygen.rgen.spv", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); shader_stages.back().pSpecializationInfo = &specializationInfo; VkRayTracingShaderGroupCreateInfoKHR raygen_group_ci{}; raygen_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; @@ -1158,7 +1160,7 @@ void RaytracingExtended::create_ray_tracing_pipeline() // Ray miss group { - shader_stages.push_back(load_shader("ray_tracing_extended", "miss.rmiss", VK_SHADER_STAGE_MISS_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_extended", "miss.rmiss.spv", VK_SHADER_STAGE_MISS_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR miss_group_ci{}; miss_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; miss_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; @@ -1171,7 +1173,7 @@ void RaytracingExtended::create_ray_tracing_pipeline() // Ray closest hit group { - shader_stages.push_back(load_shader("ray_tracing_extended", "closesthit.rchit", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_extended", "closesthit.rchit.spv", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); shader_stages.back().pSpecializationInfo = &specializationInfo; VkRayTracingShaderGroupCreateInfoKHR closes_hit_group_ci{}; closes_hit_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; @@ -1365,8 +1367,13 @@ bool RaytracingExtended::prepare(const vkb::ApplicationOptions &options) std::set image_usage_flags = {VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT}; get_render_context().update_swapchain(image_usage_flags); + // Get the acceleration structure properties + acceleration_structure_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR; + // Get the ray tracing pipeline properties, which we'll need later on in the sample ray_tracing_pipeline_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR; + ray_tracing_pipeline_properties.pNext = &acceleration_structure_properties; + VkPhysicalDeviceProperties2 device_properties{}; device_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; device_properties.pNext = &ray_tracing_pipeline_properties; @@ -1408,7 +1415,7 @@ void RaytracingExtended::draw() submit.commandBufferCount = 1; submit.pCommandBuffers = &raytracing_command_buffers[i]; - VK_CHECK(vkQueueSubmit(queue, 1, &submit, get_device().request_fence())); + VK_CHECK(vkQueueSubmit(queue, 1, &submit, get_device().get_fence_pool().request_fence())); get_device().get_fence_pool().wait(); recreate_current_command_buffer(); @@ -1422,8 +1429,13 @@ void RaytracingExtended::draw() // Prepare current swap chain image as transfer destination vkb::image_layout_transition(draw_cmd_buffers[i], get_render_context().get_swapchain().get_images()[i], + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + {}, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresource_range); // Prepare ray tracing output image as transfer source vkb::image_layout_transition(draw_cmd_buffers[i], @@ -1465,7 +1477,7 @@ void RaytracingExtended::draw() submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &draw_cmd_buffers[current_buffer]; - VK_CHECK(vkQueueSubmit(queue, 1, &submit_info, get_device().request_fence())); + VK_CHECK(vkQueueSubmit(queue, 1, &submit_info, get_device().get_fence_pool().request_fence())); get_device().get_fence_pool().wait(); ApiVulkanSample::submit_frame(); } @@ -1495,7 +1507,7 @@ std::unique_ptr create_ray_tracing_extended() return std::make_unique(); } -RaytracingExtended::RaytracingScene::RaytracingScene(vkb::Device &device, const std::vector &scenesToLoad) +RaytracingExtended::RaytracingScene::RaytracingScene(vkb::core::DeviceC &device, const std::vector &scenesToLoad) { vkb::GLTFLoader loader{device}; scenes.resize(scenesToLoad.size()); @@ -1529,7 +1541,7 @@ RaytracingExtended::RaytracingScene::RaytracingScene(vkb::Device &device, const VkDescriptorImageInfo imageInfo; imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; imageInfo.imageView = image->get_vk_image_view().get_handle(); - imageInfo.sampler = baseTextureIter->second->get_sampler()->vk_sampler.get_handle(); + imageInfo.sampler = baseTextureIter->second->get_sampler()->get_core_sampler().get_handle(); imageInfos.push_back(imageInfo); } diff --git a/samples/extensions/ray_tracing_extended/ray_tracing_extended.h b/samples/extensions/ray_tracing_extended/ray_tracing_extended.h index 875980a7d8..7fc709e746 100644 --- a/samples/extensions/ray_tracing_extended/ray_tracing_extended.h +++ b/samples/extensions/ray_tracing_extended/ray_tracing_extended.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024 Holochip Corporation +/* Copyright (c) 2021-2025 Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -24,14 +24,14 @@ #define USE_FRAMEWORK_ACCELERATION_STRUCTURE #include "api_vulkan_sample.h" -#include "glsl_compiler.h" #include class RaytracingExtended : public ApiVulkanSample { public: - VkPhysicalDeviceRayTracingPipelinePropertiesKHR ray_tracing_pipeline_properties{}; - VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{}; + VkPhysicalDeviceRayTracingPipelinePropertiesKHR ray_tracing_pipeline_properties{}; + VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{}; + VkPhysicalDeviceAccelerationStructurePropertiesKHR acceleration_structure_properties{}; enum RenderMode : uint32_t { @@ -196,7 +196,7 @@ class RaytracingExtended : public ApiVulkanSample { RaytracingScene() = default; ~RaytracingScene() = default; - RaytracingScene(vkb::Device &device, const std::vector &scenesToLoad); + RaytracingScene(vkb::core::DeviceC &device, const std::vector &scenesToLoad); std::vector> scenes; std::vector imageInfos; std::vector models; @@ -261,7 +261,7 @@ class RaytracingExtended : public ApiVulkanSample RaytracingExtended(); ~RaytracingExtended() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; uint64_t get_buffer_device_address(VkBuffer buffer); void create_storage_image(); void create_static_object_buffers(); diff --git a/samples/extensions/ray_tracing_position_fetch/CMakeLists.txt b/samples/extensions/ray_tracing_position_fetch/CMakeLists.txt index 826287a804..e2d5f9c27d 100644 --- a/samples/extensions/ray_tracing_position_fetch/CMakeLists.txt +++ b/samples/extensions/ray_tracing_position_fetch/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Sascha Willems +# Copyright (c) 2024-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -29,9 +29,16 @@ add_sample( "ray_tracing_position_fetch/glsl/closesthit.rchit" "ray_tracing_position_fetch/glsl/miss.rmiss" "ray_tracing_position_fetch/glsl/raygen.rgen" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4" SHADER_FILES_HLSL "ray_tracing_position_fetch/hlsl/closesthit.rchit.hlsl" "ray_tracing_position_fetch/hlsl/miss.rmiss.hlsl" "ray_tracing_position_fetch/hlsl/raygen.rgen.hlsl" - DXC_ADDITIONAL_ARGUMENTS - "-fspv-extension=SPV_KHR_ray_query -fspv-extension=SPV_KHR_ray_tracing") + DXC_ADDITIONAL_ARGUMENTS + "-fspv-extension=SPV_KHR_ray_query -fspv-extension=SPV_KHR_ray_tracing" + SHADER_FILES_SLANG + "ray_tracing_position_fetch/slang/closesthit.rchit.slang" + "ray_tracing_position_fetch/slang/miss.rmiss.slang" + "ray_tracing_position_fetch/slang/raygen.rgen.slang" + ) diff --git a/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.cpp b/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.cpp index 24dd77793a..8d326e6327 100644 --- a/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.cpp +++ b/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -60,21 +60,15 @@ RayTracingPositionFetch::~RayTracingPositionFetch() } } -void RayTracingPositionFetch::request_gpu_features(vkb::PhysicalDevice &gpu) +void RayTracingPositionFetch::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Features required for ray tracing - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDeviceBufferDeviceAddressFeatures, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, bufferDeviceAddress); - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, rayTracingPipeline); - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, accelerationStructure); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeatures, bufferDeviceAddress); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, rayTracingPipeline); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, accelerationStructure); // Sample sepcific feature - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, - rayTracingPositionFetch); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR, rayTracingPositionFetch); } /* @@ -103,7 +97,7 @@ void RayTracingPositionFetch::create_storage_image() vkGetImageMemoryRequirements(get_device().get_handle(), storage_image.image, &memory_requirements); VkMemoryAllocateInfo memory_allocate_info = vkb::initializers::memory_allocate_info(); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &storage_image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), storage_image.image, storage_image.memory, 0)); @@ -178,7 +172,7 @@ void RayTracingPositionFetch::create_bottom_level_acceleration_structure() VK_GEOMETRY_OPAQUE_BIT_KHR); } } - + bottom_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); // To access vertex positions from a shader, we need to set the VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR for the bottom level acceleration structure VkBuildAccelerationStructureFlagsKHR acceleration_build_flags = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR | VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR; bottom_level_acceleration_structure->build(queue, acceleration_build_flags, VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR); @@ -210,6 +204,7 @@ void RayTracingPositionFetch::create_top_level_acceleration_structure() top_level_acceleration_structure = std::make_unique(get_device(), VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR); top_level_acceleration_structure->add_instance_geometry(instances_buffer, 1); + top_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); top_level_acceleration_structure->build(queue); } @@ -252,9 +247,18 @@ void RayTracingPositionFetch::create_shader_binding_tables() // Raygen // Create binding table buffers for each shader type - raygen_shader_binding_table = std::make_unique(get_device(), handle_size, sbt_buffer_usage_flags, sbt_memory_usage, 0); - miss_shader_binding_table = std::make_unique(get_device(), handle_size, sbt_buffer_usage_flags, sbt_memory_usage, 0); - hit_shader_binding_table = std::make_unique(get_device(), handle_size, sbt_buffer_usage_flags, sbt_memory_usage, 0); + raygen_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); + miss_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); + hit_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); // Copy the pipeline's shader handles into a host buffer std::vector shader_handle_storage(sbt_size); @@ -336,9 +340,6 @@ void RayTracingPositionFetch::create_ray_tracing_pipeline() VkPipelineLayoutCreateInfo pipeline_layout_create_info = vkb::initializers::pipeline_layout_create_info(&descriptor_set_layout, 1); VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout)); - // Ray tracing shaders require SPIR-V 1.4, so we need to set the appropriate target environment for the glslang compiler - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); - /* Setup ray tracing shader groups Each shader group points at the corresponding shader in the pipeline @@ -346,7 +347,7 @@ void RayTracingPositionFetch::create_ray_tracing_pipeline() std::vector shader_stages; // Ray generation group - shader_stages.push_back(load_shader("ray_tracing_position_fetch", "raygen.rgen", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_position_fetch", "raygen.rgen.spv", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR raygen_group_ci{}; raygen_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; raygen_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; @@ -357,7 +358,7 @@ void RayTracingPositionFetch::create_ray_tracing_pipeline() shader_groups.push_back(raygen_group_ci); // Ray miss group - shader_stages.push_back(load_shader("ray_tracing_position_fetch", "miss.rmiss", VK_SHADER_STAGE_MISS_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_position_fetch", "miss.rmiss.spv", VK_SHADER_STAGE_MISS_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR miss_group_ci{}; miss_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; miss_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; @@ -368,7 +369,7 @@ void RayTracingPositionFetch::create_ray_tracing_pipeline() shader_groups.push_back(miss_group_ci); // Ray closest hit group - shader_stages.push_back(load_shader("ray_tracing_position_fetch", "closesthit.rchit", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_position_fetch", "closesthit.rchit.spv", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR closes_hit_group_ci{}; closes_hit_group_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR; closes_hit_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR; @@ -476,8 +477,13 @@ void RayTracingPositionFetch::build_command_buffers() // Prepare current swap chain image as transfer destination vkb::image_layout_transition(draw_cmd_buffers[i], get_render_context().get_swapchain().get_images()[i], + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + {}, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresource_range); // Prepare ray tracing output image as transfer source vkb::image_layout_transition(draw_cmd_buffers[i], @@ -560,8 +566,12 @@ bool RayTracingPositionFetch::prepare(const vkb::ApplicationOptions &options) // This sample renders the UI overlay on top of the ray tracing output, so we need to disable color attachment clears update_render_pass_flags(RenderPassCreateFlags::ColorAttachmentLoad); + acceleration_structure_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR; + // Get the ray tracing pipeline properties, which we'll need later on in the sample ray_tracing_pipeline_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR; + ray_tracing_pipeline_properties.pNext = &acceleration_structure_properties; + VkPhysicalDeviceProperties2 device_properties{}; device_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; device_properties.pNext = &ray_tracing_pipeline_properties; diff --git a/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.h b/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.h index 4721b2e13c..196398a451 100644 --- a/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.h +++ b/samples/extensions/ray_tracing_position_fetch/ray_tracing_position_fetch.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -18,14 +18,14 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" #include class RayTracingPositionFetch : public ApiVulkanSample { public: - VkPhysicalDeviceRayTracingPipelinePropertiesKHR ray_tracing_pipeline_properties{}; - VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{}; + VkPhysicalDeviceRayTracingPipelinePropertiesKHR ray_tracing_pipeline_properties{}; + VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{}; + VkPhysicalDeviceAccelerationStructurePropertiesKHR acceleration_structure_properties{}; std::unique_ptr bottom_level_acceleration_structure{nullptr}; std::unique_ptr top_level_acceleration_structure{nullptr}; @@ -64,7 +64,7 @@ class RayTracingPositionFetch : public ApiVulkanSample RayTracingPositionFetch(); virtual ~RayTracingPositionFetch(); - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void create_storage_image(); void create_bottom_level_acceleration_structure(); void create_top_level_acceleration_structure(); diff --git a/samples/extensions/ray_tracing_reflection/CMakeLists.txt b/samples/extensions/ray_tracing_reflection/CMakeLists.txt index 796905d8f1..3e0d86210c 100644 --- a/samples/extensions/ray_tracing_reflection/CMakeLists.txt +++ b/samples/extensions/ray_tracing_reflection/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION -# SPDX-License-Identifier: Apache-2.0 - get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) @@ -33,5 +30,8 @@ add_sample_with_tags( "ray_tracing_reflection/raygen.rgen" "ray_tracing_reflection/miss.rmiss" "ray_tracing_reflection/missShadow.rmiss" - "ray_tracing_reflection/closesthit.rchit") + "ray_tracing_reflection/closesthit.rchit" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.5" + ) diff --git a/samples/extensions/ray_tracing_reflection/README.adoc b/samples/extensions/ray_tracing_reflection/README.adoc index cd9671eceb..a12ef367b6 100644 --- a/samples/extensions/ray_tracing_reflection/README.adoc +++ b/samples/extensions/ray_tracing_reflection/README.adoc @@ -1,5 +1,5 @@ //// -* Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved. +* Copyright (c) 2014-2025, NVIDIA CORPORATION. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * SPDX-FileCopyrightText: Copyright (c) 2014-2023 NVIDIA CORPORATION + * SPDX-FileCopyrightText: Copyright (c) 2014-2025 NVIDIA CORPORATION * SPDX-License-Identifier: Apache-2.0 //// = Ray tracing - reflection @@ -27,7 +27,7 @@ image::./img1.png[] == Overview -This sample is a extended version of the link:../raytracing_basic[ray tracing basic] with the addition of multiple geometries, instances and materials. +This sample is a extended version of the link:../ray_tracing_basic[ray tracing basic] with the addition of multiple geometries, instances and materials. In addition, this sample is showing how to cast shadow rays and reflections. diff --git a/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.cpp b/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.cpp index 0f0b44dbd4..31a6ded930 100644 --- a/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.cpp +++ b/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,9 +12,6 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * - * SPDX-FileCopyrightText: Copyright (c) 2014-2024 NVIDIA CORPORATION - * SPDX-License-Identifier: Apache-2.0 */ /* @@ -131,12 +128,12 @@ RaytracingReflection::~RaytracingReflection() Enable extension features required by this sample These are passed to device creation via a pNext structure chain */ -void RaytracingReflection::request_gpu_features(vkb::PhysicalDevice &gpu) +void RaytracingReflection::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, bufferDeviceAddress); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, scalarBlockLayout); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, accelerationStructure); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, rayTracingPipeline); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, bufferDeviceAddress); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, scalarBlockLayout); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, accelerationStructure); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayTracingPipelineFeaturesKHR, rayTracingPipeline); if (gpu.get_features().shaderInt64) { @@ -174,7 +171,7 @@ void RaytracingReflection::create_storage_image() vkGetImageMemoryRequirements(get_device().get_handle(), storage_image.image, &memory_requirements); VkMemoryAllocateInfo memory_allocate_info{VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO}; memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &storage_image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), storage_image.image, storage_image.memory, 0)); @@ -274,9 +271,10 @@ void RaytracingReflection::create_bottom_level_acceleration_structure(ObjModelGp // Create a scratch buffer as a temporary storage for the acceleration structure build std::unique_ptr sc_buffer; - sc_buffer = std::make_unique(get_device(), acceleration_structure_build_sizes_info.buildScratchSize, - VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); + sc_buffer = std::make_unique(get_device(), vkb::core::BufferBuilderC(acceleration_structure_build_sizes_info.buildScratchSize) + .with_usage(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) + .with_vma_usage(VMA_MEMORY_USAGE_CPU_TO_GPU) + .with_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment)); VkAccelerationStructureBuildGeometryInfoKHR acceleration_build_geometry_info{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR}; acceleration_build_geometry_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; @@ -366,9 +364,10 @@ void RaytracingReflection::create_top_level_acceleration_structure(std::vector sc_buffer; - sc_buffer = std::make_unique(get_device(), acceleration_structure_build_sizes_info.buildScratchSize, - VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, - VMA_MEMORY_USAGE_CPU_TO_GPU); + sc_buffer = std::make_unique(get_device(), vkb::core::BufferBuilderC(acceleration_structure_build_sizes_info.buildScratchSize) + .with_usage(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) + .with_vma_usage(VMA_MEMORY_USAGE_CPU_TO_GPU) + .with_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment)); VkAccelerationStructureBuildGeometryInfoKHR acceleration_build_geometry_info{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR}; acceleration_build_geometry_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR; @@ -578,9 +577,18 @@ void RaytracingReflection::create_shader_binding_tables() const VmaMemoryUsage sbt_memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU; // Create binding table buffers for each shader type - raygen_shader_binding_table = std::make_unique(get_device(), handle_size_aligned * rgen_index.size(), sbt_buffer_usage_flags, sbt_memory_usage, 0); - miss_shader_binding_table = std::make_unique(get_device(), handle_size_aligned * miss_index.size(), sbt_buffer_usage_flags, sbt_memory_usage, 0); - hit_shader_binding_table = std::make_unique(get_device(), handle_size_aligned * hit_index.size(), sbt_buffer_usage_flags, sbt_memory_usage, 0); + raygen_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size_aligned * rgen_index.size()) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); + miss_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size_aligned * miss_index.size()) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); + hit_shader_binding_table = std::make_unique(get_device(), vkb::core::BufferBuilderC(handle_size_aligned * hit_index.size()) + .with_usage(sbt_buffer_usage_flags) + .with_vma_usage(sbt_memory_usage) + .with_alignment(ray_tracing_pipeline_properties.shaderGroupBaseAlignment)); // Copy the pipeline's shader handles into a host buffer const auto group_count = static_cast(rgen_index.size() + miss_index.size() + hit_index.size()); @@ -707,9 +715,6 @@ void RaytracingReflection::create_ray_tracing_pipeline() VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout)); - // Ray tracing shaders + buffer reference require SPIR-V 1.5, so we need to set the appropriate target environment for the glslang compiler - vkb::GLSLCompiler::set_target_environment(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5); - /* Setup ray tracing shader groups Each shader group points at the corresponding shader in the pipeline @@ -718,7 +723,7 @@ void RaytracingReflection::create_ray_tracing_pipeline() // Ray generation group { - shader_stages.push_back(load_shader("ray_tracing_reflection/raygen.rgen", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_reflection/raygen.rgen.spv", VK_SHADER_STAGE_RAYGEN_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR raygen_group_ci{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; raygen_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; raygen_group_ci.generalShader = static_cast(shader_stages.size()) - 1; @@ -730,7 +735,7 @@ void RaytracingReflection::create_ray_tracing_pipeline() // Ray miss group { - shader_stages.push_back(load_shader("ray_tracing_reflection/miss.rmiss", VK_SHADER_STAGE_MISS_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_reflection/miss.rmiss.spv", VK_SHADER_STAGE_MISS_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR miss_group_ci{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; miss_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; miss_group_ci.generalShader = static_cast(shader_stages.size()) - 1; @@ -742,7 +747,7 @@ void RaytracingReflection::create_ray_tracing_pipeline() // Ray miss (shadow) group { - shader_stages.push_back(load_shader("ray_tracing_reflection/missShadow.rmiss", VK_SHADER_STAGE_MISS_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_reflection/missShadow.rmiss.spv", VK_SHADER_STAGE_MISS_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR miss_group_ci{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; miss_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; miss_group_ci.generalShader = static_cast(shader_stages.size()) - 1; @@ -754,7 +759,7 @@ void RaytracingReflection::create_ray_tracing_pipeline() // Ray closest hit group { - shader_stages.push_back(load_shader("ray_tracing_reflection/closesthit.rchit", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); + shader_stages.push_back(load_shader("ray_tracing_reflection/closesthit.rchit.spv", VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)); VkRayTracingShaderGroupCreateInfoKHR closes_hit_group_ci{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; closes_hit_group_ci.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR; closes_hit_group_ci.generalShader = VK_SHADER_UNUSED_KHR; @@ -878,8 +883,13 @@ void RaytracingReflection::build_command_buffers() // Prepare current swap chain image as transfer destination vkb::image_layout_transition(draw_cmd_buffers[i], get_render_context().get_swapchain().get_images()[i], + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + {}, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresource_range); // Prepare ray tracing output image as transfer source vkb::image_layout_transition(draw_cmd_buffers[i], diff --git a/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.h b/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.h index 678b8b68ca..d2c38f17e6 100644 --- a/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.h +++ b/samples/extensions/ray_tracing_reflection/ray_tracing_reflection.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,9 +12,6 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * - * SPDX-FileCopyrightText: Copyright (c) 2014-2024 NVIDIA CORPORATION - * SPDX-License-Identifier: Apache-2.0 */ /* @@ -24,7 +21,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" struct ObjMaterial { @@ -65,8 +61,9 @@ class RaytracingReflection : public ApiVulkanSample }; public: - VkPhysicalDeviceRayTracingPipelinePropertiesKHR ray_tracing_pipeline_properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR}; - VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR}; + VkPhysicalDeviceRayTracingPipelinePropertiesKHR ray_tracing_pipeline_properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR}; + VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR}; + VkPhysicalDeviceAccelerationStructurePropertiesKHR acceleration_structure_properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR}; std::vector bottom_level_acceleration_structure; AccelerationStructure top_level_acceleration_structure; @@ -131,7 +128,7 @@ class RaytracingReflection : public ApiVulkanSample void draw(); void build_command_buffers() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; bool prepare(const vkb::ApplicationOptions &options) override; void render(float delta_time) override; }; diff --git a/samples/extensions/shader_debugprintf/CMakeLists.txt b/samples/extensions/shader_debugprintf/CMakeLists.txt index cf3664c5fd..9d3bb993fe 100644 --- a/samples/extensions/shader_debugprintf/CMakeLists.txt +++ b/samples/extensions/shader_debugprintf/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Sascha Willems +# Copyright (c) 2024-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -31,4 +31,7 @@ add_sample( SHADER_FILES_HLSL "shader_debugprintf/hlsl/scene.vert.hlsl" "shader_debugprintf/hlsl/scene.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_non_semantic_info") \ No newline at end of file + DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_KHR_non_semantic_info" + SHADER_FILES_SLANG + "shader_debugprintf/slang/scene.vert.slang" + "shader_debugprintf/slang/scene.frag.slang") diff --git a/samples/extensions/shader_debugprintf/README.adoc b/samples/extensions/shader_debugprintf/README.adoc index 424f8e6b85..d11409760e 100644 --- a/samples/extensions/shader_debugprintf/README.adoc +++ b/samples/extensions/shader_debugprintf/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2024, Sascha Willems +- Copyright (c) 2024-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -28,7 +28,7 @@ image::./images/sample.png[Sample] == Overview -This sample demonstrates the usage of the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_shader_non_semantic_info.html[VK_KHR_shader_non_semantic_info] for adding means to output debug messages from SPIR-V shaders using a print function at runtime. +This sample demonstrates the usage of the https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_shader_non_semantic_info.html[VK_KHR_shader_non_semantic_info] for adding means to output debug messages from SPIR-V shaders using a print function at runtime. It allows you to output invocation related debug messages from a given shader stage and can help to find problems or bugs together with a graphics debugger like https://www.renderdoc.org[RenderDoc]. But it's also possible to display that data in your application (e.g. a debug window or the command line), although this has some limitations like a fixed buffer size that all messages need to fit in. diff --git a/samples/extensions/shader_debugprintf/shader_debugprintf.cpp b/samples/extensions/shader_debugprintf/shader_debugprintf.cpp index 67bbb7b158..29f2ef96ea 100644 --- a/samples/extensions/shader_debugprintf/shader_debugprintf.cpp +++ b/samples/extensions/shader_debugprintf/shader_debugprintf.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2024, Sascha Willems - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2024-2025, Sascha Willems + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -20,6 +20,8 @@ #include "scene_graph/components/sub_mesh.h" +#define validation_layer_name "VK_LAYER_KHRONOS_validation" + std::string ShaderDebugPrintf::debug_output{}; VKAPI_ATTR VkBool32 VKAPI_CALL ShaderDebugPrintf::debug_utils_message_callback( @@ -28,11 +30,11 @@ VKAPI_ATTR VkBool32 VKAPI_CALL ShaderDebugPrintf::debug_utils_message_callback( const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData) { - // Look for Validation Layer message id names: WARNING-DEBUG-PRINTF or UNASSIGNED-DEBUG-PRINTF (have observed UNASSIGNED with older Vulkan SDKs) - if (strcmp(pCallbackData->pMessageIdName, "WARNING-DEBUG-PRINTF") == 0 || strcmp(pCallbackData->pMessageIdName, "UNASSIGNED-DEBUG-PRINTF") == 0) + // Look for Validation Layer message id names: VVL-DEBUG-PRINTF or WARNING-DEBUG-PRINTF or UNASSIGNED-DEBUG-PRINTF (have observed WARNING and UNASSIGNED with older Vulkan SDKs) + if (strcmp(pCallbackData->pMessageIdName, "VVL-DEBUG-PRINTF") == 0 || strcmp(pCallbackData->pMessageIdName, "WARNING-DEBUG-PRINTF") == 0 || strcmp(pCallbackData->pMessageIdName, "UNASSIGNED-DEBUG-PRINTF") == 0) { // Validation messages are a bit verbose, but we only want the text from the shader, so we cut off everything before the first word from the shader message - // See scene.vert: debugPrintfEXT("Position = %v4f", outPos); + // See scene.vert: debugPrintfEXT("Position = %v3f", outPos); std::string shader_message{pCallbackData->pMessage}; shader_message = shader_message.substr(shader_message.find("Position")); debug_output.append(shader_message + "\n"); @@ -46,20 +48,7 @@ ShaderDebugPrintf::ShaderDebugPrintf() add_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME); - // If layer settings available, use it to configure validation layer for debugPrintfEXT - add_instance_extension(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, /*optional*/ true); - - VkLayerSettingEXT layerSetting; - layerSetting.pLayerName = "VK_LAYER_KHRONOS_validation"; - layerSetting.pSettingName = "enables"; - layerSetting.type = VK_LAYER_SETTING_TYPE_STRING_EXT; - layerSetting.valueCount = 1; - - // Make this static so layer setting reference remains valid after leaving constructor scope - static const char *layerEnables = "VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT"; - layerSetting.pValues = &layerEnables; - - add_layer_setting(layerSetting); + add_instance_layer(validation_layer_name); } ShaderDebugPrintf::~ShaderDebugPrintf() @@ -82,12 +71,26 @@ ShaderDebugPrintf::~ShaderDebugPrintf() } } -void ShaderDebugPrintf::request_gpu_features(vkb::PhysicalDevice &gpu) +void ShaderDebugPrintf::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { + auto const &supportedFeatures = gpu.get_features(); + auto &requestedFeatures = gpu.get_mutable_requested_features(); + + // debugPrintfEXT requires fragmentStoresAndAtomics and vertexPipelineStoresAndAtomics + if (supportedFeatures.fragmentStoresAndAtomics && supportedFeatures.vertexPipelineStoresAndAtomics) + { + requestedFeatures.fragmentStoresAndAtomics = VK_TRUE; + requestedFeatures.vertexPipelineStoresAndAtomics = VK_TRUE; + } + else + { + throw vkb::VulkanException(VK_ERROR_FEATURE_NOT_PRESENT, "Selected GPU does not support features fragmentStoresAndAtomics and/or vertexPipelineStoresAndAtomics"); + } + // Enable anisotropic filtering if supported - if (gpu.get_features().samplerAnisotropy) + if (supportedFeatures.samplerAnisotropy) { - gpu.get_mutable_requested_features().samplerAnisotropy = VK_TRUE; + requestedFeatures.samplerAnisotropy = VK_TRUE; } } @@ -340,8 +343,8 @@ void ShaderDebugPrintf::prepare_pipelines() pipeline_create_info.stageCount = static_cast(shader_stages.size()); pipeline_create_info.pStages = shader_stages.data(); - shader_stages[0] = load_shader("shader_debugprintf", "scene.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("shader_debugprintf", "scene.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("shader_debugprintf", "scene.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("shader_debugprintf", "scene.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // skysphere pipeline (background cube) rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT; @@ -417,46 +420,65 @@ bool ShaderDebugPrintf::prepare(const vkb::ApplicationOptions &options) return true; } -// This sample overrides the per-sample layer framework to force activation of the validation layer -const std::vector ShaderDebugPrintf::get_validation_layers() +// This sample overrides the instance creation part of the framework to chain in additional structures +std::unique_ptr ShaderDebugPrintf::create_instance() { - // Validation layer is already enabled for debug builds, so initialize override list to default (empty) - std::vector validation_layers = ApiVulkanSample::get_validation_layers(); + auto debugprintf_api_version = VK_API_VERSION_1_1; -#if !defined(VKB_DEBUG) && !defined(VKB_VALIDATION_LAYERS) - // Force activation of validation layer on release builds for access to debugPrintfEXT feature - validation_layers.push_back("VK_LAYER_KHRONOS_validation"); -#endif + // Enumerate all instance layer properties so we can find and use the validation layer (VVL) version in subsequent steps + // The VVL version is needed to work around validation layer performance issues when running with Vulkan SDKs <= 1.3.290 + uint32_t layer_property_count; + VK_CHECK(vkEnumerateInstanceLayerProperties(&layer_property_count, nullptr)); + std::vector layer_properties(layer_property_count); + VK_CHECK(vkEnumerateInstanceLayerProperties(&layer_property_count, layer_properties.data())); - return validation_layers; -} + const auto vvl_properties = std::ranges::find_if(layer_properties, + [](VkLayerProperties const &properties) { return strcmp(properties.layerName, validation_layer_name) == 0; }); -// This sample overrides the instance creation part of the framework to chain in additional structures -std::unique_ptr ShaderDebugPrintf::create_instance() -{ - uint32_t instanceApiVersion; - VK_CHECK(vkEnumerateInstanceVersion(&instanceApiVersion)); - - uint32_t instance_extension_count; - VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, nullptr)); - std::vector available_instance_extensions(instance_extension_count); - VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, available_instance_extensions.data())); - - // When VK_EXT_layer_settings is available at runtime, the debugPrintfEXT layer feature is enabled using the standard framework - // For backwards compatibility with SDKs < 1.3.272 without VK_EXT_layer_settings, the remainder of this custom override is required - if (std::any_of(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_EXT_LAYER_SETTINGS_EXTENSION_NAME) == 0; })) + // Make sure we have found the validation layer before checking the VVL version and enumerating VVL instance extensions for VK_EXT_layer_settings + if (vvl_properties != layer_properties.end()) { - // debugPrintfEXT layer feature requires Vulkan API 1.1, but use API 1.2 until VVL performance fix is available in SDKs > 1.3.290 - // See VVL issue https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/7562 for defect and fix information - set_api_version(instanceApiVersion <= VK_MAKE_API_VERSION(0, 1, 3, 290) ? VK_API_VERSION_1_2 : VK_API_VERSION_1_1); + // debugPrintfEXT layer feature requires Vulkan API 1.1, but override with API 1.2 for Vulkan SDKs <= 1.3.290 to work around VVL performance defect + // See VVL issue https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/7562 for defect and fix information (fix available in SDK 1.3.296) + // Note: An additional, unrelated VVL performance issue affecting nVidia GPUs was found in SDK 1.3.296 following release - for nVidia GPUs please + // use SDK 1.3.290 until a fix is made available in a later SDK (see https://github.com/KhronosGroup/Vulkan-ValidationLayers/pull/8766). + if (vvl_properties->specVersion <= VK_MAKE_API_VERSION(0, 1, 3, 290)) + { + debugprintf_api_version = VK_API_VERSION_1_2; + } + + // Enumerate all instance extensions for the validation layer to determine if VK_EXT_layer_settings is supported by the layer + uint32_t vvl_extension_count; + VK_CHECK(vkEnumerateInstanceExtensionProperties(validation_layer_name, &vvl_extension_count, nullptr)); + std::vector vvl_instance_extensions(vvl_extension_count); + VK_CHECK(vkEnumerateInstanceExtensionProperties(validation_layer_name, &vvl_extension_count, vvl_instance_extensions.data())); + + // When VK_EXT_layer_settings is available at runtime, the debugPrintfEXT layer feature is enabled using the standard framework + // For this case set Vulkan API version and return via base class, otherwise the remainder of this custom override is required + if (std::ranges::any_of(vvl_instance_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_EXT_LAYER_SETTINGS_EXTENSION_NAME) == 0; })) + { + set_api_version(debugprintf_api_version); + + // Since layer settings extension is available, use it to configure validation layer for debugPrintfEXT + VkLayerSettingEXT layerSetting; + layerSetting.pLayerName = validation_layer_name; + layerSetting.pSettingName = "enables"; + layerSetting.type = VK_LAYER_SETTING_TYPE_STRING_EXT; + layerSetting.valueCount = 1; - // Run standard create_instance() from framework (with set_api_version and layer settings support) and return - return VulkanSample::create_instance(); + // Make this static so layer setting reference remains valid after leaving the current scope + static const char *layerEnables = "VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT"; + layerSetting.pValues = &layerEnables; + + add_layer_setting(layerSetting); + + // Run standard create_instance() from framework with set_api_version() and add_layer_setting() support + return VulkanSample::create_instance(); + } } - // Run remainder of this custom create_instance() (without layer settings support) and return + // As a fallack, run remainder of this custom create_instance() override (without layer settings support) and return std::vector enabled_extensions; enabled_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); @@ -467,11 +489,18 @@ std::unique_ptr ShaderDebugPrintf::create_instance() enabled_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); enabled_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + #if (defined(VKB_ENABLE_PORTABILITY)) + // Enumerate all instance extensions for the loader + driver to determine if VK_KHR_portability_enumeration is available + uint32_t available_extension_count; + VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &available_extension_count, nullptr)); + std::vector available_instance_extensions(available_extension_count); + VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &available_extension_count, available_instance_extensions.data())); + + // If VK_KHR_portability_enumeration is available in the portability implementation, then we must enable the extension bool portability_enumeration_available = false; - if (std::any_of(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) + if (std::ranges::any_of(available_instance_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) { enabled_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); portability_enumeration_available = true; @@ -481,7 +510,10 @@ std::unique_ptr ShaderDebugPrintf::create_instance() VkApplicationInfo app_info{VK_STRUCTURE_TYPE_APPLICATION_INFO}; app_info.pApplicationName = "Shader debugprintf"; app_info.pEngineName = "Vulkan Samples"; - app_info.apiVersion = instanceApiVersion <= VK_MAKE_API_VERSION(0, 1, 3, 290) ? VK_API_VERSION_1_2 : VK_API_VERSION_1_1; + app_info.apiVersion = debugprintf_api_version; + + // Enable VK_EXT_validation_features extension for configuring validation layer features using VkValidationFeaturesEXT + enabled_extensions.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME); // Shader printf is a feature of the validation layers that needs to be enabled std::vector validation_feature_enables = {VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT}; @@ -490,7 +522,7 @@ std::unique_ptr ShaderDebugPrintf::create_instance() validation_features.enabledValidationFeatureCount = static_cast(validation_feature_enables.size()); validation_features.pEnabledValidationFeatures = validation_feature_enables.data(); - std::vector validation_layers = {"VK_LAYER_KHRONOS_validation"}; + std::vector validation_layers = {validation_layer_name}; VkInstanceCreateInfo instance_create_info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; instance_create_info.ppEnabledExtensionNames = enabled_extensions.data(); @@ -516,7 +548,7 @@ std::unique_ptr ShaderDebugPrintf::create_instance() volkLoadInstance(vulkan_instance); - return std::make_unique(vulkan_instance, enabled_extensions); + return std::make_unique(vulkan_instance, enabled_extensions); } void ShaderDebugPrintf::render(float delta_time) diff --git a/samples/extensions/shader_debugprintf/shader_debugprintf.h b/samples/extensions/shader_debugprintf/shader_debugprintf.h index 546610453b..88e632c611 100644 --- a/samples/extensions/shader_debugprintf/shader_debugprintf.h +++ b/samples/extensions/shader_debugprintf/shader_debugprintf.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2024, Sascha Willems - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2024-2025, Sascha Willems + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -82,22 +82,21 @@ class ShaderDebugPrintf : public ApiVulkanSample ShaderDebugPrintf(); ~ShaderDebugPrintf(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; - void build_command_buffers() override; - void load_assets(); - void setup_descriptor_pool(); - void setup_descriptor_set_layout(); - void setup_descriptor_sets(); - void prepare_pipelines(); - void prepare_uniform_buffers(); - void update_uniform_buffers(); - void draw(); - bool prepare(const vkb::ApplicationOptions &options) override; - const std::vector get_validation_layers() override; - std::unique_ptr create_instance() override; - virtual void render(float delta_time) override; - virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; - virtual bool resize(const uint32_t width, const uint32_t height) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + void build_command_buffers() override; + void load_assets(); + void setup_descriptor_pool(); + void setup_descriptor_set_layout(); + void setup_descriptor_sets(); + void prepare_pipelines(); + void prepare_uniform_buffers(); + void update_uniform_buffers(); + void draw(); + bool prepare(const vkb::ApplicationOptions &options) override; + std::unique_ptr create_instance() override; + virtual void render(float delta_time) override; + virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; + virtual bool resize(const uint32_t width, const uint32_t height) override; }; std::unique_ptr create_shader_debugprintf(); diff --git a/samples/extensions/shader_object/CMakeLists.txt b/samples/extensions/shader_object/CMakeLists.txt index 5e6625fc98..869e84ae4f 100644 --- a/samples/extensions/shader_object/CMakeLists.txt +++ b/samples/extensions/shader_object/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2023 Nintendo +# Copyright 2023-2025 Nintendo # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -35,11 +35,11 @@ add_sample( "shader_object/skybox.vert" "shader_object/terrain.frag" "shader_object/terrain.vert" - "shader_object/material_gen_normals.geo" + "shader_object/material_gen_normals.geom" "shader_object/material_normals.frag" "shader_object/material_n_dot_l.frag" - "shader_object/material_pass_sin_offset.geo" - "shader_object/material_pass_through.geo" + "shader_object/material_pass_sin_offset.geom" + "shader_object/material_pass_through.geom" "shader_object/material_reflective.frag" "shader_object/material_rotates.vert" "shader_object/material_scene.frag" diff --git a/samples/extensions/shader_object/README.adoc b/samples/extensions/shader_object/README.adoc index c7e50cc223..7a9c3c7d62 100644 --- a/samples/extensions/shader_object/README.adoc +++ b/samples/extensions/shader_object/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright 2023 Nintendo +- Copyright 2023-2025 Nintendo - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. @@ -353,7 +353,7 @@ This sample does not enable the `tessellationShader` device feature, so it's not == State Setting and Drawing -The https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#shaders-objects-state[Setting State] subsection of the https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#shaders-objects[Shader Objects] section of the Vulkan specification lists the graphics state that needs to be set on a command buffer before `vkCmdDraw*` can be called with graphics shader objects bound. +The https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#shaders-objects-state[Setting State] subsection of the https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#shaders-objects[Shader Objects] section of the Vulkan specification lists the graphics state that needs to be set on a command buffer before `vkCmdDraw*` can be called with graphics shader objects bound. This sample demonstrates one possible way to take advantage of these rules to minimize calls into the Vulkan driver. @@ -435,15 +435,11 @@ The layer can be shipped with your application, and it will disable itself if a The emulation layer can be enabled by adding `VK_LAYER_KHRONOS_shader_object` to `ppEnabledLayerNames` in `VkDeviceCreateInfo`. -The sample framework already has an existing abstraction normally used for enabling the validation layer. -This sample repurposes this mechanism to instead load the emulation layer. +Similar to enabling extensions, enabling layers is done through a common abstraction with the other samples. [,CPP] ---- -const std::vector ShaderObject::get_validation_layers() -{ - return {"VK_LAYER_KHRONOS_shader_object"}; -} + add_instance_layer("VK_LAYER_KHRONOS_shader_object"); ---- Because you can't rely on the Vulkan SDK to be installed on a user's system, this sample's method of loading the layer is not suitable for a real application. @@ -458,8 +454,8 @@ Because of this the layer's files will always need to be somewhere accessible to == Additional Resources * https://www.khronos.org/blog/you-can-use-vulkan-without-pipelines-today[You Can Use Vulkan Without Pipelines Today] -* https://github.com/KhronosGroup/Vulkan-Docs/blob/main/proposals/VK_EXT_shader_object.adoc[Extension Proposal] -* https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#shaders-objects[Specification] +* https://docs.vulkan.org/features/latest/features/proposals/VK_EXT_shader_object.html[Extension Proposal] +* https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#shaders-objects[Specification] * https://github.com/KhronosGroup/Vulkan-ExtensionLayer/blob/main/docs/shader_object_layer.md[Emulation Layer] == Conclusion diff --git a/samples/extensions/shader_object/shader_object.cpp b/samples/extensions/shader_object/shader_object.cpp index 56bc33df75..0f8b836ac4 100644 --- a/samples/extensions/shader_object/shader_object.cpp +++ b/samples/extensions/shader_object/shader_object.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2023-2024 Nintendo - * Copyright 2023-2024, Sascha Willems + * Copyright 2023-2025 Nintendo + * Copyright 2023-2025, Sascha Willems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ */ #include "shader_object.h" -#include #include #include @@ -30,6 +29,8 @@ ShaderObject::ShaderObject() // Show that shader object is usable with Vulkan 1.1 + Dynamic Rendering set_api_version(VK_API_VERSION_1_1); + add_instance_layer("VK_LAYER_KHRONOS_shader_object"); + // Enable the Shader Object extension add_device_extension(VK_EXT_SHADER_OBJECT_EXTENSION_NAME); @@ -105,13 +106,6 @@ ShaderObject::~ShaderObject() } } -// Currently the sample calls through this function in order to get the list of any instance layers, not just validation layers. -// This is not suitable for a real application implementation using the layer, the layer will need to be shipped with the application. -const std::vector ShaderObject::get_validation_layers() -{ - return {"VK_LAYER_KHRONOS_shader_object"}; -} - bool ShaderObject::resize(const uint32_t _width, const uint32_t _height) { if (!has_device()) @@ -310,10 +304,10 @@ void ShaderObject::create_default_sampler() VK_CHECK(vkCreateSampler(get_device().get_handle(), &sampler_create_info, nullptr, &standard_sampler)); } -void ShaderObject::request_gpu_features(vkb::PhysicalDevice &gpu) +void ShaderObject::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable Shader Object - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceShaderObjectFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT, shaderObject); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceShaderObjectFeaturesEXT, shaderObject); // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -329,10 +323,7 @@ void ShaderObject::request_gpu_features(vkb::PhysicalDevice &gpu) } // Enable Dynamic Rendering - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceDynamicRenderingFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR, - dynamicRendering); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDynamicRenderingFeaturesKHR, dynamicRendering); // Enable Geometry Shaders auto &requested_geometry_shader = gpu.get_mutable_requested_features(); @@ -547,11 +538,9 @@ void ShaderObject::create_shaders() { using json = nlohmann::json; - // Initialize a GLSL compiler and load shaders from the shader json file - vkb::GLSLCompiler glsl_compiler; - std::string shaders = vkb::fs::read_shader("shader_object/shaders.json"); - json shader_data = json::parse(shaders); - VkDevice device = get_device().get_handle(); + std::string shaders = vkb::fs::read_text_file("shader_object/shaders.json"); + json shader_data = json::parse(shaders); + VkDevice device = get_device().get_handle(); // Pre calc string lengths const int unlinked_post_process_prefix_size = strlen("post_process_"); @@ -565,11 +554,11 @@ void ShaderObject::create_shaders() LOGI("Compiling skybox Shader"); auto &shader = shader_data["skybox"]; - std::string vert_shader_name = shader["vert"].get(); - std::vector vert_shader_data = vkb::fs::read_shader_binary("shader_object/" + vert_shader_name); + std::string vert_shader_name = shader["vert"].get(); + std::vector vert_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + vert_shader_name); - std::string frag_shader_name = shader["frag"].get(); - std::vector frag_shader_data = vkb::fs::read_shader_binary("shader_object/" + frag_shader_name); + std::string frag_shader_name = shader["frag"].get(); + std::vector frag_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + frag_shader_name); // Create shaders with current and next stage bits and set the shaders GLSL shader data, descriptor sets, and push constants skybox_vert_shader = new Shader(VK_SHADER_STAGE_VERTEX_BIT, @@ -598,8 +587,8 @@ void ShaderObject::create_shaders() LOGI("Compiling FSQ Shader"); auto &shader = shader_data["post_process"]; - std::string vert_shader_name = shader["vert"].get(); - std::vector vert_shader_data = vkb::fs::read_shader_binary("shader_object/" + vert_shader_name); + std::string vert_shader_name = shader["vert"].get(); + std::vector vert_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + vert_shader_name); // Create shader with current and next stage bits and set the GLSL shader data, descriptor sets, and push constants post_process_vert_shader = new Shader(VK_SHADER_STAGE_VERTEX_BIT, @@ -621,11 +610,11 @@ void ShaderObject::create_shaders() LOGI("Compiling Terrain Shader"); auto &shader = shader_data["terrain"]; - std::string vert_shader_name = shader["vert"].get(); - std::vector vert_shader_data = vkb::fs::read_shader_binary("shader_object/" + vert_shader_name); + std::string vert_shader_name = shader["vert"].get(); + std::vector vert_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + vert_shader_name); - std::string frag_shader_name = shader["frag"].get(); - std::vector frag_shader_data = vkb::fs::read_shader_binary("shader_object/" + frag_shader_name); + std::string frag_shader_name = shader["frag"].get(); + std::vector frag_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + frag_shader_name); // Create shaders with current and next stage bits and set the shaders GLSL shader data, descriptor sets, and push constants terrain_vert_shader = new Shader(VK_SHADER_STAGE_VERTEX_BIT, @@ -654,11 +643,11 @@ void ShaderObject::create_shaders() { std::string shader_name = shader.key(); - std::string vert_shader_name = shader.value()["vert"].get(); - std::vector vert_shader_data = vkb::fs::read_shader_binary("shader_object/" + vert_shader_name); + std::string vert_shader_name = shader.value()["vert"].get(); + std::vector vert_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + vert_shader_name); - std::string frag_shader_name = shader.value()["frag"].get(); - std::vector frag_shader_data = vkb::fs::read_shader_binary("shader_object/" + frag_shader_name); + std::string frag_shader_name = shader.value()["frag"].get(); + std::vector frag_shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + frag_shader_name); LOGI("Compiling Shader Set {}", shader_name.c_str()); @@ -689,8 +678,8 @@ void ShaderObject::create_shaders() // Load unlinked post_process frag shaders for (auto &shader : shader_data["post_process"]["frag"].items()) { - std::string shader_name = shader.value().get(); - std::vector shader_data = vkb::fs::read_shader_binary("shader_object/" + shader_name); + std::string shader_name = shader.value().get(); + std::vector shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + shader_name); LOGI("Compiling Shader {}", shader_name.c_str()); @@ -713,8 +702,8 @@ void ShaderObject::create_shaders() // Load unlinked material vert shaders for (auto &shader : shader_data["material"]["vert"].items()) { - std::string shader_name = shader.value().get(); - std::vector shader_data = vkb::fs::read_shader_binary("shader_object/" + shader_name); + std::string shader_name = shader.value().get(); + std::vector shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + shader_name); LOGI("Compiling Shader {}", shader_name.c_str()); @@ -737,8 +726,8 @@ void ShaderObject::create_shaders() // Load unlinked material geo shaders for (auto &shader : shader_data["material"]["geo"].items()) { - std::string shader_name = shader.value().get(); - std::vector shader_data = vkb::fs::read_shader_binary("shader_object/" + shader_name); + std::string shader_name = shader.value().get(); + std::vector shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + shader_name); LOGI("Compiling Shader {}", shader_name.c_str()); @@ -761,8 +750,8 @@ void ShaderObject::create_shaders() // Load unlinked material frag shaders for (auto &shader : shader_data["material"]["frag"].items()) { - std::string shader_name = shader.value().get(); - std::vector shader_data = vkb::fs::read_shader_binary("shader_object/" + shader_name); + std::string shader_name = shader.value().get(); + std::vector shader_data = vkb::fs::read_shader_binary_u32("shader_object/" + shader_name); LOGI("Compiling Shader {}", shader_name.c_str()); @@ -1902,7 +1891,7 @@ ShaderObject::Image ShaderObject::create_output_image(VkFormat format, VkImageUs // Get and set memory allocation size then allocate and bind memory vkGetImageMemoryRequirements(get_device().get_handle(), image.image, &memory_requirements); memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &image.memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), image.image, image.memory, 0)); @@ -1981,7 +1970,7 @@ void ShaderObject::bind_shader(VkCommandBuffer cmd_buffer, ShaderObject::Shader ShaderObject::Shader::Shader(VkShaderStageFlagBits stage_, VkShaderStageFlags next_stage_, std::string shader_name_, - const std::vector &vert_glsl_source, + const std::vector &vert_shader_source, const VkDescriptorSetLayout *pSetLayouts, const VkPushConstantRange *pPushConstantRange) { @@ -1989,14 +1978,7 @@ ShaderObject::Shader::Shader(VkShaderStageFlagBits stage_, shader_name = shader_name_; next_stage = next_stage_; - vkb::GLSLCompiler glsl_compiler; - std::string info_log; - - // Compile the GLSL source - if (!glsl_compiler.compile_to_spirv(stage, vert_glsl_source, "main", {}, spirv, info_log)) - { - LOGE("Failed to compile shader, Error: {}", info_log.c_str()); - } + spirv = vert_shader_source; // Fill out the shader create info struct vk_shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT; diff --git a/samples/extensions/shader_object/shader_object.h b/samples/extensions/shader_object/shader_object.h index 71ebbf03ea..30d33f4e4d 100644 --- a/samples/extensions/shader_object/shader_object.h +++ b/samples/extensions/shader_object/shader_object.h @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 Nintendo + * Copyright 2023-2025 Nintendo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ class ShaderObject : public ApiVulkanSample Shader(VkShaderStageFlagBits stage, VkShaderStageFlags next_stage, std::string name, - const std::vector &vert_glsl_source, + const std::vector &vert_shader_source, const VkDescriptorSetLayout *pSetLayouts, const VkPushConstantRange *pPushConstantRange); @@ -128,13 +128,11 @@ class ShaderObject : public ApiVulkanSample ShaderObject(); ~ShaderObject() override; - const std::vector get_validation_layers() override; - bool resize(const uint32_t width, const uint32_t height) override; bool prepare(const vkb::ApplicationOptions &options) override; void setup_framebuffer() override; void setup_render_pass() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void render(float delta_time) override; void on_update_ui_overlay(vkb::Drawer &drawer) override; diff --git a/samples/extensions/sparse_image/CMakeLists.txt b/samples/extensions/sparse_image/CMakeLists.txt index 720e5402a2..43be6e00d6 100644 --- a/samples/extensions/sparse_image/CMakeLists.txt +++ b/samples/extensions/sparse_image/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024, Mobica Limited +# Copyright (c) 2023-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample( "sparse_image/glsl/sparse.frag" SHADER_FILES_HLSL "sparse_image/hlsl/sparse.vert.hlsl" - "sparse_image/hlsl/sparse.frag.hlsl") + "sparse_image/hlsl/sparse.frag.hlsl" + SHADER_FILES_SLANG + "sparse_image/slang/sparse.vert.slang" + "sparse_image/slang/sparse.frag.slang") \ No newline at end of file diff --git a/samples/extensions/sparse_image/sparse_image.cpp b/samples/extensions/sparse_image/sparse_image.cpp index 5a268cf348..f5648b2027 100644 --- a/samples/extensions/sparse_image/sparse_image.cpp +++ b/samples/extensions/sparse_image/sparse_image.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -72,7 +72,7 @@ void SparseImage::create_sparse_bind_queue() if (sparse_queue_family_index == 0xFF) { - sparse_queue_family_index = get_device().get_queue_family_index(VK_QUEUE_SPARSE_BINDING_BIT); + sparse_queue_family_index = vkb::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), VK_QUEUE_SPARSE_BINDING_BIT); } vkGetDeviceQueue(get_device().get_handle(), sparse_queue_family_index, 0U, &sparse_queue); } @@ -148,8 +148,8 @@ void SparseImage::prepare_pipelines() std::array shader_stages{}; - shader_stages[0] = load_shader("sparse_image", "sparse.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("sparse_image", "sparse.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("sparse_image", "sparse.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("sparse_image", "sparse.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(sample_pipeline_layout, render_pass); pipeline_create_info.stageCount = vkb::to_u32(shader_stages.size()); @@ -1369,7 +1369,7 @@ void SparseImage::create_texture_sampler() /** * @brief Enable required GPU features. */ -void SparseImage::request_gpu_features(vkb::PhysicalDevice &gpu) +void SparseImage::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().sparseBinding && gpu.get_features().sparseResidencyImage2D && gpu.get_features().shaderResourceResidency) { @@ -1507,9 +1507,10 @@ void SparseImage::create_sparse_texture_image() reset_mip_table(); // Memory allocation required data - virtual_texture.memory_allocations.device = get_device().get_handle(); - virtual_texture.memory_allocations.page_size = virtual_texture.page_size; - virtual_texture.memory_allocations.memory_type_index = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + virtual_texture.memory_allocations.device = get_device().get_handle(); + virtual_texture.memory_allocations.page_size = virtual_texture.page_size; + virtual_texture.memory_allocations.memory_type_index = + get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); virtual_texture.memory_allocations.pages_per_allocation = PAGES_PER_ALLOC; // Setting the constant data for memory page binding via vkQueueBindSparse() diff --git a/samples/extensions/sparse_image/sparse_image.h b/samples/extensions/sparse_image/sparse_image.h index 24ee593a30..b2845f536a 100644 --- a/samples/extensions/sparse_image/sparse_image.h +++ b/samples/extensions/sparse_image/sparse_image.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -18,6 +18,7 @@ #pragma once #include "api_vulkan_sample.h" +#include class SparseImage : public ApiVulkanSample { @@ -392,7 +393,7 @@ class SparseImage : public ApiVulkanSample void build_command_buffers() override; void render(float delta_time) override; bool prepare(const vkb::ApplicationOptions &options) override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; }; diff --git a/samples/extensions/subgroups_operations/CMakeLists.txt b/samples/extensions/subgroups_operations/CMakeLists.txt new file mode 100644 index 0000000000..af850c44b2 --- /dev/null +++ b/samples/extensions/subgroups_operations/CMakeLists.txt @@ -0,0 +1,45 @@ + # Copyright (c) 2024, Mobica Limited + # + # SPDX-License-Identifier: Apache-2.0 + # + # Licensed under the Apache License, Version 2.0 the "License"; + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + + get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) + get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) + get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) + +add_sample( + ID ${FOLDER_NAME} + CATEGORY ${CATEGORY_NAME} + AUTHOR "Mobica" + NAME "subgroups_operations" + DESCRIPTION "Demonstrates the use of a subgroups operations feature" + SHADER_FILES_GLSL + "subgroups_operations/ocean.vert" + "subgroups_operations/ocean.frag" + "subgroups_operations/ocean.tesc" + "subgroups_operations/ocean.tese" + "subgroups_operations/fft_invert.comp" + "subgroups_operations/butterfly_precomp.comp" + "subgroups_operations/fft_tilde_h.comp" + "subgroups_operations/fft_tilde_h0.comp" + "subgroups_operations/fft_normal_map.comp" + "subgroups_operations/fft.comp" + "subgroups_operations/fft_invert_subgroups_off.comp" + "subgroups_operations/butterfly_precomp_subgroups_off.comp" + "subgroups_operations/fft_tilde_h_subgroups_off.comp" + "subgroups_operations/fft_tilde_h0_subgroups_off.comp" + "subgroups_operations/fft_normal_map_subgroups_off.comp" + "subgroups_operations/fft_subgroups_off.comp" + GLSLC_ADDITIONAL_ARGUMENTS + "--target-spv=spv1.4") \ No newline at end of file diff --git a/samples/extensions/subgroups_operations/README.adoc b/samples/extensions/subgroups_operations/README.adoc new file mode 100644 index 0000000000..e4cef2918b --- /dev/null +++ b/samples/extensions/subgroups_operations/README.adoc @@ -0,0 +1,98 @@ +//// +Copyright (c) 2024, Mobica Limited + +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 the "License"; +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Subgroups Operations + +== Overview + +The example demonstrates the use of the feature subgroups operations. An ocean animation based on the FFT is implemented to demonstrate this feature (Fast Fourier Transform https://en.wikipedia.org/wiki/Fast_Fourier_transform). +image:image/image.png[] + +Subgroups operation feature introduces a mechanism to share data between the invocations that run in parallel on a single compute unit. + + +== GLSL Shaders + +To make full use of the feature subgroups operation, one of the following extensions must be enabled: + +* `#extension GL_KHR_shader_subgroup_basic` + +* `#extension GL_KHR_shader_subgroup_vote` + +* `#extension GL_KHR_shader_subgroup_ballot` + +* `#extension GL_KHR_shader_subgroup_arithmetic` + +* `#extension GL_KHR_shader_subgroup_shuffle` + +* `#extension GL_KHR_shader_subgroup_shuffle_relative` + +* `#extension GL_KHR_shader_subgroup_clustered` + +* `#extension GL_KHR_shader_subgroup_quad` + + +This sample focuse on `GL_KHR_shader_subgroup_basic` extension. +More about subgroups you can read in this article https://www.khronos.org/blog/vulkan-subgroup-tutorial. + + +== Enabling the Feature + +In order to use subgroups operations, the required extensions must be enabled, an instance of the Vulkan API must be created with a minimum of version 1.1 and SPIR-V 1.4 must be used. + +VkDevice must be created with this `VK_EXT_subgroup_size_control` extension. +It is also required to enable `VK_KHR_spirv_1_4` and `VK_KHR_shader_float_controls` in addition (`VK_KHR_spirv_1_4` requires this). + + +To get the properties of the supported subgroups, the following should be taken: +[,cpp] +---- +VkPhysicalDeviceSubgroupProperties subgroups_properties; +subgroups_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES; +subgroups_properties.pNext = VK_NULL_HANDLE; + +VkPhysicalDeviceProperties2 device_properties2 = {}; +device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; +device_properties2.pNext = &subgroups_properties; +vkGetPhysicalDeviceProperties2(gpu.get_handle(), &device_properties2); +---- + + +== Documentation + +* https://docs.vulkan.org/guide/latest/subgroups.html + +* https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceSubgroupProperties.html + +* https://www.khronos.org/blog/vulkan-subgroup-tutorial + + +== Sources +The implementation was based on the following sources: + +* https://tore.tuhh.de/entities/publication/1cd390d3-732b-41c1-aa2b-07b71a64edd2 +* https://people.computing.clemson.edu/~jtessen/reports/papers_files/coursenotes2004.pdf +* https://github.com/achalpandeyy/OceanFFT +* https://github.com/deiss/fftocean +* https://github.com/iamyoukou/fftWater + +== Authors +* Patryk JastrzÄ™bski +* Krzysztof Dmitruk +* Seweryn Zielas +* Piotr PlenaÅ„ski diff --git a/samples/extensions/subgroups_operations/image/image.png b/samples/extensions/subgroups_operations/image/image.png new file mode 100644 index 0000000000..b7c94452e7 Binary files /dev/null and b/samples/extensions/subgroups_operations/image/image.png differ diff --git a/samples/extensions/subgroups_operations/subgroups_operations.cpp b/samples/extensions/subgroups_operations/subgroups_operations.cpp new file mode 100644 index 0000000000..c49a34b681 --- /dev/null +++ b/samples/extensions/subgroups_operations/subgroups_operations.cpp @@ -0,0 +1,1783 @@ +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "subgroups_operations.h" + +#include + +void SubgroupsOperations::Pipeline::destroy(VkDevice device) const +{ + if (pipeline != VK_NULL_HANDLE) + { + vkDestroyPipeline(device, pipeline, nullptr); + } + + if (pipeline_layout != VK_NULL_HANDLE) + { + vkDestroyPipelineLayout(device, pipeline_layout, nullptr); + } +} + +SubgroupsOperations::SubgroupsOperations() +{ + // SPIRV 1.4 requires Vulkan 1.1 + set_api_version(VK_API_VERSION_1_1); + + // Subgroup size control extensions required by this sample + add_device_extension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME); + + // Required for VK_EXT_subgroup_size_control + add_device_extension(VK_KHR_SPIRV_1_4_EXTENSION_NAME); + + // Required by VK_KHR_spirv_1_4 + add_device_extension(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); + + title = "Subgroups operations"; + camera.type = vkb::CameraType::FirstPerson; + camera.translation_speed = 15.0f; + + camera.set_perspective(60.0f, static_cast(width) / static_cast(height), 0.01f, 256.0f); + camera.set_position({0.0f, 5.0f, 0.0f}); + camera.translation_speed = {15.0f}; + + grid_size = 256U; +} + +SubgroupsOperations::~SubgroupsOperations() +{ + if (has_device()) + { + fft_buffers.fft_tilde_h_kt_dx->destroy(get_device().get_handle()); + fft_buffers.fft_tilde_h_kt_dy->destroy(get_device().get_handle()); + fft_buffers.fft_tilde_h_kt_dz->destroy(get_device().get_handle()); + fft_buffers.fft_displacement->destroy(get_device().get_handle()); + fft_buffers.fft_normal_map->destroy(get_device().get_handle()); + + fft_buffers.fft_input_htilde0->destroy(get_device().get_handle()); + fft_buffers.fft_input_htilde0_conj->destroy(get_device().get_handle()); + butterfly_precomp.destroy(get_device().get_handle()); + + precompute.pipeline.destroy(get_device().get_handle()); +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + precompute.pipeline_subgroups_off.destroy(get_device().get_handle()); +#endif + vkDestroyDescriptorSetLayout(get_device().get_handle(), precompute.descriptor_set_layout, nullptr); + + tildes.pipeline.destroy(get_device().get_handle()); +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + tildes.pipeline_subgroups_off.destroy(get_device().get_handle()); +#endif + vkDestroyDescriptorSetLayout(get_device().get_handle(), tildes.descriptor_set_layout, nullptr); + + initial_tildes.pipeline.destroy(get_device().get_handle()); +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + initial_tildes.pipeline_subgroups_off.destroy(get_device().get_handle()); +#endif + vkDestroyDescriptorSetLayout(get_device().get_handle(), initial_tildes.descriptor_set_layout, nullptr); + + fft_inversion.pipeline.destroy(get_device().get_handle()); +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + fft_inversion.pipeline_subgroups_off.destroy(get_device().get_handle()); +#endif + vkDestroyDescriptorSetLayout(get_device().get_handle(), fft_inversion.descriptor_set_layout, nullptr); + + fft_normal_map.pipeline.destroy(get_device().get_handle()); +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + fft_normal_map.pipeline_subgroups_off.destroy(get_device().get_handle()); +#endif + vkDestroyDescriptorSetLayout(get_device().get_handle(), fft_normal_map.descriptor_set_layout, nullptr); + + fft.tilde_axis_x->destroy(get_device().get_handle()); + fft.tilde_axis_y->destroy(get_device().get_handle()); + fft.tilde_axis_z->destroy(get_device().get_handle()); + fft.pipelines.horizontal.destroy(get_device().get_handle()); + fft.pipelines.vertical.destroy(get_device().get_handle()); +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + fft.pipelines.horizontal_subgroups_off.destroy(get_device().get_handle()); + fft.pipelines.vertical_subgroups_off.destroy(get_device().get_handle()); +#endif + vkDestroyDescriptorSetLayout(get_device().get_handle(), fft.descriptor_set_layout, nullptr); + + vkDestroySemaphore(get_device().get_handle(), compute.semaphore, nullptr); + vkDestroyCommandPool(get_device().get_handle(), compute.command_pool, nullptr); + + ocean.pipelines._default.destroy(get_device().get_handle()); + ocean.pipelines.wireframe.destroy(get_device().get_handle()); + vkDestroyDescriptorSetLayout(get_device().get_handle(), ocean.descriptor_set_layout, nullptr); + vkDestroySemaphore(get_device().get_handle(), ocean.semaphore, nullptr); + } +} + +bool SubgroupsOperations::prepare(const vkb::ApplicationOptions &options) +{ + if (!ApiVulkanSample::prepare(options)) + { + return false; + } + + ocean.graphics_queue_family_index = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, 0).get_family_index(); + + load_assets(); + setup_descriptor_pool(); + prepare_uniform_buffers(); + prepare_compute(); + + // prepare grpahics pipeline + create_semaphore(); + create_descriptor_set_layout(); + + create_initial_tides(); + create_tildas(); + create_butterfly_texture(); + create_fft(); + create_fft_inversion(); + create_fft_normal_map(); + + create_descriptor_set(); + create_pipelines(); + + build_compute_command_buffer(); + + build_command_buffers(); + + // signal semaphore + VkSubmitInfo submit_info = vkb::initializers::submit_info(); + submit_info.signalSemaphoreCount = 1u; + submit_info.pSignalSemaphores = &ocean.semaphore; + VK_CHECK(vkQueueSubmit(queue, 1u, &submit_info, VK_NULL_HANDLE)); + get_device().wait_idle(); + + prepared = true; + return true; +} + +void SubgroupsOperations::prepare_compute() +{ + create_compute_queue(); + create_compute_command_pool(); + create_compute_command_buffer(); +} + +void SubgroupsOperations::create_compute_queue() +{ + // create compute queue and get family index + compute.queue_family_index = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, 0).get_family_index(); + vkGetDeviceQueue(get_device().get_handle(), compute.queue_family_index, 0u, &compute.queue); +} + +void SubgroupsOperations::create_compute_command_pool() +{ + VkCommandPoolCreateInfo command_pool_create_info = {}; + command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + command_pool_create_info.queueFamilyIndex = compute.queue_family_index; + command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + VK_CHECK(vkCreateCommandPool(get_device().get_handle(), &command_pool_create_info, nullptr, &compute.command_pool)); +} + +void SubgroupsOperations::create_compute_command_buffer() +{ + // Create a command buffer for compute operations + VkCommandBufferAllocateInfo command_buffer_allocate_info = + vkb::initializers::command_buffer_allocate_info(compute.command_pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1u); + + VK_CHECK(vkAllocateCommandBuffers(get_device().get_handle(), &command_buffer_allocate_info, &compute.command_buffer)); +} + +void SubgroupsOperations::build_compute_command_buffer() +{ + // record compute command + VkCommandBufferBeginInfo begin_info = vkb::initializers::command_buffer_begin_info(); + VK_CHECK(vkBeginCommandBuffer(compute.command_buffer, &begin_info)); + + { + VkBufferMemoryBarrier memory_barrier = vkb::initializers::buffer_memory_barrier(); + memory_barrier.buffer = bit_reverse_buffer->get_handle(); + memory_barrier.offset = 0u; + memory_barrier.size = bit_reverse_buffer->get_size(); + memory_barrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + memory_barrier.srcQueueFamilyIndex = ocean.graphics_queue_family_index; + memory_barrier.dstQueueFamilyIndex = compute.queue_family_index; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 1u, &memory_barrier, 0u, nullptr); + } + + // butterfly texture + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? precompute.pipeline.pipeline : precompute.pipeline_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? precompute.pipeline.pipeline_layout : precompute.pipeline_subgroups_off.pipeline_layout, 0u, 1u, &precompute.descriptor_set, 0u, nullptr); +#else + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, precompute.pipeline.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, precompute.pipeline.pipeline_layout, 0u, 1u, &precompute.descriptor_set, 0u, nullptr); +#endif + + vkCmdDispatch(compute.command_buffer, 1u, grid_size, 1u); + + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = butterfly_precomp.image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + + // initial tildes textures + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? initial_tildes.pipeline.pipeline : initial_tildes.pipeline_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? initial_tildes.pipeline.pipeline_layout : initial_tildes.pipeline_subgroups_off.pipeline_layout, 0u, 1u, &initial_tildes.descriptor_set, 0u, nullptr); +#else + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, initial_tildes.pipeline.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, initial_tildes.pipeline.pipeline_layout, 0u, 1u, &initial_tildes.descriptor_set, 0u, nullptr); +#endif + + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + { + VkBufferMemoryBarrier memory_barrier = vkb::initializers::buffer_memory_barrier(); + memory_barrier.buffer = fft_buffers.fft_input_random->get_handle(); + memory_barrier.offset = 0u; + memory_barrier.size = fft_buffers.fft_input_random->get_size(); + memory_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + ; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 1u, &memory_barrier, 0u, nullptr); + } + + { + VkMemoryBarrier memory_barrier = vkb::initializers::memory_barrier(); + memory_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 1u, &memory_barrier, 0u, nullptr, 0u, nullptr); + } + } + + // tildes textures + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? tildes.pipeline.pipeline : tildes.pipeline_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? tildes.pipeline.pipeline_layout : tildes.pipeline_subgroups_off.pipeline_layout, 0u, 1u, &tildes.descriptor_set, 0u, nullptr); +#else + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, tildes.pipeline.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, tildes.pipeline.pipeline_layout, 0u, 1u, &tildes.descriptor_set, 0u, nullptr); +#endif + + vkCmdDispatch(compute.command_buffer, grid_size / 8u, grid_size, 1u); + + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_input_htilde0->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + + // fft horizontal; for Y axis + // shader: fft.comp + // layout (binding = 0, rgba32f) readonly uniform image2D u_butterfly_precomp; -> image_descriptor_butterfly + // layout (binding = 1, rgba32f) uniform image2D u_pingpong0; -> image_descriptor_tilda_y + // layout (binding = 2, rgba32f) uniform image2D u_pingpong1; -> image_descriptor_tilde_axis_y + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VkPipelineLayout selected_layout = ui.subgroups_enabled ? fft.pipelines.horizontal.pipeline_layout : fft.pipelines.horizontal_subgroups_off.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft.pipelines.horizontal.pipeline : fft.pipelines.horizontal_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_y, 0u, nullptr); +#else + VkPipelineLayout selected_layout = fft.pipelines.horizontal.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.horizontal.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_y, 0u, nullptr); +#endif + + for (uint32_t i = 0; i < log_2_N; ++i) + { + vkCmdPushConstants(compute.command_buffer, selected_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &i); + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + + { + VkImageMemoryBarrier img_barrier[2] = {vkb::initializers::image_memory_barrier(), vkb::initializers::image_memory_barrier()}; + img_barrier[0].image = fft_buffers.fft_tilde_h_kt_dy->image; + img_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier[0].subresourceRange.baseMipLevel = 0u; + img_barrier[0].subresourceRange.levelCount = 1u; + img_barrier[0].subresourceRange.baseArrayLayer = 0u; + img_barrier[0].subresourceRange.layerCount = 1u; + img_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier[0].newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier[0].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier[0].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + img_barrier[1].image = fft.tilde_axis_y->image; + img_barrier[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier[1].subresourceRange.baseMipLevel = 0u; + img_barrier[1].subresourceRange.levelCount = 1u; + img_barrier[1].subresourceRange.baseArrayLayer = 0u; + img_barrier[1].subresourceRange.layerCount = 1u; + img_barrier[1].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier[1].newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier[1].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 2u, img_barrier); + } + } + } + + // fft horizontal; for X axis + // shader: fft.comp + // layout (binding = 0, rgba32f) readonly uniform image2D u_butterfly_precomp; -> image_descriptor_butterfly + // layout (binding = 1, rgba32f) uniform image2D u_pingpong0; -> image_descriptor_tilda_x + // layout (binding = 2, rgba32f) uniform image2D u_pingpong1; -> image_descriptor_tilde_axis_x + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VkPipelineLayout selected_layout = ui.subgroups_enabled ? fft.pipelines.horizontal.pipeline_layout : fft.pipelines.horizontal_subgroups_off.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft.pipelines.horizontal.pipeline : fft.pipelines.horizontal_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_x, 0u, nullptr); +#else + VkPipelineLayout selected_layout = fft.pipelines.horizontal.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.horizontal.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_x, 0u, nullptr); +#endif + + for (uint32_t i = 0; i < log_2_N; ++i) + { + vkCmdPushConstants(compute.command_buffer, selected_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &i); + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + + if ((i % 2) == 0) + { + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_tilde_h_kt_dx->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + else + { + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft.tilde_axis_x->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + } + } + + // fft horizontal; for Z axis + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VkPipelineLayout selected_layout = ui.subgroups_enabled ? fft.pipelines.horizontal.pipeline_layout : fft.pipelines.horizontal_subgroups_off.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft.pipelines.horizontal.pipeline : fft.pipelines.horizontal_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_z, 0u, nullptr); +#else + VkPipelineLayout selected_layout = fft.pipelines.horizontal.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.horizontal.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_z, 0u, nullptr); +#endif + + for (uint32_t i = 0; i < log_2_N; ++i) + { + vkCmdPushConstants(compute.command_buffer, selected_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &i); + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_tilde_h_kt_dz->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft.tilde_axis_z->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + } + + // fft vertical; for Y axis + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VkPipelineLayout selected_layout = ui.subgroups_enabled ? fft.pipelines.vertical.pipeline_layout : fft.pipelines.vertical_subgroups_off.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft.pipelines.vertical.pipeline : fft.pipelines.vertical_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_y, 0u, nullptr); +#else + VkPipelineLayout selected_layout = fft.pipelines.vertical.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.vertical.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_y, 0u, nullptr); +#endif + + for (uint32_t i = 0; i < log_2_N; ++i) + { + vkCmdPushConstants(compute.command_buffer, selected_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &i); + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_tilde_h_kt_dy->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft.tilde_axis_y->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + } + + // fft vertical; for X axis + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VkPipelineLayout selected_layout = ui.subgroups_enabled ? fft.pipelines.vertical.pipeline_layout : fft.pipelines.vertical_subgroups_off.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft.pipelines.vertical.pipeline : fft.pipelines.vertical_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_x, 0u, nullptr); +#else + VkPipelineLayout selected_layout = fft.pipelines.vertical.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.vertical.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_x, 0u, nullptr); +#endif + + for (uint32_t i = 0; i < log_2_N; ++i) + { + vkCmdPushConstants(compute.command_buffer, selected_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &i); + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_tilde_h_kt_dx->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft.tilde_axis_x->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + } + + // fft vertical; for Z axis + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VkPipelineLayout selected_layout = ui.subgroups_enabled ? fft.pipelines.vertical.pipeline_layout : fft.pipelines.vertical_subgroups_off.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft.pipelines.vertical.pipeline : fft.pipelines.vertical_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_z, 0u, nullptr); +#else + VkPipelineLayout selected_layout = fft.pipelines.vertical.pipeline_layout; + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.vertical.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, selected_layout, 0u, 1u, &fft.descriptor_set_axis_z, 0u, nullptr); +#endif + + for (uint32_t i = 0; i < log_2_N; ++i) + { + vkCmdPushConstants(compute.command_buffer, selected_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &i); + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_tilde_h_kt_dz->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft.tilde_axis_z->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + } + + { + VkMemoryBarrier memory_barrier = vkb::initializers::memory_barrier(); + memory_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 1u, &memory_barrier, 0u, nullptr, 0u, nullptr); + } + + // fft inverse + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft_inversion.pipeline.pipeline : fft_inversion.pipeline_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft_inversion.pipeline.pipeline_layout : fft_inversion.pipeline_subgroups_off.pipeline_layout, 0u, 1u, &fft_inversion.descriptor_set, 0u, nullptr); +#else + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_inversion.pipeline.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_inversion.pipeline.pipeline_layout, 0u, 1u, &fft_inversion.descriptor_set, 0u, nullptr); +#endif + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_displacement->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + } + + { + VkMemoryBarrier memory_barrier = vkb::initializers::memory_barrier(); + memory_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 1u, &memory_barrier, 0u, nullptr, 0u, nullptr); + } + + // fft normal map + { +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft_normal_map.pipeline.pipeline : fft_normal_map.pipeline_subgroups_off.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ui.subgroups_enabled ? fft_normal_map.pipeline.pipeline_layout : fft_normal_map.pipeline_subgroups_off.pipeline_layout, 0u, 1u, &fft_normal_map.descriptor_set, 0u, nullptr); +#else + vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_normal_map.pipeline.pipeline); + vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_normal_map.pipeline.pipeline_layout, 0u, 1u, &fft_normal_map.descriptor_set, 0u, nullptr); +#endif + vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u); + } + if (ocean.graphics_queue_family_index != compute.queue_family_index) + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_normal_map->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcQueueFamilyIndex = compute.queue_family_index; + img_barrier.dstQueueFamilyIndex = ocean.graphics_queue_family_index; + img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + ; + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + + vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0u, 0u, nullptr, 0u, nullptr, 0u, nullptr); + + VK_CHECK(vkEndCommandBuffer(compute.command_buffer)); +} + +void SubgroupsOperations::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) +{ + if (gpu.get_features().samplerAnisotropy) + { + gpu.get_mutable_requested_features().samplerAnisotropy = VK_TRUE; + } + + if (gpu.get_features().fillModeNonSolid) + { + gpu.get_mutable_requested_features().fillModeNonSolid = VK_TRUE; + } + + if (gpu.get_features().vertexPipelineStoresAndAtomics) + { + gpu.get_mutable_requested_features().vertexPipelineStoresAndAtomics = VK_TRUE; + } + + if (gpu.get_features().tessellationShader) + { + gpu.get_mutable_requested_features().tessellationShader = VK_TRUE; + } + else + { + throw vkb::VulkanException(VK_ERROR_FEATURE_NOT_PRESENT, "Selected GPU does not support tessellation shaders!"); + } + + subgroups_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES; + subgroups_properties.pNext = VK_NULL_HANDLE; + + VkPhysicalDeviceProperties2 device_properties2 = {}; + device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + device_properties2.pNext = &subgroups_properties; + vkGetPhysicalDeviceProperties2(gpu.get_handle(), &device_properties2); + + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_BASIC_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_BASIC_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_VOTE_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_VOTE_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_ARITHMETIC_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_ARITHMETIC_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_BALLOT_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_BALLOT_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_SHUFFLE_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_SHUFFLE_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_CLUSTERED_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_CLUSTERED_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_QUAD_BIT) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_QUAD_BIT"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR"); + if (subgroups_properties.supportedOperations & VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR) + ui.supported_features.push_back("VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR"); +} + +void SubgroupsOperations::create_initial_tides() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 0u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 1u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 2u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 3u)}; + + VkDescriptorSetLayoutCreateInfo descriptor_layout = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &initial_tildes.descriptor_set_layout)); + + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &initial_tildes.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &initial_tildes.descriptor_set)); + + VkPipelineLayoutCreateInfo compute_pipeline_layout_info = vkb::initializers::pipeline_layout_create_info(&initial_tildes.descriptor_set_layout); + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &initial_tildes.pipeline.pipeline_layout)); + + VkComputePipelineCreateInfo computeInfo = vkb::initializers::compute_pipeline_create_info(initial_tildes.pipeline.pipeline_layout); + computeInfo.stage = load_shader("subgroups_operations/fft_tilde_h0.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &initial_tildes.pipeline.pipeline)); + +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &initial_tildes.pipeline_subgroups_off.pipeline_layout)); + computeInfo.layout = initial_tildes.pipeline_subgroups_off.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft_tilde_h0_subgroups_off.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &initial_tildes.pipeline_subgroups_off.pipeline)); +#endif + + fft_buffers.fft_input_htilde0 = std::make_unique(); + fft_buffers.fft_input_htilde0_conj = std::make_unique(); + + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_input_htilde0); + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_input_htilde0_conj); + + VkDescriptorImageInfo htilde_0_descriptor = create_ia_descriptor(*fft_buffers.fft_input_htilde0); + VkDescriptorImageInfo htilde_conj_0_descriptor = create_ia_descriptor(*fft_buffers.fft_input_htilde0_conj); + VkDescriptorBufferInfo input_random_descriptor = create_descriptor(*fft_buffers.fft_input_random); + VkDescriptorBufferInfo fft_params_ubo_buffer = create_descriptor(*fft_params_ubo); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(initial_tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &htilde_0_descriptor), + vkb::initializers::write_descriptor_set(initial_tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &htilde_conj_0_descriptor), + vkb::initializers::write_descriptor_set(initial_tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2u, &input_random_descriptor), + vkb::initializers::write_descriptor_set(initial_tildes.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u, &fft_params_ubo_buffer)}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0u, nullptr); +} + +void SubgroupsOperations::create_tildas() +{ + fft_buffers.fft_tilde_h_kt_dx = std::make_unique(); + fft_buffers.fft_tilde_h_kt_dy = std::make_unique(); + fft_buffers.fft_tilde_h_kt_dz = std::make_unique(); + + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_tilde_h_kt_dx); + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_tilde_h_kt_dy); + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_tilde_h_kt_dz); + + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 0u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 1u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 2u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 3u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 4u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 5u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 6u)}; + VkDescriptorSetLayoutCreateInfo descriptor_layout = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &tildes.descriptor_set_layout)); + + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &tildes.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &tildes.descriptor_set)); + + VkPipelineLayoutCreateInfo compute_pipeline_layout_info = vkb::initializers::pipeline_layout_create_info(&tildes.descriptor_set_layout); + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &tildes.pipeline.pipeline_layout)); + + VkComputePipelineCreateInfo computeInfo = vkb::initializers::compute_pipeline_create_info(tildes.pipeline.pipeline_layout); + computeInfo.stage = load_shader("subgroups_operations/fft_tilde_h.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &tildes.pipeline.pipeline)); + + +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &tildes.pipeline_subgroups_off.pipeline_layout)); + computeInfo.layout = tildes.pipeline_subgroups_off.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft_tilde_h_subgroups_off.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &tildes.pipeline_subgroups_off.pipeline)); +#endif + + VkDescriptorImageInfo htilde_0_descriptor = create_ia_descriptor(*fft_buffers.fft_input_htilde0); + VkDescriptorImageInfo htilde_conj_0_descriptor = create_ia_descriptor(*fft_buffers.fft_input_htilde0_conj); + + VkDescriptorImageInfo image_dx_descriptor = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dx); + VkDescriptorImageInfo image_dy_descriptor = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dy); + VkDescriptorImageInfo image_dz_descriptor = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dz); + + VkDescriptorBufferInfo fft_params_ubo_buffer = create_descriptor(*fft_params_ubo); + VkDescriptorBufferInfo fft_time_ubo_buffer = create_descriptor(*fft_time_ubo); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &htilde_0_descriptor), + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &htilde_conj_0_descriptor), + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u, &image_dx_descriptor), + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 3u, &image_dy_descriptor), + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 4u, &image_dz_descriptor), + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 5u, &fft_params_ubo_buffer), + vkb::initializers::write_descriptor_set(tildes.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 6u, &fft_time_ubo_buffer)}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0u, nullptr); +} + +void SubgroupsOperations::load_assets() +{ + generate_plane(); + ui.wind.recalc(); + + log_2_N = static_cast(glm::log2(static_cast(grid_size))); + + input_random.clear(); + + for (uint32_t m = 0; m < grid_size; ++m) + { + for (uint32_t n = 0; n < grid_size; ++n) + { + glm::vec2 rnd1 = rndGaussian(); + glm::vec2 rnd2 = rndGaussian(); + input_random.emplace_back(rnd1.x, rnd1.y, rnd2.x, rnd2.y); + } + } + + auto input_random_size = static_cast(input_random.size() * sizeof(glm::vec4)); + fft_buffers.fft_input_random = std::make_unique(get_device(), + input_random_size, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, + VMA_MEMORY_USAGE_CPU_TO_GPU); + + fft_buffers.fft_input_random->update(input_random.data(), input_random_size); +} + +glm::vec2 SubgroupsOperations::rndGaussian() +{ + float x1, x2, w; + auto rndVal = []() -> float { + std::random_device rndDevice; + std::mt19937 mt(rndDevice()); + std::uniform_real_distribution dis(0.0f, 1.0f); + return dis(mt); + }; + do + { + x1 = 2.0f * rndVal() - 1.0f; + x2 = 2.0f * rndVal() - 1.0f; + w = x1 * x1 + x2 * x2; + } while (w >= 1.0f); + w = glm::sqrt((-2.0f * glm::log(w)) / w); + return glm::vec2{x1 * w, x2 * w}; +} + +void SubgroupsOperations::prepare_uniform_buffers() +{ + camera_ubo = std::make_unique(get_device(), sizeof(CameraUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + camera_position_ubo = std::make_unique(get_device(), sizeof(CameraPositionUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + fft_params_ubo = std::make_unique(get_device(), sizeof(FFTParametersUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + fft_time_ubo = std::make_unique(get_device(), sizeof(TimeUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + invert_fft_ubo = std::make_unique(get_device(), sizeof(FFTInvertUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + tessellation_params_ubo = std::make_unique(get_device(), sizeof(TessellationParamsUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + ocean_params_ubo = std::make_unique(get_device(), sizeof(OceanParamsUbo), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + + update_uniform_buffers(); +} + +void SubgroupsOperations::generate_plane() +{ + uint32_t dim_gird = grid_size; + uint32_t vertex_count = dim_gird + 1u; + std::vector plane_vertices; + const auto tex_coord_scale = float(grid_size); + std::vector indices; + auto half_grid_size = static_cast(dim_gird / 2); + + for (int32_t z = -half_grid_size; z <= half_grid_size; ++z) + { + for (int32_t x = -half_grid_size; x <= half_grid_size; ++x) + { + float u = static_cast(x) / static_cast(dim_gird) + 0.5f; + float v = static_cast(z) / static_cast(dim_gird) + 0.5f; + Vertex vert; + vert.pos = glm::vec3(float(x), 0.0f, float(z)); + vert.uv = glm::vec2(u, v) * tex_coord_scale; + vert.normal = glm::vec3(0.0f); + + plane_vertices.push_back(vert); + } + } + + for (uint32_t y = 0u; y < dim_gird; ++y) + { + for (uint32_t x = 0u; x < dim_gird; ++x) + { + // tris 1 + indices.push_back((vertex_count * y) + x); + indices.push_back((vertex_count * (y + 1u)) + x); + indices.push_back((vertex_count * y) + x + 1u); + + // tris 2 + indices.push_back((vertex_count * y) + x + 1u); + indices.push_back((vertex_count * (y + 1u)) + x); + indices.push_back((vertex_count * (y + 1u)) + x + 1u); + } + } + + auto vertex_buffer_size = vkb::to_u32(plane_vertices.size() * sizeof(Vertex)); + auto index_buffer_size = vkb::to_u32(indices.size() * sizeof(uint32_t)); + ocean.grid.index_count = vkb::to_u32(indices.size()); + + ocean.grid.vertex = std::make_unique(get_device(), + vertex_buffer_size, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VMA_MEMORY_USAGE_CPU_TO_GPU); + + ocean.grid.index = std::make_unique(get_device(), + index_buffer_size, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VMA_MEMORY_USAGE_CPU_TO_GPU); + + ocean.grid.vertex->update(plane_vertices.data(), vertex_buffer_size); + ocean.grid.index->update(indices.data(), index_buffer_size); +} + +void SubgroupsOperations::create_semaphore() +{ + // Semaphore for graphics queue + { + VkSemaphoreCreateInfo semaphore_create_info = vkb::initializers::semaphore_create_info(); + VK_CHECK(vkCreateSemaphore(get_device().get_handle(), &semaphore_create_info, nullptr, &ocean.semaphore)); + } + + // Semaphore for compute & graphics sync + { + VkSemaphoreCreateInfo semaphore_create_info = vkb::initializers::semaphore_create_info(); + VK_CHECK(vkCreateSemaphore(get_device().get_handle(), &semaphore_create_info, nullptr, &compute.semaphore)); + } +} + +void SubgroupsOperations::setup_descriptor_pool() +{ + std::vector pool_sizes = { + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 20u), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 20u), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 20u), + vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 20u)}; + VkDescriptorPoolCreateInfo descriptor_pool_create_info = + vkb::initializers::descriptor_pool_create_info(static_cast(pool_sizes.size()), pool_sizes.data(), 15u); + VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &descriptor_pool_create_info, nullptr, &descriptor_pool)); +} + +void SubgroupsOperations::create_descriptor_set_layout() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 0u), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 1u), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 2u), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 3u), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 4u), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 5u), + vkb::initializers::descriptor_set_layout_binding( + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, + 6u)}; + + VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_set_layout_create_info, nullptr, &ocean.descriptor_set_layout)); + + VkPipelineLayoutCreateInfo pipeline_layout_create_info = vkb::initializers::pipeline_layout_create_info(&ocean.descriptor_set_layout); + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &ocean.pipelines._default.pipeline_layout)); +} + +void SubgroupsOperations::create_descriptor_set() +{ + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &ocean.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &ocean.descriptor_set)); + + VkDescriptorBufferInfo buffer_descriptor = create_descriptor(*camera_ubo); + VkDescriptorImageInfo displacement_descriptor = create_ia_descriptor(*fft_buffers.fft_displacement); + VkDescriptorBufferInfo tessellation_params_descriptor = create_descriptor(*tessellation_params_ubo); + VkDescriptorBufferInfo camera_pos_buffer_descriptor = create_descriptor(*camera_position_ubo); + VkDescriptorImageInfo normal_map_descriptor = create_ia_descriptor(*fft_buffers.fft_normal_map); + VkDescriptorBufferInfo ocean_params_buffer_descriptor = create_descriptor(*ocean_params_ubo); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(ocean.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0u, &buffer_descriptor), + vkb::initializers::write_descriptor_set(ocean.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &displacement_descriptor), + vkb::initializers::write_descriptor_set(ocean.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2u, &tessellation_params_descriptor), + vkb::initializers::write_descriptor_set(ocean.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u, &camera_pos_buffer_descriptor), + vkb::initializers::write_descriptor_set(ocean.descriptor_set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 4u, &normal_map_descriptor), + vkb::initializers::write_descriptor_set(ocean.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 5u, &ocean_params_buffer_descriptor)}; + + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0u, nullptr); +} + +void SubgroupsOperations::create_pipelines() +{ + VkPipelineInputAssemblyStateCreateInfo input_assembly_state = + vkb::initializers::pipeline_input_assembly_state_create_info( + VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, + 0u, + VK_FALSE); + VkPipelineRasterizationStateCreateInfo rasterization_state = + vkb::initializers::pipeline_rasterization_state_create_info( + VK_POLYGON_MODE_FILL, + VK_CULL_MODE_NONE, + VK_FRONT_FACE_COUNTER_CLOCKWISE, + 0u); + VkPipelineColorBlendAttachmentState blend_attachment_state = + vkb::initializers::pipeline_color_blend_attachment_state( + 0xf, + VK_FALSE); + + VkPipelineColorBlendStateCreateInfo color_blend_state = + vkb::initializers::pipeline_color_blend_state_create_info( + 1u, + &blend_attachment_state); + VkPipelineDepthStencilStateCreateInfo depth_stencil_state = + vkb::initializers::pipeline_depth_stencil_state_create_info( + VK_TRUE, + VK_TRUE, + VK_COMPARE_OP_GREATER); + VkPipelineViewportStateCreateInfo viewport_state = + vkb::initializers::pipeline_viewport_state_create_info(1u, 1u, 0u); + VkPipelineMultisampleStateCreateInfo multisample_state = + vkb::initializers::pipeline_multisample_state_create_info( + VK_SAMPLE_COUNT_1_BIT, + 0u); + std::vector dynamic_state_enables = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR}; + VkPipelineDynamicStateCreateInfo dynamic_state = + vkb::initializers::pipeline_dynamic_state_create_info( + dynamic_state_enables.data(), + static_cast(dynamic_state_enables.size()), + 0u); + + VkPipelineTessellationStateCreateInfo tessellation_state = vkb::initializers::pipeline_tessellation_state_create_info(3u); + + std::array shader_stages = { + load_shader("subgroups_operations/ocean.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("subgroups_operations/ocean.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT), + load_shader("subgroups_operations/ocean.tesc.spv", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT), + load_shader("subgroups_operations/ocean.tese.spv", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)}; + + const std::vector vertex_input_bindings = { + vkb::initializers::vertex_input_binding_description(0u, sizeof(Vertex), VK_VERTEX_INPUT_RATE_VERTEX)}; + const std::vector vertex_input_attributes = { + vkb::initializers::vertex_input_attribute_description(0u, 0u, VK_FORMAT_R32G32B32_SFLOAT, offsetof(Vertex, pos)), + vkb::initializers::vertex_input_attribute_description(0u, 1u, VK_FORMAT_R32G32_SFLOAT, offsetof(Vertex, uv))}; + VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info(); + vertex_input_state.vertexBindingDescriptionCount = static_cast(vertex_input_bindings.size()); + vertex_input_state.pVertexBindingDescriptions = vertex_input_bindings.data(); + vertex_input_state.vertexAttributeDescriptionCount = static_cast(vertex_input_attributes.size()); + vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes.data(); + + VkGraphicsPipelineCreateInfo pipeline_create_info = vkb::initializers::pipeline_create_info(ocean.pipelines._default.pipeline_layout, render_pass, 0u); + pipeline_create_info.pVertexInputState = &vertex_input_state; + pipeline_create_info.pInputAssemblyState = &input_assembly_state; + pipeline_create_info.pRasterizationState = &rasterization_state; + pipeline_create_info.pColorBlendState = &color_blend_state; + pipeline_create_info.pMultisampleState = &multisample_state; + pipeline_create_info.pViewportState = &viewport_state; + pipeline_create_info.pDepthStencilState = &depth_stencil_state; + pipeline_create_info.pDynamicState = &dynamic_state; + pipeline_create_info.pTessellationState = &tessellation_state; + pipeline_create_info.stageCount = static_cast(shader_stages.size()); + pipeline_create_info.pStages = shader_stages.data(); + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1u, &pipeline_create_info, nullptr, &ocean.pipelines._default.pipeline)); + + if (get_device().get_gpu().get_features().fillModeNonSolid) + { + rasterization_state.polygonMode = VK_POLYGON_MODE_LINE; + VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1u, &pipeline_create_info, nullptr, &ocean.pipelines.wireframe.pipeline)); + } +} + +void SubgroupsOperations::update_uniform_buffers() +{ + CameraUbo ubo = {}; + ubo.model = glm::mat4(1.0f); + ubo.view = camera.matrices.view; + ubo.projection = camera.matrices.perspective; + + CameraPositionUbo cam_pos = {}; + cam_pos.position = glm::vec4(camera.position, 0.0f); + + FFTParametersUbo fft_ubo = {}; + fft_ubo.amplitude = ui.amplitude; + fft_ubo.grid_size = grid_size; + fft_ubo.length = ui.length; + fft_ubo.wind = ui.wind.vec; + + FFTInvertUbo invert_fft = {}; + invert_fft.page_idx = static_cast(log_2_N % 2); + invert_fft.grid_size = grid_size; + + TessellationParamsUbo tess_params = {}; + tess_params.displacement_scale = ui.displacement_scale; + tess_params.choppines = ui.choppines; + + TimeUbo t = {}; + t.time = static_cast(timer.elapsed()); + + OceanParamsUbo ocean_params = {}; + ocean_params.light_color = ui.light_color; + ocean_params.light_position = ui.light_pos; + ocean_params.ocean_color = ui.ocean_color; + + ocean_params_ubo->convert_and_update(ocean_params); + fft_time_ubo->convert_and_update(t); + camera_ubo->convert_and_update(ubo); + fft_params_ubo->convert_and_update(fft_ubo); + invert_fft_ubo->convert_and_update(invert_fft); + tessellation_params_ubo->convert_and_update(tess_params); + camera_position_ubo->convert_and_update(cam_pos); +} + +void SubgroupsOperations::build_command_buffers() +{ + VkCommandBufferBeginInfo command_buffer_begin_info = vkb::initializers::command_buffer_begin_info(); + + std::array clear_values = {}; + clear_values[0].color = {{0.0f, 0.0f, 0.0f, 0.0f}}; + clear_values[1].depthStencil = {0.0f, 0u}; + + VkRenderPassBeginInfo render_pass_begin_info = vkb::initializers::render_pass_begin_info(); + render_pass_begin_info.renderPass = render_pass; + render_pass_begin_info.renderArea.extent.width = width; + render_pass_begin_info.renderArea.extent.height = height; + render_pass_begin_info.clearValueCount = static_cast(clear_values.size()); + render_pass_begin_info.pClearValues = clear_values.data(); + + for (uint32_t i = 0u; i < draw_cmd_buffers.size(); ++i) + { + render_pass_begin_info.framebuffer = framebuffers[i]; + auto &cmd_buff = draw_cmd_buffers[i]; + + VK_CHECK(vkBeginCommandBuffer(cmd_buff, &command_buffer_begin_info)); + + if (ocean.graphics_queue_family_index != compute.queue_family_index) + { + VkMemoryBarrier memory_barrier = vkb::initializers::memory_barrier(); + memory_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_INDEX_READ_BIT; + + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_normal_map->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcQueueFamilyIndex = compute.queue_family_index; + img_barrier.dstQueueFamilyIndex = ocean.graphics_queue_family_index; + img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier(cmd_buff, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 1u, &memory_barrier, 0u, nullptr, 1u, &img_barrier); + } + + vkCmdBeginRenderPass(cmd_buff, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); + + VkViewport viewport = vkb::initializers::viewport(static_cast(width), static_cast(height), 0.0f, 1.0f); + vkCmdSetViewport(cmd_buff, 0u, 1u, &viewport); + + VkRect2D scissor = vkb::initializers::rect2D(static_cast(width), static_cast(height), 0, 0); + vkCmdSetScissor(cmd_buff, 0u, 1u, &scissor); + + // draw ocean + { + vkCmdBindDescriptorSets(cmd_buff, VK_PIPELINE_BIND_POINT_GRAPHICS, ocean.pipelines._default.pipeline_layout, 0u, 1u, &ocean.descriptor_set, 0u, nullptr); + vkCmdBindPipeline(cmd_buff, VK_PIPELINE_BIND_POINT_GRAPHICS, ui.wireframe ? ocean.pipelines.wireframe.pipeline : ocean.pipelines._default.pipeline); + + VkDeviceSize offset[] = {0u}; + vkCmdBindVertexBuffers(cmd_buff, 0u, 1u, ocean.grid.vertex->get(), offset); + vkCmdBindIndexBuffer(cmd_buff, ocean.grid.index->get_handle(), VkDeviceSize(0), VK_INDEX_TYPE_UINT32); + + vkCmdDrawIndexed(cmd_buff, ocean.grid.index_count, 1u, 0u, 0u, 0u); + } + + draw_ui(cmd_buff); + + vkCmdEndRenderPass(cmd_buff); + + if (ocean.graphics_queue_family_index != compute.queue_family_index) + { + VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier(); + img_barrier.image = fft_buffers.fft_normal_map->image; + img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + img_barrier.subresourceRange.baseMipLevel = 0u; + img_barrier.subresourceRange.levelCount = 1u; + img_barrier.subresourceRange.baseArrayLayer = 0u; + img_barrier.subresourceRange.layerCount = 1u; + img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + img_barrier.srcQueueFamilyIndex = ocean.graphics_queue_family_index; + img_barrier.dstQueueFamilyIndex = compute.queue_family_index; + img_barrier.dstAccessMask = 0u; + img_barrier.srcAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; + + vkCmdPipelineBarrier(cmd_buff, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier); + } + + VK_CHECK(vkEndCommandBuffer(cmd_buff)); + } +} + +void SubgroupsOperations::draw() +{ + VkPipelineStageFlags wait_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + // Submit compute commands + VkSubmitInfo compute_submit_info = vkb::initializers::submit_info(); + compute_submit_info.commandBufferCount = 1; + compute_submit_info.pCommandBuffers = &compute.command_buffer; + compute_submit_info.waitSemaphoreCount = 1u; + compute_submit_info.pWaitSemaphores = &ocean.semaphore; + compute_submit_info.pWaitDstStageMask = &wait_stage_mask; + compute_submit_info.signalSemaphoreCount = 1u; + compute_submit_info.pSignalSemaphores = &compute.semaphore; + + VK_CHECK(vkQueueSubmit(compute.queue, 1u, &compute_submit_info, VK_NULL_HANDLE)); + + VkPipelineStageFlags graphics_wait_stage_masks[] = {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT}; + VkSemaphore graphics_wait_semaphores[] = {compute.semaphore, semaphores.acquired_image_ready}; + VkSemaphore graphics_signal_semaphores[] = {ocean.semaphore, semaphores.render_complete}; + + ApiVulkanSample::prepare_frame(); + submit_info.commandBufferCount = 1u; + submit_info.pCommandBuffers = &draw_cmd_buffers[current_buffer]; + submit_info.waitSemaphoreCount = 2u; + submit_info.pWaitSemaphores = graphics_wait_semaphores; + submit_info.pWaitDstStageMask = graphics_wait_stage_masks; + submit_info.signalSemaphoreCount = 2u; + submit_info.pSignalSemaphores = graphics_signal_semaphores; + + VK_CHECK(vkQueueSubmit(queue, 1u, &submit_info, VK_NULL_HANDLE)); + + ApiVulkanSample::submit_frame(); +} + +void SubgroupsOperations::on_update_ui_overlay(vkb::Drawer &drawer) +{ + if (drawer.header("Subgroups operations properties")) + { + + + drawer.text("Subgroups size %d", subgroups_properties.subgroupSize); + drawer.text("Supported operations:"); + + for (auto &s : ui.supported_features) + drawer.text(" %s", s.c_str()); + } + + if (drawer.header("Settings")) + { + if (get_device().get_gpu().get_features().fillModeNonSolid) + { + if (drawer.checkbox("Wireframe", &ui.wireframe)) + { + build_command_buffers(); + } + } + + if (drawer.checkbox("Subgroups enable", &ui.subgroups_enabled)) + { + build_compute_command_buffer(); + } + + if (drawer.header("Light")) + { + drawer.slider_float("Position x", &ui.light_pos.x, -1000.0f, 1000.0f); + drawer.slider_float("Position y", &ui.light_pos.y, -1000.0f, 1000.0f); + drawer.slider_float("Position z", &ui.light_pos.z, -1000.0f, 1000.0f); + + std::array colors = {ui.light_color.r, ui.light_color.g, ui.light_color.b}; + drawer.color_op("Light color", colors, 0, + ImGuiColorEditFlags_NoSidePreview | + ImGuiColorEditFlags_NoSmallPreview | + ImGuiColorEditFlags_Float | + ImGuiColorEditFlags_HDR); + ui.light_color.r = colors[0]; + ui.light_color.g = colors[1]; + ui.light_color.b = colors[2]; + } + } + + if (drawer.header("Ocean settings")) + { + drawer.input_float("Amplitude", &ui.amplitude, 1.f, "%.3f"); + drawer.input_float("Length", &ui.length, 10.f, "%.1f"); + drawer.slider_float("Choppines", &ui.choppines, 0.0f, 1.0f); + drawer.slider_float("Displacement scale", &ui.displacement_scale, 0.0f, 1.0f); + + if (drawer.header("Wind")) + { + drawer.slider_float("Angle", &ui.wind.angle, 0.0f, 360.0f); + drawer.slider_float("Force", &ui.wind.force, 0.1f, 50.0f); + + ui.wind.recalc(); + } + + std::array colors = {ui.ocean_color.r, ui.ocean_color.g, ui.ocean_color.b}; + drawer.color_op("Ocean color", colors, 0, + ImGuiColorEditFlags_NoSidePreview | + ImGuiColorEditFlags_NoSmallPreview | + ImGuiColorEditFlags_Float | + ImGuiColorEditFlags_HDR); + ui.ocean_color.r = colors[0]; + ui.ocean_color.g = colors[1]; + ui.ocean_color.b = colors[2]; + } +} + +bool SubgroupsOperations::resize(const uint32_t width, const uint32_t height) +{ + if (!ApiVulkanSample::resize(width, height)) + return false; + update_uniform_buffers(); + build_compute_command_buffer(); + build_command_buffers(); + return true; +} + +void SubgroupsOperations::render(float delta_time) +{ + if (!prepared) + { + return; + } + if (!timer.is_running()) + timer.start(); + + update_uniform_buffers(); + draw(); +} + +void SubgroupsOperations::create_image_attachement(VkFormat format, uint32_t width, uint32_t height, ImageAttachment &attachment) +{ + attachment.format = format; + + VkImageCreateInfo image = vkb::initializers::image_create_info(); + image.imageType = VK_IMAGE_TYPE_2D; + image.format = format; + image.extent.width = width; + image.extent.height = height; + image.extent.depth = 1u; + image.mipLevels = 1u; + image.arrayLayers = 1u; + image.samples = VK_SAMPLE_COUNT_1_BIT; + image.tiling = VK_IMAGE_TILING_OPTIMAL; + image.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT; + image.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + + VkMemoryAllocateInfo memory_allocate_info = vkb::initializers::memory_allocate_info(); + VkMemoryRequirements memory_requirements; + + VK_CHECK(vkCreateImage(get_device().get_handle(), &image, nullptr, &attachment.image)); + vkGetImageMemoryRequirements(get_device().get_handle(), attachment.image, &memory_requirements); + memory_allocate_info.allocationSize = memory_requirements.size; + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &attachment.memory)); + VK_CHECK(vkBindImageMemory(get_device().get_handle(), attachment.image, attachment.memory, 0)); + + VkImageViewCreateInfo image_view_create_info = vkb::initializers::image_view_create_info(); + image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; + image_view_create_info.format = format; + image_view_create_info.subresourceRange = {}; + image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + image_view_create_info.subresourceRange.baseMipLevel = 0u; + image_view_create_info.subresourceRange.levelCount = 1u; + image_view_create_info.subresourceRange.baseArrayLayer = 0u; + image_view_create_info.subresourceRange.layerCount = 1u; + image_view_create_info.image = attachment.image; + VK_CHECK(vkCreateImageView(get_device().get_handle(), &image_view_create_info, nullptr, &attachment.view)); + + VkSamplerCreateInfo sampler_info = vkb::initializers::sampler_create_info(); + sampler_info.magFilter = VK_FILTER_LINEAR; + sampler_info.minFilter = VK_FILTER_LINEAR; + sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; + sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; + sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; + sampler_info.anisotropyEnable = VK_TRUE; + sampler_info.maxAnisotropy = get_device().get_gpu().get_properties().limits.maxSamplerAnisotropy; + sampler_info.compareEnable = VK_FALSE; + sampler_info.compareOp = VK_COMPARE_OP_NEVER; + sampler_info.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK; + sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + + VK_CHECK(vkCreateSampler(get_device().get_handle(), &sampler_info, nullptr, &attachment.sampler)); + + VkImageMemoryBarrier imgMemBarrier = vkb::initializers::image_memory_barrier(); + imgMemBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + imgMemBarrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; + imgMemBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imgMemBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imgMemBarrier.image = attachment.image; + imgMemBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + imgMemBarrier.subresourceRange.baseArrayLayer = 0u; + imgMemBarrier.subresourceRange.levelCount = 1u; + imgMemBarrier.subresourceRange.baseArrayLayer = 0u; + imgMemBarrier.subresourceRange.layerCount = 1u; + imgMemBarrier.srcAccessMask = 0u; + imgMemBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + + VkPipelineStageFlagBits srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + VkPipelineStageFlagBits dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + + VkCommandBuffer cmd = get_device().create_command_buffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); + vkCmdPipelineBarrier(cmd, srcStage, dstStage, 0u, 0u, nullptr, 0u, nullptr, 1u, &imgMemBarrier); + get_device().flush_command_buffer(cmd, queue, true); +} + +uint32_t SubgroupsOperations::reverse(uint32_t i) const +{ + uint32_t res = 0; + for (int j = 0; j < log_2_N; j++) + { + res = (res << 1) + (i & 1); + i >>= 1; + } + return res; +} + +void SubgroupsOperations::create_butterfly_texture() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 0u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 1u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 2u)}; + + VkDescriptorSetLayoutCreateInfo descriptor_layout = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &precompute.descriptor_set_layout)); + + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &precompute.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &precompute.descriptor_set)); + + VkPipelineLayoutCreateInfo compute_pipeline_layout_info = vkb::initializers::pipeline_layout_create_info(&precompute.descriptor_set_layout); + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &precompute.pipeline.pipeline_layout)); + + VkComputePipelineCreateInfo computeInfo = {}; + computeInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + computeInfo.layout = precompute.pipeline.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/butterfly_precomp.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &precompute.pipeline.pipeline)); + +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &precompute.pipeline_subgroups_off.pipeline_layout)); + computeInfo.layout = precompute.pipeline_subgroups_off.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/butterfly_precomp_subgroups_off.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &precompute.pipeline_subgroups_off.pipeline)); +#endif + + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, log_2_N, grid_size, butterfly_precomp); + + std::vector bit_reverse_arr; + for (uint32_t i = 0; i < grid_size; ++i) + bit_reverse_arr.push_back(reverse(i)); + + bit_reverse_buffer = std::make_unique(get_device(), sizeof(uint32_t) * bit_reverse_arr.size(), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + bit_reverse_buffer->update(bit_reverse_arr.data(), sizeof(uint32_t) * bit_reverse_arr.size()); + + VkDescriptorBufferInfo bit_reverse_descriptor = create_descriptor(*bit_reverse_buffer); + VkDescriptorImageInfo image_descriptor = create_ia_descriptor(butterfly_precomp); + VkDescriptorBufferInfo fft_params_ubo_buffer = create_descriptor(*fft_params_ubo); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(precompute.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &image_descriptor), + vkb::initializers::write_descriptor_set(precompute.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, &bit_reverse_descriptor), + vkb::initializers::write_descriptor_set(precompute.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2u, &fft_params_ubo_buffer)}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0u, nullptr); +} + +void SubgroupsOperations::create_fft() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 0u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 1u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 2u)}; + VkDescriptorSetLayoutCreateInfo descriptor_layout = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &fft.descriptor_set_layout)); + + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &fft.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &fft.descriptor_set_axis_y)); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &fft.descriptor_set_axis_x)); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &fft.descriptor_set_axis_z)); + + VkPushConstantRange push_constant_range = vkb::initializers::push_constant_range(VK_SHADER_STAGE_COMPUTE_BIT, sizeof(int32_t), 0); + + VkPipelineLayoutCreateInfo compute_pipeline_layout_info = {}; + compute_pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + compute_pipeline_layout_info.setLayoutCount = 1u; + compute_pipeline_layout_info.pSetLayouts = &fft.descriptor_set_layout; + compute_pipeline_layout_info.pushConstantRangeCount = 1u; + compute_pipeline_layout_info.pPushConstantRanges = &push_constant_range; + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft.pipelines.horizontal.pipeline_layout)); + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft.pipelines.vertical.pipeline_layout)); + + VkComputePipelineCreateInfo computeInfo = {}; + computeInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + computeInfo.layout = fft.pipelines.horizontal.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + + std::array specialization_map_entries = {}; + VkSpecializationInfo spec_info; + uint32_t direction = 0u; + specialization_map_entries[0] = vkb::initializers::specialization_map_entry(0u, 0u, sizeof(uint32_t)); + spec_info = vkb::initializers::specialization_info(static_cast(specialization_map_entries.size()), + specialization_map_entries.data(), + sizeof(uint32_t), + &direction); + computeInfo.stage.pSpecializationInfo = &spec_info; + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft.pipelines.horizontal.pipeline)); + + direction = 1u; + computeInfo.layout = fft.pipelines.vertical.pipeline_layout; + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft.pipelines.vertical.pipeline)); + +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft.pipelines.horizontal_subgroups_off.pipeline_layout)); + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft.pipelines.vertical_subgroups_off.pipeline_layout)); + computeInfo.stage = load_shader("subgroups_operations/fft_subgroups_off.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + direction = 0u; + computeInfo.stage.pSpecializationInfo = &spec_info; + computeInfo.layout = fft.pipelines.horizontal_subgroups_off.pipeline_layout; + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft.pipelines.horizontal_subgroups_off.pipeline)); + direction = 1u; + computeInfo.stage.pSpecializationInfo = &spec_info; + computeInfo.layout = fft.pipelines.vertical_subgroups_off.pipeline_layout; + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft.pipelines.vertical_subgroups_off.pipeline)); +#endif + + fft.tilde_axis_y = std::make_unique(); + fft.tilde_axis_x = std::make_unique(); + fft.tilde_axis_z = std::make_unique(); + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft.tilde_axis_y); + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft.tilde_axis_x); + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft.tilde_axis_z); + + VkDescriptorImageInfo image_descriptor_butterfly = create_ia_descriptor(butterfly_precomp); + VkDescriptorImageInfo image_descriptor_tilda_y = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dy); + VkDescriptorImageInfo image_descriptor_tilde_axis_y = create_ia_descriptor(*fft.tilde_axis_y); + + std::vector write_descriptor_sets_axis_y = { + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_y, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &image_descriptor_butterfly), + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_y, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &image_descriptor_tilda_y), + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_y, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u, &image_descriptor_tilde_axis_y)}; + + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets_axis_y.size()), write_descriptor_sets_axis_y.data(), 0u, nullptr); + + VkDescriptorImageInfo image_descriptor_tilda_x = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dx); + VkDescriptorImageInfo image_descriptor_tilde_axis_x = create_ia_descriptor(*fft.tilde_axis_x); + + std::vector write_descriptor_sets_axis_x = { + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_x, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &image_descriptor_butterfly), + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_x, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &image_descriptor_tilda_x), + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_x, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u, &image_descriptor_tilde_axis_x)}; + + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets_axis_x.size()), write_descriptor_sets_axis_x.data(), 0u, nullptr); + + VkDescriptorImageInfo image_descriptor_tilda_z = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dz); + VkDescriptorImageInfo image_descriptor_tilde_axis_z = create_ia_descriptor(*fft.tilde_axis_z); + + std::vector write_descriptor_sets_axis_z = { + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_z, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &image_descriptor_butterfly), + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_z, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &image_descriptor_tilda_z), + vkb::initializers::write_descriptor_set(fft.descriptor_set_axis_z, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u, &image_descriptor_tilde_axis_z)}; + + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets_axis_z.size()), write_descriptor_sets_axis_z.data(), 0u, nullptr); +} + +void SubgroupsOperations::create_fft_inversion() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 0u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 1u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 2u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 3u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 4u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 5u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 6u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 7u)}; + + VkDescriptorSetLayoutCreateInfo descriptor_layout = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &fft_inversion.descriptor_set_layout)); + + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &fft_inversion.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &fft_inversion.descriptor_set)); + + VkPipelineLayoutCreateInfo compute_pipeline_layout_info = vkb::initializers::pipeline_layout_create_info(&fft_inversion.descriptor_set_layout); + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft_inversion.pipeline.pipeline_layout)); + + VkComputePipelineCreateInfo computeInfo = {}; + computeInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + computeInfo.layout = fft_inversion.pipeline.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft_invert.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft_inversion.pipeline.pipeline)); + +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft_inversion.pipeline_subgroups_off.pipeline_layout)); + computeInfo.layout = fft_inversion.pipeline_subgroups_off.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft_invert_subgroups_off.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft_inversion.pipeline_subgroups_off.pipeline)); + +#endif + + fft_buffers.fft_displacement = std::make_unique(); + + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_displacement); + + VkDescriptorImageInfo image_descriptor_displacement = create_ia_descriptor(*fft_buffers.fft_displacement); + VkDescriptorImageInfo image_descriptor_pingpong0_axis_y = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dy); + VkDescriptorImageInfo image_descriptor_pingpong1_axis_y = create_ia_descriptor(*fft.tilde_axis_y); + VkDescriptorImageInfo image_descriptor_pingpong0_axis_x = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dx); + VkDescriptorImageInfo image_descriptor_pingpong1_axis_x = create_ia_descriptor(*fft.tilde_axis_x); + VkDescriptorImageInfo image_descriptor_pingpong0_axis_z = create_ia_descriptor(*fft_buffers.fft_tilde_h_kt_dz); + VkDescriptorImageInfo image_descriptor_pingpong1_axis_z = create_ia_descriptor(*fft.tilde_axis_z); + + auto fft_page_descriptor = create_descriptor(*invert_fft_ubo); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &image_descriptor_displacement), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &image_descriptor_pingpong0_axis_y), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u, &image_descriptor_pingpong1_axis_y), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 3u, &image_descriptor_pingpong0_axis_x), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 4u, &image_descriptor_pingpong1_axis_x), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 5u, &image_descriptor_pingpong0_axis_z), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 6u, &image_descriptor_pingpong1_axis_z), + vkb::initializers::write_descriptor_set(fft_inversion.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 7u, &fft_page_descriptor)}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0u, nullptr); +} + +void SubgroupsOperations::create_fft_normal_map() +{ + std::vector set_layout_bindings = { + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 0u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT, 1u), + vkb::initializers::descriptor_set_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT, 2u)}; + + VkDescriptorSetLayoutCreateInfo descriptor_layout = vkb::initializers::descriptor_set_layout_create_info(set_layout_bindings); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &fft_normal_map.descriptor_set_layout)); + + VkDescriptorSetAllocateInfo alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &fft_normal_map.descriptor_set_layout, 1u); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &fft_normal_map.descriptor_set)); + + VkPipelineLayoutCreateInfo compute_pipeline_layout_info = vkb::initializers::pipeline_layout_create_info(&fft_normal_map.descriptor_set_layout); + + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft_normal_map.pipeline.pipeline_layout)); + + VkComputePipelineCreateInfo computeInfo = {}; + computeInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + computeInfo.layout = fft_normal_map.pipeline.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft_normal_map.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft_normal_map.pipeline.pipeline)); + +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &compute_pipeline_layout_info, nullptr, &fft_normal_map.pipeline_subgroups_off.pipeline_layout)); + computeInfo.layout = fft_normal_map.pipeline_subgroups_off.pipeline_layout; + computeInfo.stage = load_shader("subgroups_operations/fft_normal_map_subgroups_off.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); + VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1u, &computeInfo, nullptr, &fft_normal_map.pipeline_subgroups_off.pipeline)); +#endif + + fft_buffers.fft_normal_map = std::make_unique(); + + create_image_attachement(VK_FORMAT_R32G32B32A32_SFLOAT, grid_size, grid_size, *fft_buffers.fft_normal_map); + + VkDescriptorImageInfo image_descriptor_normal_map = create_ia_descriptor(*fft_buffers.fft_normal_map); + VkDescriptorImageInfo image_descriptor_displacement = create_ia_descriptor(*fft_buffers.fft_displacement); + VkDescriptorBufferInfo fft_page_descriptor = create_descriptor(*invert_fft_ubo); + + std::vector write_descriptor_sets = { + vkb::initializers::write_descriptor_set(fft_normal_map.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0u, &image_descriptor_normal_map), + vkb::initializers::write_descriptor_set(fft_normal_map.descriptor_set, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, &image_descriptor_displacement), + vkb::initializers::write_descriptor_set(fft_normal_map.descriptor_set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2u, &fft_page_descriptor)}; + vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0u, nullptr); +} + +VkDescriptorImageInfo SubgroupsOperations::create_ia_descriptor(ImageAttachment &attachment) +{ + VkDescriptorImageInfo image_descriptor = {}; + image_descriptor.imageView = attachment.view; + image_descriptor.imageLayout = VK_IMAGE_LAYOUT_GENERAL; + image_descriptor.sampler = attachment.sampler; + return image_descriptor; +} + +void SubgroupsOperations::Wind::recalc() +{ + float rad = angle * glm::pi() / 180.0f; + vec.x = force * glm::cos(rad); + vec.y = force * glm::sin(rad); +} + +std::unique_ptr create_subgroups_operations() +{ + return std::make_unique(); +} + +void SubgroupsOperations::create_command_pool() +{ + VkCommandPoolCreateInfo command_pool_info = {}; + command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + command_pool_info.queueFamilyIndex = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, 0).get_family_index(); + command_pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + VK_CHECK(vkCreateCommandPool(get_device().get_handle(), &command_pool_info, nullptr, &cmd_pool)); +} \ No newline at end of file diff --git a/samples/extensions/subgroups_operations/subgroups_operations.h b/samples/extensions/subgroups_operations/subgroups_operations.h new file mode 100644 index 0000000000..8ebe85dbf0 --- /dev/null +++ b/samples/extensions/subgroups_operations/subgroups_operations.h @@ -0,0 +1,306 @@ +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "api_vulkan_sample.h" + +#define DEBUG_SUBGROUPS_SWITCH_ENABLE + +class SubgroupsOperations : public ApiVulkanSample +{ + public: + SubgroupsOperations(); + ~SubgroupsOperations() override; + + bool prepare(const vkb::ApplicationOptions &options) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + void build_command_buffers() override; + void render(float delta_time) override; + bool resize(const uint32_t width, const uint32_t height) override; + void on_update_ui_overlay(vkb::Drawer &drawer) override; + void create_command_pool() override; + + void draw(); + void load_assets(); + + void prepare_compute(); + void create_compute_queue(); + void create_compute_command_pool(); + void create_compute_command_buffer(); + + void build_compute_command_buffer(); + + void generate_plane(); + void prepare_uniform_buffers(); + void setup_descriptor_pool(); + void create_semaphore(); + void create_descriptor_set_layout(); + void create_descriptor_set(); + void create_pipelines(); + + void create_initial_tides(); + void create_tildas(); + void create_butterfly_texture(); + void create_fft(); + void create_fft_inversion(); + void create_fft_normal_map(); + + void update_uniform_buffers(); + + static glm::vec2 rndGaussian(); + uint32_t grid_size; + + struct Pipeline + { + void destroy(VkDevice device) const; + + VkPipeline pipeline = {VK_NULL_HANDLE}; + VkPipelineLayout pipeline_layout = {VK_NULL_HANDLE}; + }; + + struct GridBuffers + { + std::unique_ptr vertex = {VK_NULL_HANDLE}; + std::unique_ptr index = {VK_NULL_HANDLE}; + uint32_t index_count = {0u}; + }; + + struct CameraUbo + { + alignas(16) glm::mat4 projection; + alignas(16) glm::mat4 view; + alignas(16) glm::mat4 model; + }; + + struct OceanParamsUbo + { + alignas(16) glm::vec3 light_color; + alignas(16) glm::vec3 light_position; + alignas(16) glm::vec3 ocean_color; + }; + + struct CameraPositionUbo + { + alignas(16) glm::vec4 position; + }; + + struct TessellationParamsUbo + { + alignas(4) float choppines; + alignas(4) float displacement_scale; + }; + + struct FFTParametersUbo + { + alignas(4) float amplitude; + alignas(4) float length; + alignas(4) uint32_t grid_size; + alignas(8) glm::vec2 wind; + }; + + struct FFTInvertUbo + { + alignas(4) int32_t page_idx = {-1}; + alignas(4) uint32_t grid_size = {256u}; + }; + + struct TimeUbo + { + alignas(4) float time = {0.0f}; + }; + + struct Wind + { + Wind() + { + recalc(); + } + void recalc(); + glm::vec2 vec; + float angle = {180.0f}; + float force = {25.0f}; + }; + + struct GuiConfig + { + bool wireframe = {true}; + bool subgroups_enabled = {true}; + float choppines = {0.1f}; + float displacement_scale = {0.5f}; + float amplitude = {32.0f}; + float length = {1900.0f}; + Wind wind{}; + + glm::vec3 light_pos = {100.0f, 15.0f, 10.0f}; + glm::vec3 light_color = {1.0f, 1.0f, 1.0f}; + glm::vec3 ocean_color = {0.0f, 0.2423423f, 0.434335435f}; + std::vector supported_features; + } ui; + + std::unique_ptr skybox_ubo = {VK_NULL_HANDLE}; + std::unique_ptr ocean_params_ubo = {VK_NULL_HANDLE}; + std::unique_ptr camera_position_ubo = {VK_NULL_HANDLE}; + std::unique_ptr camera_ubo = {VK_NULL_HANDLE}; + std::unique_ptr tessellation_params_ubo = {VK_NULL_HANDLE}; + std::unique_ptr fft_params_ubo = {VK_NULL_HANDLE}; + std::unique_ptr fft_time_ubo = {VK_NULL_HANDLE}; + std::unique_ptr invert_fft_ubo = {VK_NULL_HANDLE}; + std::unique_ptr bit_reverse_buffer = {VK_NULL_HANDLE}; + + std::vector input_random; + + struct ImageAttachment + { + VkImage image; + VkDeviceMemory memory; + VkImageView view; + VkFormat format; + VkSampler sampler; + void destroy(VkDevice device) const + { + vkDestroySampler(device, sampler, nullptr); + vkDestroyImageView(device, view, nullptr); + vkDestroyImage(device, image, nullptr); + vkFreeMemory(device, memory, nullptr); + }; + }; + + ImageAttachment butterfly_precomp{}; + + uint32_t log_2_N{}; + vkb::Timer timer; + + struct + { + std::unique_ptr fft_input_random; + std::unique_ptr fft_input_htilde0; + std::unique_ptr fft_input_htilde0_conj; + + std::unique_ptr fft_tilde_h_kt_dx; + std::unique_ptr fft_tilde_h_kt_dy; + std::unique_ptr fft_tilde_h_kt_dz; + std::unique_ptr fft_displacement; + std::unique_ptr fft_normal_map; + } fft_buffers; + + struct + { + VkQueue queue = {VK_NULL_HANDLE}; + VkCommandPool command_pool = {VK_NULL_HANDLE}; + VkCommandBuffer command_buffer = {VK_NULL_HANDLE}; + VkSemaphore semaphore = {VK_NULL_HANDLE}; + uint32_t queue_family_index = {-1u}; + } compute; + + struct + { + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set_axis_y = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set_axis_x = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set_axis_z = {VK_NULL_HANDLE}; + + struct + { + Pipeline horizontal; // fft.comp + Pipeline vertical; // fft.comp +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + Pipeline horizontal_subgroups_off; // fft_subgroups_off.comp + Pipeline vertical_subgroups_off; // fft_subgroups_off.comp +#endif + } pipelines; + + std::unique_ptr tilde_axis_y = {VK_NULL_HANDLE}; + std::unique_ptr tilde_axis_x = {VK_NULL_HANDLE}; + std::unique_ptr tilde_axis_z = {VK_NULL_HANDLE}; + } fft; + + struct + { + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set = {VK_NULL_HANDLE}; + Pipeline pipeline; // fft_invert.comp +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + Pipeline pipeline_subgroups_off; // fft_invert_subgroups_off.comp +#endif + + } fft_inversion; + + struct + { + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set = {VK_NULL_HANDLE}; + Pipeline pipeline; // fft_normal_map.comp +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + Pipeline pipeline_subgroups_off; // fft_normal_map_subgroups_off.comp +#endif + } fft_normal_map; + + struct + { + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set = {VK_NULL_HANDLE}; + Pipeline pipeline; // fft_tilde_h0.comp +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + Pipeline pipeline_subgroups_off; // fft_tilde_h0_subgroups_off.comp +#endif + } initial_tildes; + + struct + { + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set = {VK_NULL_HANDLE}; + Pipeline pipeline; // fft_tilde_h.comp +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + Pipeline pipeline_subgroups_off; // fft_tilde_h_subgroups_off.comp +#endif + } tildes; + + struct + { + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set = {VK_NULL_HANDLE}; + Pipeline pipeline; // butterfly_precomp.comp +#ifdef DEBUG_SUBGROUPS_SWITCH_ENABLE + Pipeline pipeline_subgroups_off; // butterfly_precomp_subgroups_off.comp +#endif + } precompute; + + struct + { + GridBuffers grid; + uint32_t graphics_queue_family_index = {-1u}; + VkDescriptorSetLayout descriptor_set_layout = {VK_NULL_HANDLE}; + VkDescriptorSet descriptor_set = {VK_NULL_HANDLE}; + VkSemaphore semaphore = {VK_NULL_HANDLE}; + + struct + { + Pipeline _default; // ocean.* + Pipeline wireframe; // ocean.* + } pipelines; + } ocean; + + VkPhysicalDeviceSubgroupProperties subgroups_properties{}; + + private: + uint32_t reverse(uint32_t i) const; + VkDescriptorImageInfo create_ia_descriptor(ImageAttachment &attachment); + void create_image_attachement(VkFormat format, uint32_t width, uint32_t height, ImageAttachment &result); +}; + +std::unique_ptr create_subgroups_operations(); \ No newline at end of file diff --git a/samples/extensions/synchronization_2/CMakeLists.txt b/samples/extensions/synchronization_2/CMakeLists.txt index 5ee329f060..41a84ad5af 100644 --- a/samples/extensions/synchronization_2/CMakeLists.txt +++ b/samples/extensions/synchronization_2/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, Sascha Willems +# Copyright (c) 2021-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -34,4 +34,9 @@ add_sample_with_tags( "synchronization_2/hlsl/particle.vert.hlsl" "synchronization_2/hlsl/particle.frag.hlsl" "synchronization_2/hlsl/particle_calculate.comp.hlsl" - "synchronization_2/hlsl/particle_integrate.comp.hlsl") + "synchronization_2/hlsl/particle_integrate.comp.hlsl" + SHADER_FILES_SLANG + "synchronization_2/slang/particle.vert.slang" + "synchronization_2/slang/particle.frag.slang" + "synchronization_2/slang/particle_calculate.comp.slang" + "synchronization_2/slang/particle_integrate.comp.slang") diff --git a/samples/extensions/synchronization_2/README.adoc b/samples/extensions/synchronization_2/README.adoc index 2dd6563175..1365be8585 100644 --- a/samples/extensions/synchronization_2/README.adoc +++ b/samples/extensions/synchronization_2/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2020-2023, The Khronos Group +- Copyright (c) 2020-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -24,7 +24,7 @@ TIP: The source for this sample can be found in the https://github.com/KhronosGr endif::[] -*Extension* https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_synchronization2[`VK_KHR_synchronization2`] +*Extension* https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#VK_KHR_synchronization2[`VK_KHR_synchronization2`] Demonstrates the use of the reworked synchronization api introduced with `VK_KHR_synchronization2`. Based on the compute shading N-Body particle system, this sample uses the new extension to streamline the memory barriers used for the compute and graphics work submissions. diff --git a/samples/extensions/synchronization_2/synchronization_2.cpp b/samples/extensions/synchronization_2/synchronization_2.cpp index c7fc25ebf0..b69768523e 100644 --- a/samples/extensions/synchronization_2/synchronization_2.cpp +++ b/samples/extensions/synchronization_2/synchronization_2.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -63,7 +63,7 @@ Synchronization2::~Synchronization2() } } -void Synchronization2::request_gpu_features(vkb::PhysicalDevice &gpu) +void Synchronization2::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Enable anisotropic filtering if supported if (gpu.get_features().samplerAnisotropy) @@ -72,10 +72,7 @@ void Synchronization2::request_gpu_features(vkb::PhysicalDevice &gpu) } // Enable synchronization2 feature - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceSynchronization2FeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, - synchronization2); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceSynchronization2FeaturesKHR, synchronization2); } void Synchronization2::load_assets() @@ -459,8 +456,8 @@ void Synchronization2::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("synchronization_2", "particle.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("synchronization_2", "particle.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("synchronization_2", "particle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("synchronization_2", "particle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { @@ -585,7 +582,7 @@ void Synchronization2::prepare_compute() VkComputePipelineCreateInfo compute_pipeline_create_info = vkb::initializers::compute_pipeline_create_info(compute.pipeline_layout, 0); // 1st pass - Particle movement calculations - compute_pipeline_create_info.stage = load_shader("synchronization_2", "particle_calculate.comp", VK_SHADER_STAGE_COMPUTE_BIT); + compute_pipeline_create_info.stage = load_shader("synchronization_2", "particle_calculate.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); // Set some shader parameters via specialization constants struct SpecializationData @@ -617,7 +614,7 @@ void Synchronization2::prepare_compute() VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1, &compute_pipeline_create_info, nullptr, &compute.pipeline_calculate)); // 2nd pass - Particle integration - compute_pipeline_create_info.stage = load_shader("synchronization_2", "particle_integrate.comp", VK_SHADER_STAGE_COMPUTE_BIT); + compute_pipeline_create_info.stage = load_shader("synchronization_2", "particle_integrate.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); specialization_map_entries.clear(); specialization_map_entries.push_back(vkb::initializers::specialization_map_entry(0, 0, sizeof(uint32_t))); @@ -630,7 +627,7 @@ void Synchronization2::prepare_compute() // Separate command pool as queue family for compute may be different than graphics VkCommandPoolCreateInfo command_pool_create_info = {}; command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - command_pool_create_info.queueFamilyIndex = get_device().get_queue_family_index(VK_QUEUE_COMPUTE_BIT); + command_pool_create_info.queueFamilyIndex = vkb::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), VK_QUEUE_COMPUTE_BIT); command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; VK_CHECK(vkCreateCommandPool(get_device().get_handle(), &command_pool_create_info, nullptr, &compute.command_pool)); @@ -826,8 +823,9 @@ bool Synchronization2::prepare(const vkb::ApplicationOptions &options) return false; } - graphics.queue_family_index = get_device().get_queue_family_index(VK_QUEUE_GRAPHICS_BIT); - compute.queue_family_index = get_device().get_queue_family_index(VK_QUEUE_COMPUTE_BIT); + auto const &queue_family_properties = get_device().get_gpu().get_queue_family_properties(); + graphics.queue_family_index = vkb::get_queue_family_index(queue_family_properties, VK_QUEUE_GRAPHICS_BIT); + compute.queue_family_index = vkb::get_queue_family_index(queue_family_properties, VK_QUEUE_COMPUTE_BIT); // Not all implementations support a work group size of 256, so we need to check with the device limits work_group_size = std::min(static_cast(256), get_device().get_gpu().get_properties().limits.maxComputeWorkGroupSize[0]); diff --git a/samples/extensions/synchronization_2/synchronization_2.h b/samples/extensions/synchronization_2/synchronization_2.h index f69e8d4d99..0776d8b247 100644 --- a/samples/extensions/synchronization_2/synchronization_2.h +++ b/samples/extensions/synchronization_2/synchronization_2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -97,7 +97,7 @@ class Synchronization2 : public ApiVulkanSample Synchronization2(); ~Synchronization2(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void load_assets(); void build_command_buffers() override; void build_compute_command_buffer(); diff --git a/samples/extensions/tensor_and_data_graph/README.adoc b/samples/extensions/tensor_and_data_graph/README.adoc new file mode 100644 index 0000000000..149d3075a8 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/README.adoc @@ -0,0 +1,69 @@ +//// +- Copyright (c) 2024-2025, Arm Limited and Contributors +- +- SPDX-License-Identifier: Apache-2.0 +- +- Licensed under the Apache License, Version 2.0 the "License"; +- you may not use this file except in compliance with the License. +- You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +- Unless required by applicable law or agreed to in writing, software +- distributed under the License is distributed on an "AS IS" BASIS, +- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +- See the License for the specific language governing permissions and +- limitations under the License. +- +//// + += Tensor and Data Graph + +== Overview + +The samples in this folder demonstrate the use of the *VK_ARM_tensors* and *VK_ARM_data_graph* extensions. The *VK_ARM_data_graph* extension introduces data graph pipelines, which are used in all samples. A data graph pipeline is a new Vulkan pipeline type designed to execute dataflow graphs that can be described using SPIR-V modules. Similar to compute pipelines, they use descriptor sets to access external resources, are compiled at creation time, and support pipeline caching and offline binaries. + +Data graph pipelines integrate naturally into the existing Vulkan ecosystem, leveraging familiar SPIR-V tooling and workflows, and are especially well-suited for machine learning workloads as a drop-in replacement for sequences of compute pipelines. + +To demonstrate their use, we’ve added data graph pipeline-based samples that walk through setting up a data graph pipeline and executing simple neural networks. These examples cover key features such as using graph constants, writing SPIR-V code, creating tensors, interacting with compute shaders and aliasing memory to avoid unnecessary copying. + + +The samples in this folder are: + +* xref:./simple_tensor_and_data_graph/README.adoc[Simple tensor and data graph] + +== Setup + +Some setup steps are needed before you can build and run these samples. + +NOTE: The samples and their dependencies can be built and run on Windows and Linux, other operating systems are not currently supported. + +=== Update Vulkan SDK + +In order to compile the shader code used in these samples, a recent version of the Vulkan SDK is required. The samples have been tested and confirmed to work with SDK version 1.4.321. + +=== Enable the emulation layers (Graph & Tensor) + +Note: The ML Emulation Layer for Vulkan is only required on devices where the *VK_ARM_tensors* and *VK_ARM_data_graph* extensions are not available. + +Install and enable link:https://github.com/arm/ai-ml-emulation-layer-for-vulkan[ML Emulation Layer for Vulkan] from GitHub. Please follow the steps in that repository to build and enable the emulation layers. + +Alternatively, on Windows, the Vulkan Configurator tool — which is part of the Vulkan SDK — can also be used, as described below. If it is not already installed, it can be obtained from the link:https://vulkan.lunarg.com/[Vulkan SDK] website. + +Once installed, open Vulkan Configurator and navigate to the Vulkan Layers Location tab. Click the plus (+) symbol to append a user-defined layers path, +and navigate to the folder containing the built layers (DLLs and json files). Please note that there are two separate layers that need to be enabled, so if these are in separate folders then you will need to add both. + +Note: It is recommended to disable the validation layer when running these samples as the new extensions are not supported yet. + +image::./loading_layers.png[Loading Layers Completed] + +This should add the layers to the Vulkan Loader Management tab. The Graph layer needs to sit on top of the Tensor layer. + +image::./verify_layers.png[VK Layers] + +When running any of these samples, if you receive an error message similar to: +---- + Requested required feature is not supported +---- +then it is likely that the emulation layers are not enabled correctly. Please check the steps above to ensure that the layers are loaded and enabled and make sure the Vulkan Configurator is running before launching the sample executable. Depending on your system, you may encounter issues with using the emulation layers when running with administrative privileges - please try running without administrative privileges if you encounter issues. + diff --git a/samples/extensions/tensor_and_data_graph/loading_layers.png b/samples/extensions/tensor_and_data_graph/loading_layers.png new file mode 100644 index 0000000000..dfbed90e4e Binary files /dev/null and b/samples/extensions/tensor_and_data_graph/loading_layers.png differ diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/CMakeLists.txt b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/CMakeLists.txt new file mode 100644 index 0000000000..a95a895efd --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/CMakeLists.txt @@ -0,0 +1,39 @@ +# Copyright (c) 2024-2025, Arm Limited and Contributors +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 the "License"; +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if(WIN32 OR ANDROID OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_sample_with_tags( + ID "simple_tensor_and_data_graph" + CATEGORY "extensions/tensor_and_data_graph" + AUTHOR "Arm Ltd." + NAME "Simple tensor and data graph" + DESCRIPTION "Demonstrates simple use of the tensor and data graph extensions for machine learning inference" + TAGS + "arm" + FILES + "../tensor_and_data_graph_common.h" + "../tensor_and_data_graph_common.cpp" + "simple_tensor_and_data_graph.h" + "simple_tensor_and_data_graph.cpp" + SHADER_FILES_GLSL + "tensor_and_data_graph/glsl/blit.frag" + "tensor_and_data_graph/glsl/fullscreen.vert" + "tensor_and_data_graph/glsl/visualization_two_tensors.comp" + SHADER_FILES_SPVASM + "tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm" + ) +endif() \ No newline at end of file diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/README.adoc b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/README.adoc new file mode 100644 index 0000000000..f0697ffcf5 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/README.adoc @@ -0,0 +1,587 @@ +//// +- Copyright (c) 2024-2025, Arm Limited and Contributors +- +- SPDX-License-Identifier: Apache-2.0 +- +- Licensed under the Apache License, Version 2.0 the "License"; +- you may not use this file except in compliance with the License. +- You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +- Unless required by applicable law or agreed to in writing, software +- distributed under the License is distributed on an "AS IS" BASIS, +- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +- See the License for the specific language governing permissions and +- limitations under the License. +- +//// += Simple tensor and data graph + +ifdef::site-gen-antora[] +TIP: The source for this sample can be found in the https://github.com/KhronosGroup/Vulkan-Samples/tree/main/samples/extensions/extensions/tensor_and_data_graph/simple_tensor_and_data_graph[Khronos Vulkan samples github repository]. +endif::[] + +== Overview + +This sample demonstrates the usage of the `VK_ARM_tensors` and `VK_ARM_data_graph` extensions for machine learning inference. These extensions provide a way to define tensor data and construct computation graphs for neural network execution using hardware acceleration. + +This is the first in a series of samples which introduce the tensor and data graph extensions. Please see the parent xref:samples/extensions/tensor_and_data_graph/README.adoc[Tensor and Data Graph] page for the full list of samples. + +NOTE: While the model used in this example is expressed using https://www.mlplatform.org/tosa/[TOSA operations], there is currently no defined way to query for TOSA operation support from the Vulkan API. Execution of this sample may fail on implementations of these extensions that do not include specific support for TOSA operations. + +== Setup + +If you would like to build and run this sample, please make sure to first follow the setup steps on the xref:samples/extensions/tensor_and_data_graph/README.adoc[Tensor and Data Graph] page. + +== Introduction + +This sample demonstrates how to run a minimal neural network that consumes a single input tensor, with a batch size of 1, a width and height of 10 and 3 channels. The input tensor has a fixed pattern of colors uploaded to it from the CPU. In this case we are using a neural network with a single 2D average pooling layer. In order to display the contents of the input and output tensors onto the window, a compute shader is run after the neural network which 'draws' the two tensors into an image which is then blitted to the window. The diagram below shows how this works: + +image::./images/flow.svg[Sample] + +The image below shows how this sample will look when running: + +image::./images/sample.png[Sample] + +== Graph Pipelines + +image::./images/network.svg[Sample,align="center"] + +The neural network is executed using a new type of pipeline called a _data graph pipeline_. The overall flow when using data graph pipelines is very similar to using compute or graphics pipelines. Our neural network will be encapsulated into a data graph pipeline that can be dispatched using a command buffer. Similarly to compute or graphics pipelines, data graph pipelines can access resources defined outside of the pipeline via descriptor sets and their external interface has to be described using a pipeline layout. Therefore we'll need to create a descriptor set layout and a pipeline layout to that effect. Then we will create the pipeline itself. Data graph pipelines need state and memory to run. Both are encapsulated in a resource called a _data graph pipeline session_. We will create one for our pipeline. We will then create tensor objects for the input and output to our network, descriptor sets to communicate these objects and, finally, record a dispatch command in a command buffer to execute our network. + +In summary, we need to create these objects: + +1. A descriptor set layout and pipeline layout to describe the interface with our data graph pipeline + +2. A data graph pipeline to encapsulate the behavior of our neural network + +3. A data graph pipeline session within which the data graph pipeline can run + +4. Tensor objects for our network's input and output + +5. Descriptor sets to communicate these tensor resources to our data graph pipeline + +=== Pipeline interface === + +The external interface to our pipeline is described using descriptor set layouts and pipeline layouts, just like for compute or graphics pipelines. Here’s the interface we will use: + +image::./images/pipeline_interface.svg[Sample,align="center"] + +The code to create these objects is in the `prepare_data_graph_pipeline` method, but calls out to a helper class `DataGraphPipelineLayout` to do most of the work. The `DataGraphPipelineLayout` constructor creates a single `VkDescriptorSetLayout` containing the two tensor bindings (the binding numbers of the tensors are passed as parameters) and then creates a `VkPipelineLayout` from the descriptor set layout: + +[source,cpp,options="nowrap"] +---- +std::set tensor_bindings = {0, 1}; +std::vector layout_bindings; +for (uint32_t binding : tensor_bindings) +{ + VkDescriptorSetLayoutBinding layout_binding{}; + layout_binding.binding = binding; + layout_binding.descriptorCount = 1; + layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TENSOR_ARM; + + // Data graph pipelines don't have shader stages per-se, so VK_SHADER_STAGE_ALL is used. + layout_binding.stageFlags = VK_SHADER_STAGE_ALL; + layout_bindings.push_back(layout_binding); +} + +// Create set layout +VkDescriptorSetLayoutCreateInfo set_layout_create_info + {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; +set_layout_create_info.bindingCount = layout_bindings.size(); +set_layout_create_info.pBindings = layout_bindings.data(); + +VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), + &set_layout_create_info, + nullptr, + &descriptor_set_layout)); + +// Create pipeline layout +VkPipelineLayoutCreateInfo pipeline_layout_create_info + {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; +pipeline_layout_create_info.setLayoutCount = 1; +pipeline_layout_create_info.pSetLayouts = &descriptor_set_layout; + +VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), + &pipeline_layout_create_info, + nullptr, + &get_handle())); +---- + +The pipeline layout object is now ready to use for creating a data graph pipeline. + +=== Pipeline === + +Neural networks can be described using SPIR-V modules and use descriptor sets to access external resources. The contents of the SPIR-V module for this sample is explained further in <>, but for now we will treat it as a closed box, and just need to know that it takes one input tensor, produces one output tensor and performs a pooling operation which reduces the width and height of its input by half. + +The code to create the pipeline is in the `prepare_data_graph_pipeline` method, just after creating the pipeline layout. As with the layout, a helper class `DataGraphPipeline` does most of the work. + +Before we can create a data graph pipeline from a SPIR-V module, we need to create a `VkShaderModule` object to encapsulate that module, as would be done for compute or graphics pipelines: + +[source,cpp,options="nowrap"] +---- +// This could be created using the SPIR-V assembler or from other tooling (see Appendix A) +std::vector spvcode; + +// Create shader module from binary +VkShaderModuleCreateInfo module_create_info{}; +module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; +module_create_info.codeSize = spvcode.size() * 4; +module_create_info.pCode = spvcode.data(); + +VkShaderModule shader_module; +VK_CHECK(vkCreateShaderModule(get_device().get_handle(), &module_create_info, NULL, &shader_module)); +---- + +Now that we have a `VkShaderModule` for our neural network, we can create a data graph pipeline for it. Data graph pipelines are created using `vkCreateDataGraphPipelinesARM` in a manner similar to how other types of pipelines are created. We also need to provide additional information about the resources accessed by the pipeline via descriptor sets. This information is not present in the SPIR-V module, but needs to be known when creating the pipeline, so is provided here. For each resource binding that is part of the pipeline layout, a `VkDataGraphPipelineResourceInfoARM` must be provided which describes the dimensions, memory layout and element type for each tensor. The `DataGraphPipeline` constructor takes this information as a parameter: + +[source,cpp,options="nowrap"] +---- +// Create array of data graph pipeline resource infos (one for each input/output tensor) +// Use std::list for VkDataGraphPipelineResourceInfoTensorARMs so that the addresses don't +// change as we add (because resource_infos will point to these) +std::list tensor_description_list; +std::vector resource_infos; +for (const auto &tensor_descriptions_set : tensor_descriptions) +{ + uint32_t set_idx = tensor_descriptions_set.first; + const std::map &tensor_descriptions_this_set = + tensor_descriptions_set.second; + + for (const auto &tensor_description_binding : tensor_descriptions_this_set) + { + VkTensorDescriptionARM tensor_description = tensor_description_binding.second; + tensor_description_list.push_back(tensor_description); + + VkDataGraphPipelineResourceInfoARM resource_info = + {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_RESOURCE_INFO_ARM}; + // Note we use the copy that we saved in the list, not the local stack copy! + resource_info.pNext = &tensor_description_list.back(); + resource_info.descriptorSet = set_idx; + resource_info.binding = tensor_description_binding.first; + resource_infos.push_back(resource_info); + } +} + +// Create data graph pipeline +VkDataGraphPipelineShaderModuleCreateInfoARM pipeline_shader_module_create_info + {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SHADER_MODULE_CREATE_INFO_ARM}; +pipeline_shader_module_create_info.module = shader_module; +pipeline_shader_module_create_info.pName = entry_point; + +VkDataGraphPipelineCreateInfoARM pipeline_create_info + {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_CREATE_INFO_ARM}; +pipeline_create_info.pNext = &pipeline_shader_module_create_info; +pipeline_create_info.layout = layout; +pipeline_create_info.resourceInfoCount = resource_infos.size(); +pipeline_create_info.pResourceInfos = resource_infos.data(); + +VK_CHECK(vkCreateDataGraphPipelinesARM(get_device().get_handle(), + VK_NULL_HANDLE, + VK_NULL_HANDLE, + 1, + &pipeline_create_info, + nullptr, + &get_handle())); +---- + +The data graph pipeline object is now created, but needs a session before it can be used. + +=== Pipeline session === + +A data graph pipeline needs state to execute, for example to store the results of any intermediate operations in the neural network. The implementation handles all this internally but it does need some memory to be provided. This state is encapsulated into _data graph pipeline session_ objects. + +This session object is created in the `prepare_data_graph_pipeline` method, just after creating the pipeline itself. As with the pipeline, a helper class `DataGraphPipelineSession` does most of the work. Because sessions need to be bound to memory (just like images and buffers), the sample code makes use of the _Vulkan Memory Allocator_ (VMA) framework to abstract away the details of the memory allocation. This is wrapped up in the function `vmaCreateDataGraphPipelineSession` which is written to be very similar to the existing `vmaCreateImage/vmaCreateBuffer` functions. As with buffers and images, the session is created without any backing memory and then its memory requirements are queried. We can then allocate some appropriate memory and bind it to the session: + +[source,cpp,options="nowrap"] +---- +// 1. Create DataGraphPipelineSession. +VkResult res = vkCreateDataGraphPipelineSessionARM( + device, + pDataGraphPipelineSessionCreateInfo, + nullptr, + pDataGraphPipelineSession); +if (res >= 0) +{ + // 2. Query valid bind points for the session + VkDataGraphPipelineSessionBindPointRequirementsInfoARM bind_point_req_info = + {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENTS_INFO_ARM}; + bind_point_req_info.session = *pDataGraphPipelineSession; + uint32_t requirement_count = 0; + + res = vkGetDataGraphPipelineSessionBindPointRequirementsARM( + device, &bind_point_req_info, &requirement_count, nullptr); + if (res != VK_SUCCESS) + { + return res; + } + + if (requirement_count > 1) + { + // A session could require more than one bind point, + // but for simplicity we only support one bind point type in this function. + return VK_ERROR_INITIALIZATION_FAILED; + } + + VkDataGraphPipelineSessionBindPointRequirementARM bind_point_requirement{ + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENT_ARM}; + res = vkGetDataGraphPipelineSessionBindPointRequirementsARM( + device, &bind_point_req_info, &requirement_count, &bind_point_requirement); + if (res != VK_SUCCESS) + { + return res; + } + + if (bind_point_requirement.numObjects > 1) + { + // A single bind point requirement could require more than one object, + // but for simplicity we only support one object type in this function. + return VK_ERROR_INITIALIZATION_FAILED; + } + if (bind_point_requirement.bindPointType != VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TYPE_MEMORY_ARM) + { + // Currently we only support the memory bind point type + return VK_ERROR_INITIALIZATION_FAILED; + } + + // 3. vkGetDataGraphPipelineSessionMemoryRequirements. + VkDataGraphPipelineSessionBindPointARM memory_bind_point = + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TRANSIENT_ARM; + VkMemoryRequirements2 vkMemReq = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}; + VkDataGraphPipelineSessionMemoryRequirementsInfoARM memory_requirements_info = + {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_MEMORY_REQUIREMENTS_INFO_ARM}; + memory_requirements_info.session = *pDataGraphPipelineSession; + memory_requirements_info.bindPoint = memory_bind_point; + memory_requirements_info.objectIndex = 0; + vkGetDataGraphPipelineSessionMemoryRequirementsARM(device, &memory_requirements_info, &vkMemReq); + + if (vkMemReq.memoryRequirements.size > 0) + { + // 4. Allocate memory using allocator. + VmaAllocationInfo allocation_info; + res = vmaAllocateMemory(allocator, + &vkMemReq.memoryRequirements, + pAllocationCreateInfo, + pAllocation, + &allocation_info); + + if (res >= 0) + { + if (pAllocationInfo != nullptr) + { + // Return allocation info to caller, if requested + *pAllocationInfo = allocation_info; + } + + // 5. Bind session with memory. + if ((pAllocationCreateInfo->flags & VMA_ALLOCATION_CREATE_DONT_BIND_BIT) == 0) + { + VkBindDataGraphPipelineSessionMemoryInfoARM bind_info = + {VK_STRUCTURE_TYPE_BIND_DATA_GRAPH_PIPELINE_SESSION_MEMORY_INFO_ARM}; + bind_info.session = *pDataGraphPipelineSession; + bind_info.memory = allocation_info.deviceMemory; + bind_info.memoryOffset = allocation_info.offset; + bind_info.bindPoint = memory_bind_point; + bind_info.objectIndex = 0; + res = vkBindDataGraphPipelineSessionMemoryARM(device, 1, &bind_info); + } + if (res >= 0) + { + // All steps succeeded. + return VK_SUCCESS; + } + + // Cleanup in case of errors + vmaFreeMemory(allocator, *pAllocation); + *pAllocation = VK_NULL_HANDLE; + vkDestroyDataGraphPipelineSessionARM(device, *pDataGraphPipelineSession, nullptr); + *pDataGraphPipelineSession = VK_NULL_HANDLE; + return res; + } + + // Cleanup in case of errors + vkDestroyDataGraphPipelineSessionARM(device, *pDataGraphPipelineSession, nullptr); + *pDataGraphPipelineSession = VK_NULL_HANDLE; + return res; + } +} +return res; +---- + +The session object is now ready to use, but we'll need some tensors to provide as input and output. + +=== Tensors + +Tensor resources are created and used in a similar fashion to Vulkan images and buffers: + +1. They are created from a description (size, tiling, usage, etc) + +2. Their memory requirements are queried + +3. We allocate memory compatible with those requirements + +4. We bind the tensor resource to the memory we allocated + +5. We create a view of the tensor resource for use with pipelines + +In the sample code, this is handled by the helper classes `Tensor` and `TensorView` which are analogous to the `Image`/`Buffer` and `ImageView`/`BufferView` classes in the common sample framework. Similar to data graph pipeline sessions discussed above, the sample code makes use of the _Vulkan Memory Allocator_ (VMA) framework to abstract away the details of the memory allocation for tensors. This is wrapped up in the function `vmaCreateTensor` which is written to be very similar to the existing `vmaCreateImage/vmaCreateBuffer` functions. As with buffers and images, the tensor is created without any backing memory and then its memory requirements are queried. We can then allocate some appropriate memory and bind it to the session: + +[source,cpp,options="nowrap"] +---- +// 1. Create VkTensor, using create_info from TensorBuilder +// In this case we are going to represent a small RGB image, so have a batch size of 1, a width and height of 10 and 3 channels. +std::vector dimensions = {1, 10, 10, 3}; +TensorBuilder tensorBuilder = TensorBuilder(dimensions) + .with_tiling(VK_TENSOR_TILING_LINEAR_ARM) + .with_usage(VK_TENSOR_USAGE_DATA_GRAPH_BIT_ARM) + .with_format(VK_FORMAT_R32_SFLOAT) + .with_vma_required_flags(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); + +VkTensorARM tensor = VK_NULL_HANDLE; +VkTensorCreateInfoARM create_info = builder.get_create_info(); +VkResult res = vkCreateTensorARM(device, create_info, nullptr, tensor); + +if (res != VK_SUCCESS) +{ + throw std::runtime_error("Vulkan error: vkCreateTensorARM failed."); +} + +// 2. vkGetTensorMemoryRequirements. +VkMemoryRequirements2 vkMemReq = {}; +VkTensorMemoryRequirementsInfoARM memory_requirements_info = + {VK_STRUCTURE_TYPE_TENSOR_MEMORY_REQUIREMENTS_INFO_ARM}; +memory_requirements_info.tensor = tensor; + +vkGetTensorMemoryRequirementsARM(device, &memory_requirements_info, &vkMemReq); + +// 3. Allocate memory using allocator. +VmaAllocater& allocator = vkb::allocated::get_memory_allocator(); +VmaAllocationCreateInfo alloc_create_info = {}; +VmaAllocation allocation = VK_NULL_HANDLE; +VmaAllocationInfo allocation_info; + +res = vmaAllocateMemory(allocator, + &vkMemReq.memoryRequirements, + alloc_create_info, + allocation, + &allocation_info); + +if (res != VK_SUCCESS) +{ + throw std::runtime_error("Vulkan error: vmaAllocateMemory failed."); +} + +// 4. Bind tensor with memory. +VkBindTensorMemoryInfoARM bind_info = {VK_STRUCTURE_TYPE_BIND_TENSOR_MEMORY_INFO_ARM}; +bind_info.tensor = tensor; +bind_info.memory = allocation_info.deviceMemory; +bind_info.memoryOffset = allocation_info.offset; +res = vkBindTensorMemoryARM(device, 1, &bind_info); + +if (res != VK_SUCCESS) +{ + throw std::runtime_error("Vulkan error: vkBindTensorMemoryARM failed."); +} +---- + +The `VkTensorCreateInfoARM` struct is provided to the `Tensor` constructor through a `TensorBuilder` object which provides a convenient way of making the create info with sensible default values, similar to the `ImageBuilder` and `BufferBuilder` classes which the common sample framework provides. + +The `TensorView` constructor takes a `Tensor` and constructs a view for it, which specifies how the data in a tensor is presented to the pipeline that is using it. Most often, we just want direct access to the tensor data so the format of the view matches that of the tensor. + +[source,cpp,options="nowrap"] +---- +if (format == VK_FORMAT_UNDEFINED) +{ + // VK_FORMAT_UNDEFINED means to use the same format as the provided tensor. + format = tensor.get_format(); +} + +VkTensorViewCreateInfoARM view_info{VK_STRUCTURE_TYPE_TENSOR_VIEW_CREATE_INFO_ARM}; +view_info.tensor = tensor.get_handle(); +view_info.format = format; +VK_CHECK(vkCreateTensorViewARM(get_device().get_handle(), &view_info, nullptr, &get_handle())); +---- + +We create a `Tensor` and a corresponding `TensorView` in each the `prepare_input_tensor` and `prepare_output_tensor` methods, for use as the input and output of our neural network. In both cases we describe the tensor as four-dimensional and with an element format of `VK_FORMAT_R32_SFLOAT` (i.e. 32-bit floating point). We also declare that we will use these tensors from a graph pipeline via the `VK_TENSOR_USAGE_DATA_GRAPH_BIT_ARM` usage flag. + +Tensors are often four-dimensional, representing batch size, height, width and channels. In this sample our input tensor will represent a small RGB image, so has a batch size of 1, a width and height of 10 and 3 channels. The output will be half the width and height (reduced by the pooling operation of the neural network), but still 3 channels. + +The input tensor will have some initial, fixed data uploaded to it from the CPU and so needs to be linearly-tiled. This may not be the most efficient memory layout, but it makes the tensor a host-accessible subresource so that we know how the data is laid out. We generate a simple pattern of colors, as can be seen on the _input tensor_ in the screenshot at the top of this page. The data is uploaded by mapping the backing memory of the tensor to get a CPU-accesssible pointer, writing through that pointer, and unmapping the memory. This is handled for us by the VMA framework, and is identical to how you could upload data for an image or buffer. + +The tensor objects are now ready to use, and we can place them in a descriptor set to provide them to the data graph pipeline. + +=== Descriptor sets + +_Descriptor sets_ are used to provide tensor resources to data graph pipelines, just as they are used to provide images and buffers to compute and graphics pipelines. This is done in the `prepare_data_graph_pipeline_descriptor_set` method, which allocates a single descriptor set from a pool (using the descriptor set layout created as part of the `DataGraphPipelineLayout`) and then fills in the descriptor bindings for the input and output tensor views: + +[source,cpp,options="nowrap"] +---- +// Allocate descriptor set using the layout of the Data Graph Pipeline +VkDescriptorSetAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO}; +alloc_info.descriptorPool = descriptor_pool; +alloc_info.descriptorSetCount = 1; +alloc_info.pSetLayouts = &data_graph_pipeline_layout->get_descriptor_set_layout(); + +VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), + &alloc_info, + &data_graph_pipeline_descriptor_set)); + +// Write bindings to it, telling it which tensors to use as input and output +std::map tensor_bindings = +{ + // Binding 0 is the input tensor + {0, VkWriteDescriptorSetTensorInfoARM{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_INFO_ARM, + nullptr, 1, &input_tensor_view->get_handle()}}, + // Binding 1 is the output tensor + {1, VkWriteDescriptorSetTensorInfoARM{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_INFO_ARM, + nullptr, 1, &output_tensor_view->get_handle()}} +}; + +std::vector writes; +for (const auto &tensor_binding : tensor_bindings) +{ + VkWriteDescriptorSet write{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET}; + write.dstSet = data_graph_pipeline_descriptor_set; + write.dstBinding = tensor_binding.first; + write.descriptorType = VK_DESCRIPTOR_TYPE_TENSOR_ARM; + // Tensor info is provided via pNext, rather than a pTensorInfo like for images/buffers + write.pNext = &tensor_binding.second; + write.descriptorCount = 1; + writes.push_back(write); +} + +vkUpdateDescriptorSets(get_device().get_handle(), writes.size(), writes.data(), 0, nullptr); +---- + +The descriptor set is now ready to use, and we have everything we need to run an inference! + +=== Command buffer + +Similar to how compute and graphics pipelines are executed, data graph pipelines need to be bound to a dedicated bind point on a command buffer, descriptor sets need to be bound to provide resources to the pipeline, and then they can be dispatched. This is done in the `draw_renderpass` method which is called to record a new command buffer every frame: + +[source,cpp,options="nowrap"] +---- +// Bind and run data graph pipeline. +vkCmdBindPipeline(command_buffer.get_handle(), + VK_PIPELINE_BIND_POINT_DATA_GRAPH_ARM, + data_graph_pipeline->get_handle()); +vkCmdBindDescriptorSets(command_buffer.get_handle(), + VK_PIPELINE_BIND_POINT_DATA_GRAPH_ARM, data_graph_pipeline_layout->get_handle(), + 0, + 1, + &data_graph_pipeline_descriptor_set, + 0, + nullptr); +vkCmdDispatchDataGraphARM(command_buffer.get_handle(), data_graph_pipeline_session->get_handle()); +---- + +That's all that's necessary to run a simple neural network using a data graph pipeline, but there are more details to cover for using the extensions in more practical use cases. + +== Practical Use + +The tensor object which is written to by the data graph pipeline can be used in numerous ways. In this sample we are reading from it using a compute shader which produces the simple visualization of the tensor contents which is drawn on the window. There are also several other options for how to use the output tensor: + +* Read directly from other shaders by binding it as a Tensor resource, as we do in this sample. +* Aliased as a regular `VkImage` and used as a texture to be sampled from in another shader. +* Aliased as a regular `VkBuffer` and read from in another shader +* Mapped to host-accessible memory and read back for further processing on the CPU + +There is also the question of how to produce inputs for the neural network - in this example we simply uploaded some fixed data from the CPU but there are also many options here (equivalent to the above): + +* Write directly from other shaders by binding it as a Tensor resource. +* Aliased as a regular `VkImage` and written to via. a render target (or writable texture). +* Aliased as a regular `VkBuffer` and written to from another shader. +* Mapped to host-accessible memory and written to with data produced on the CPU, as we do in this sample. + +Accesses to tensor resources must be synchronised correctly, just as for images and buffers. This normally involves adding barriers to the command buffer to ensure that accesses happen in the expected order and that data is visible to the required pipeline stages. There is a new kind of barrier, a Tensor Memory Barrier (analogous to the existing Image Memory Barriers and Buffer Memory Barriers) which can be used for this purpose. The later samples in this series make more use of these. + +== Conclusion + +In this sample we've introduced the VK_ARM_tensors and VK_ARM_data_graph extensions and shown how to use them to run a simple neural network. We've shown the steps needed to run a neural network - creating a pipeline layout, data graph pipeline, data graph pipeline session, tensor objects, descriptor sets and finally recording binding and dispatch commands in a command buffer. The following samples in xref:samples/extensions/tensor_and_data_graph/README.adoc[this series] build upon these concepts. + +== Appendix A: SPIR-V programs for neural networks + +Neural networks can be described using SPIR-V modules, but unlike SPIR-V modules for graphics and compute shaders, there is no GLSL or HLSL syntax for expressing SPIR-V modules for data graph pipelines. There are tools available for generating the SPIR-V code from higher level representations of neural networks such as PyTorch or TensorFlow models (see: link:https://github.com/arm/ai-ml-sdk-model-converter[ML SDK Model Converter]). +However, for this sample we have written the SPIR-V code directly in low-level SPIR-V assembly language to avoid bringing in more dependencies and to give some idea of how the SPIR-V code looks. It is unlikely in practice that you would manually write SPIR-V assembly, however below is a quick overview of SPIR-V for context. + +The assembly code is in the link:../../../../shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm[pooling.spvasm] file and is assembled into SPIR-V binary code using `spirv-as` as part of the link:../../../../bldsys/cmake/sample_helper.cmake[build system]. Note this is exactly the same process that would be used to compile compute or graphics shaders from SPIR-V assembly, although typically these would be compiled from GLSL or HLSL instead. + +=== Boilerplate + +The SPIR-V assembly starts with the usual list of capabilities and extensions. Here, we declare that we will make use of the link:https://github.khronos.org/SPIRV-Registry/extensions/ARM/SPV_ARM_graph.html[Graph] and link:https://github.khronos.org/SPIRV-Registry/extensions/ARM/SPV_ARM_tensors.html[Tensors] SPIR-V extensions: + +[source,cpp,options="nowrap"] +---- + OpCapability Shader + OpCapability TensorsARM + OpCapability GraphARM + OpExtension "SPV_ARM_tensors" + OpExtension "SPV_ARM_graph" +---- + +Next is an important line which imports link:https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#_extended_instruction_sets[external instructions] for all of the neural network operations. This defines operations like convolution, pooling, matmul which come from the https://www.mlplatform.org/tosa/[TOSA specification]. + +[source,cpp,options="nowrap"] +---- + %tosa = OpExtInstImport "TOSA.001000.1" +---- + +=== Descriptor set interface + +The next section declares the descriptor set and bindings that form the interface between the Vulkan API data graph pipeline and the SPIR-V module, and is what we used when defining our pipeline layout in the <> section. + +image::./images/pipeline_interface.svg[Sample,align="center"] + +[source,cpp,options="nowrap"] +---- + OpDecorate %input_tensor_ptr DescriptorSet 0 + OpDecorate %input_tensor_ptr Binding 0 + OpDecorate %output_tensor_ptr DescriptorSet 0 + OpDecorate %output_tensor_ptr Binding 1 +---- + +Note this is the same as you would find for compute or graphics shaders. + +=== Types and constants + +All the types and constants used in the code are declared next, with the notable inclusion of _tensor types_ and a _graph type_: + +[source,cpp,options="nowrap"] +---- +%float_tensor_r4_s_1_ih_iw_3 = OpTypeTensorARM %float %uint_4 %uint_array_l4_1_ih_iw_3 +%float_tensor_r4_s_1_oh_ow_3 = OpTypeTensorARM %float %uint_4 %uint_array_l4_1_oh_ow_3 + ... + %graph_type = OpTypeGraphARM 1 %float_tensor_r4_s_1_ih_iw_3 %float_tensor_r4_s_1_oh_ow_3 +---- + +This defines two types for tensors - both four-dimensional tensors with 32-bit floating point elements but with different shapes, which matches the tensor description we used in our C++ code for our input and output tensors. It then defines a graph type which takes one input and one output of their respective types. + +=== Interface variables + +We then declare variables for the input and output tensors which are the external interface for the program. Again, this is the same as you would find for compute or graphics shaders: + +[source,cpp,options="nowrap"] +---- + %input_tensor_ptr = OpVariable %ptr_float_tensor_r4_s_1_ih_iw_3 UniformConstant +%output_tensor_ptr = OpVariable %ptr_float_tensor_r4_s_1_oh_ow_3 UniformConstant +---- + +=== Graph definition + +Finally, we declare our graph and list the operations that make up our neural network: + +[source,cpp,options="nowrap"] +---- + OpGraphEntryPointARM %graph "main" %input_tensor_ptr %output_tensor_ptr + %graph = OpGraphARM %graph_type + %in = OpGraphInputARM %float_tensor_r4_s_1_ih_iw_3 %uint_0 + %out = OpExtInst %float_tensor_r4_s_1_oh_ow_3 %tosa AVG_POOL2D %avg_pool_kernel %avg_pool_stride %avg_pool_pad %uint_2 %in %avg_pool_input_zero_point %avg_pool_output_zero_point + OpGraphSetOutputARM %out %uint_0 + OpGraphEndARM +---- + +The `OpGraphEntryPointARM` instruction exports the graph (which will be defined in the lines below) to be visible to our C++ code under the entry point name `"main"`, which we used when creating our data graph <>. It connects the interface variables declared above to the inputs and outputs of the data graph. + +The lines between `OpGraphARM` and `OpGraphEndARM` define the body of our graph and is where the neural network operations are listed. Here we are using a single instruction imported from the TOSA SPIR-V xref:Boilerplate[extended instruction set]: AVG_POOL2D. That instruction requires a number of arguments describing the properties of the pooling operation (the pooling kernel size, striding, etc.). + diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/flow.dot b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/flow.dot new file mode 100644 index 0000000000..7e2006d868 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/flow.dot @@ -0,0 +1,26 @@ +// Copyright (c) 2025, Arm Limited and Contributors +digraph D { + + { + rank=same; + input_tensor[shape=ellipse] + output_tensor[shape=ellipse] + data_graph_pipeline[shape=box] + } + { + rank=same; + output_image[shape=ellipse] + swapchain[shape=ellipse] + + visualization_pipeline[shape=box] + blit[shape=box] + } + + input_tensor -> data_graph_pipeline + data_graph_pipeline -> output_tensor + + input_tensor -> visualization_pipeline + output_tensor -> visualization_pipeline + visualization_pipeline -> output_image -> blit -> swapchain + +} \ No newline at end of file diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/flow.svg b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/flow.svg new file mode 100644 index 0000000000..0a4ceb8f54 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/flow.svg @@ -0,0 +1,86 @@ + + + + + + + +D + + +input_tensor + +input_tensor + + +data_graph_pipeline + +data_graph_pipeline + + +input_tensor->data_graph_pipeline + + + + +visualization_pipeline + +visualization_pipeline + + +input_tensor->visualization_pipeline + + + + +output_tensor + +output_tensor + + +output_tensor->visualization_pipeline + + + + +data_graph_pipeline->output_tensor + + + + +output_image + +output_image + + +blit + +blit + + +output_image->blit + + + + +swapchain + +swapchain + + +visualization_pipeline->output_image + + + + +blit->swapchain + + + + + diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/network.svg b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/network.svg new file mode 100644 index 0000000000..8de2949abd --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/network.svg @@ -0,0 +1,40 @@ + + + + +Overview + + + +Input Tensor + +Input Tensor + + + +Neural Network + +Neural Network + + + +Input Tensor->Neural Network + + + + + +Output Tensor + +Output Tensor + + + +Neural Network->Output Tensor + + + + + diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/pipeline_interface.svg b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/pipeline_interface.svg new file mode 100644 index 0000000000..3869933575 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/pipeline_interface.svg @@ -0,0 +1,19 @@ + + + + +dset + +Descriptor set 0 + + +node0 + +Binding 0 (Input Tensor) + +Binding 1 (Output Tensor) + + + diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/sample.png b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/sample.png new file mode 100644 index 0000000000..22af5a5665 Binary files /dev/null and b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/images/sample.png differ diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/simple_tensor_and_data_graph.cpp b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/simple_tensor_and_data_graph.cpp new file mode 100644 index 0000000000..2c248d09dd --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/simple_tensor_and_data_graph.cpp @@ -0,0 +1,403 @@ +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "simple_tensor_and_data_graph.h" + +#include + +SimpleTensorAndDataGraph::SimpleTensorAndDataGraph() +{ + set_api_version(VK_API_VERSION_1_3); // Required by the emulation layers + + // Declare that we need the data graph and tensor extensions + add_device_extension("VK_ARM_tensors"); + add_device_extension("VK_ARM_data_graph"); + // These extensions are dependencies of the above, so we need to add them too. + add_device_extension("VK_KHR_maintenance5"); + add_device_extension("VK_KHR_deferred_host_operations"); +} + +SimpleTensorAndDataGraph::~SimpleTensorAndDataGraph() +{ + if (data_graph_pipeline_descriptor_set != VK_NULL_HANDLE) + { + vkFreeDescriptorSets(get_device().get_handle(), descriptor_pool, 1, &data_graph_pipeline_descriptor_set); + } + if (descriptor_pool != VK_NULL_HANDLE) + { + vkDestroyDescriptorPool(get_device().get_handle(), descriptor_pool, nullptr); + } + + // Make sure resources created in the render pipeline are destroyed before the Device gets destroyed. + set_render_pipeline(nullptr); +} + +/** + * @brief Overridden to declare that we require some physical device features to be enabled. + */ +void SimpleTensorAndDataGraph::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) +{ + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, shaderInt8); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan13Features, synchronization2); + + // TODO: Re-enable this feature once the emulation layer advertises it + // REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceTensorFeaturesARM, tensors); + + // Enable the features for tensors and data graphs which we intend to use. + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceTensorFeaturesARM, shaderTensorAccess); + + // TODO: Re-enable this feature once the emulation layer advertises it + // REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDataGraphFeaturesARM, dataGraph); + + // Update-after-bind is required for the emulation layer + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, descriptorBindingUniformBufferUpdateAfterBind); + + // Enable Int64, if available. + if (gpu.get_features().shaderInt64) + { + gpu.get_mutable_requested_features().shaderInt64 = VK_TRUE; + } + else + { + throw std::runtime_error("Required feature VkPhysicalDeviceFeatures::shaderInt64 is not supported."); + } +} + +/** + * @brief Overridden to create and set up Vulkan resources. + */ +bool SimpleTensorAndDataGraph::prepare(const vkb::ApplicationOptions &options) +{ + if (!VulkanSample::prepare(options)) + { + return false; + } + + // We use the GUI framework for labels on the visualization + create_gui(*window, &get_stats()); + + // Create Vulkan resources + prepare_descriptor_pool(); + prepare_input_tensor(); + prepare_output_tensor(); + prepare_output_image(get_render_context().get_surface_extent().width, get_render_context().get_surface_extent().height); + prepare_data_graph_pipeline(); + prepare_data_graph_pipeline_descriptor_set(); + prepare_visualization_pipeline(); + prepare_visualization_pipeline_descriptor_set(); + + // Create a RenderPipeline to blit `output_image` to the swapchain + std::unique_ptr render_pipeline = std::make_unique(); + render_pipeline->add_subpass(std::make_unique(get_render_context())); + set_render_pipeline(std::move(render_pipeline)); + + return true; +} + +/* + * Creates a descriptor pool which can be used to allocate descriptors for tensor and image bindings. + * Note we can't use vkb::DescriptorPool because it doesn't know about tensors. + */ +void SimpleTensorAndDataGraph::prepare_descriptor_pool() +{ + std::vector descriptor_pool_sizes = { + {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 10}, // Fairly arbitrary counts + {VK_DESCRIPTOR_TYPE_TENSOR_ARM, 10}, + }; + + VkDescriptorPoolCreateInfo create_info{VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO}; + create_info.poolSizeCount = descriptor_pool_sizes.size(); + create_info.pPoolSizes = descriptor_pool_sizes.data(); + create_info.maxSets = 10; // Fairly arbitrary + create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + + VK_CHECK(vkCreateDescriptorPool(get_device().get_handle(), &create_info, nullptr, &descriptor_pool)); +} + +/* + * Creates the Tensor used as input to the neural network and fills it with some initial data. + * Also creates a Tensor View (analogous to an Image View). + */ +void SimpleTensorAndDataGraph::prepare_input_tensor() +{ + // Tensors are often four-dimensional, representing batch size, height, width and channels. + // In this case we are going to represent a small RGB image, so have a batch size of 1, a width and height of 10 and 3 channels. + std::vector dimensions = {1, 10, 10, 3}; + // Create tensor and back it with memory. Set linear tiling flags and host-visible VMA flags so the backing memory can updated from the CPU. + input_tensor = std::make_unique(get_device(), + TensorBuilder(dimensions) + .with_tiling(VK_TENSOR_TILING_LINEAR_ARM) + .with_usage(VK_TENSOR_USAGE_DATA_GRAPH_BIT_ARM) + .with_format(VK_FORMAT_R32_SFLOAT) + .with_vma_required_flags(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); + // Upload fixed initial data - smoothly varying colors over the square + std::vector input_tensor_data; + for (int y = 0; y < dimensions[1]; ++y) + { + float v = y / float(dimensions[1]); + for (int x = 0; x < dimensions[2]; ++x) + { + float u = x / float(dimensions[2]); + input_tensor_data.push_back(glm::fvec3{u, 1 - u, v}); + } + } + input_tensor->update(input_tensor_data); + + input_tensor_view = std::make_unique(*input_tensor); +} + +/* + * Creates the Tensor used as output from the neural network. + * Also creates a Tensor View (analogous to an Image View). + */ +void SimpleTensorAndDataGraph::prepare_output_tensor() +{ + // The output of the network is half the width and height of the input, but still RGB. + std::vector dimensions = {1, 5, 5, 3}; + // Create tensor and back it with memory + output_tensor = std::make_unique(get_device(), + TensorBuilder(dimensions) + .with_usage(VK_TENSOR_USAGE_SHADER_BIT_ARM | VK_TENSOR_USAGE_DATA_GRAPH_BIT_ARM) + .with_format(VK_FORMAT_R32_SFLOAT)); + output_tensor_view = std::make_unique(*output_tensor); +} + +/* + * Creates the Image used to visualize the two tensors, which is then blitted to the Swapchain. + * Also creates a Image View. + */ +void SimpleTensorAndDataGraph::prepare_output_image(uint32_t width, uint32_t height) +{ + output_image = std::make_unique(get_device(), + vkb::core::ImageBuilder(VkExtent3D{width, height, 1}) + .with_format(VK_FORMAT_R8G8B8A8_UNORM) + .with_usage(VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT)); + output_image_view = std::make_unique(*output_image, VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM); +} + +/* + * Creates the Pipeline Layout, a Data Graph Pipeline and a Data Graph Pipeline Session used to run the neural network. + */ +void SimpleTensorAndDataGraph::prepare_data_graph_pipeline() +{ + // Create the Pipeline Layout. This is equivalent to the pipeline layout for compute or data graph pipelines, describing what bind points are available. + // The neural network has its input tensor on binding 0 and its output tensor at binding 1. + // + // In order to create the layout, we just need to know which binding slots are tensors - no further details needed yet. + std::set tensor_bindings = {0, 1}; + data_graph_pipeline_layout = std::make_unique(get_device(), tensor_bindings); + + // Create a Pipeline from the layout. This is equivalent to a graphics or compute pipeline and contains a shader module which describes the + // neural network to execute (see `pooling.spvasm` for the SPIR-V code). It also requires the description (shape etc.) of the tensors that will + // be bound to the pipeline. + std::map> tensor_descriptions; + // All bindings are in set 0 + tensor_descriptions[0] = + { + // Binding 0 is the input tensor + {0, &input_tensor->get_description()}, + // Binding 1 is the output tensor + {1, &output_tensor->get_description()}}; + + VkShaderModule shader_module = vkb::load_shader("tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm.spv", get_device().get_handle(), VK_SHADER_STAGE_ALL); + + data_graph_pipeline = std::make_unique(get_device(), + data_graph_pipeline_layout->get_handle(), + shader_module, + "main", + tensor_descriptions); + + // Create a Pipeline Session for the Pipeline. Unlike compute and graphics pipelines, data graph pipelines require + // additional state to be stored (e.g. for intermediate results). This is stored separately to the pipeline itself in + // 'pipeline session' resource. This requires memory to be allocated and bound to it (similar to a buffer), which is all handled + // inside our helper class DataGraphPipelineSession + VmaAllocationCreateInfo alloc_create_info = {}; + data_graph_pipeline_session = std::make_unique(get_device(), data_graph_pipeline->get_handle(), alloc_create_info); +} + +/* + * Allocates and fills in a Descriptor Set to provide bindings to the Data Graph Pipeline. + */ +void SimpleTensorAndDataGraph::prepare_data_graph_pipeline_descriptor_set() +{ + // Allocate descriptor set using the layout of the Data Graph Pipeline + VkDescriptorSetAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO}; + alloc_info.descriptorPool = descriptor_pool; + alloc_info.descriptorSetCount = 1; + alloc_info.pSetLayouts = &data_graph_pipeline_layout->get_descriptor_set_layout(); + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &data_graph_pipeline_descriptor_set)); + + // Write bindings to it, telling it which tensors to use as input and output + std::map tensor_bindings = + { + // Binding 0 is the input tensor + {0, VkWriteDescriptorSetTensorARM{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_ARM, nullptr, 1, &input_tensor_view->get_handle()}}, + // Binding 1 is the output tensor + {1, VkWriteDescriptorSetTensorARM{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_ARM, nullptr, 1, &output_tensor_view->get_handle()}}}; + write_descriptor_set(get_device().get_handle(), data_graph_pipeline_descriptor_set, {}, tensor_bindings); +} + +/* + * Creates the Pipeline Layout and a Compute Pipeline used to run the compute shader which copies input and + * output tensors to an image, so we can see their contents on the screen. + */ +void SimpleTensorAndDataGraph::prepare_visualization_pipeline() +{ + // Load the compute shader + vkb::ShaderModule &visualization_comp = + get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, vkb::ShaderSource{"tensor_and_data_graph/glsl/visualization_two_tensors.comp.spv"}); + + // Create pipeline layout from the reflected shader code. Note that this will include bindings to Tensor resources, so we use our own + // class to do this, rather than the sample framework's vkb::PipelineLayout. + visualization_pipeline_layout = std::make_unique(get_device(), visualization_comp); + + // Create pipeline from this layout and the shader module. Similar to the layout, we use our own class rather than vkb::ComputePipeline. + visualization_pipeline = std::make_unique(get_device(), visualization_pipeline_layout->get_handle(), visualization_comp); +} + +/* + * Allocates and fills in a Descriptor Set to provide bindings to the visualization Compute Pipeline. + */ +void SimpleTensorAndDataGraph::prepare_visualization_pipeline_descriptor_set() +{ + // Allocate descriptor set (if not already allocated; when this function is called due to window resize we just update the existing set rather than allocating a new one) + if (visualization_pipeline_descriptor_set == VK_NULL_HANDLE) + { + VkDescriptorSetAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO}; + alloc_info.descriptorPool = descriptor_pool; + alloc_info.descriptorSetCount = 1; + alloc_info.pSetLayouts = &visualization_pipeline_layout->get_descriptor_set_layouts().begin()->second; + VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &visualization_pipeline_descriptor_set)); + } + + // Write bindings to it + std::map tensor_bindings = + { + // Binding 0 is the input tensor + {0, VkWriteDescriptorSetTensorARM{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_ARM, nullptr, 1, &input_tensor_view->get_handle()}}, + // Binding 1 is the output tensor + {1, VkWriteDescriptorSetTensorARM{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_ARM, nullptr, 1, &output_tensor_view->get_handle()}}}; + + std::map image_bindings = + { + // Binding 2 is the output image + {2, VkDescriptorImageInfo{VK_NULL_HANDLE, output_image_view->get_handle(), VK_IMAGE_LAYOUT_GENERAL}}}; + + write_descriptor_set(get_device().get_handle(), visualization_pipeline_descriptor_set, image_bindings, tensor_bindings); +} + +/** + * @brief Overridden to recreate the output_image when the window is resized. + */ +bool SimpleTensorAndDataGraph::resize(uint32_t width, uint32_t height) +{ + // Can't destroy the old image until any outstanding commands are completed + get_device().wait_idle(); + + // Destroy old image and create new one with the new width/height + prepare_output_image(width, height); + + // Update the descriptor set for the visualization pipeline, so that it writes to the new image + prepare_visualization_pipeline_descriptor_set(); + + return true; +} + +/** + * @brief Overridden to do the main rendering on each frame - dispatch our neural network inference and visualize the results. + */ +void SimpleTensorAndDataGraph::draw_renderpass(vkb::core::CommandBufferC &command_buffer, RenderTargetType &render_target) +{ + // Bind and run data graph pipeline. + vkCmdBindPipeline(command_buffer.get_handle(), VK_PIPELINE_BIND_POINT_DATA_GRAPH_ARM, data_graph_pipeline->get_handle()); + vkCmdBindDescriptorSets(command_buffer.get_handle(), VK_PIPELINE_BIND_POINT_DATA_GRAPH_ARM, data_graph_pipeline_layout->get_handle(), + 0, 1, &data_graph_pipeline_descriptor_set, 0, nullptr); + vkCmdDispatchDataGraphARM(command_buffer.get_handle(), data_graph_pipeline_session->get_handle(), VK_NULL_HANDLE); + + // Barrier for `output_tensor` (written to by the graph pipeline above, and read from by the visualization compute shader below) + VkTensorMemoryBarrierARM tensor_barrier = {VK_STRUCTURE_TYPE_TENSOR_MEMORY_BARRIER_ARM}; + tensor_barrier.tensor = output_tensor->get_handle(); + tensor_barrier.srcStageMask = VK_PIPELINE_STAGE_2_DATA_GRAPH_BIT_ARM; + tensor_barrier.srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT; + tensor_barrier.dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT; + tensor_barrier.dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT; + VkDependencyInfo dependency_info = {VK_STRUCTURE_TYPE_DEPENDENCY_INFO}; + dependency_info.pNext = &tensor_barrier; + vkCmdPipelineBarrier2(command_buffer.get_handle(), &dependency_info); + + // Transition `output_image` to layout for being written to by the visualization compute shader. + // We don't care about the old contents so can use VK_IMAGE_LAYOUT_UNDEFINED as the old layout. + vkb::ImageMemoryBarrier output_image_barrier; + output_image_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; + output_image_barrier.new_layout = VK_IMAGE_LAYOUT_GENERAL; + output_image_barrier.src_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + output_image_barrier.src_access_mask = VK_ACCESS_SHADER_READ_BIT; + output_image_barrier.dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + output_image_barrier.dst_access_mask = VK_ACCESS_SHADER_WRITE_BIT; + command_buffer.image_memory_barrier(*output_image_view, output_image_barrier); + + // Bind and run visualization compute pipeline + vkCmdBindPipeline(command_buffer.get_handle(), VK_PIPELINE_BIND_POINT_COMPUTE, visualization_pipeline->get_handle()); + vkCmdBindDescriptorSets(command_buffer.get_handle(), VK_PIPELINE_BIND_POINT_COMPUTE, visualization_pipeline_layout->get_handle(), + 0, 1, &visualization_pipeline_descriptor_set, 0, nullptr); + + // Pass the output_image size as a push constant + vkCmdPushConstants(command_buffer.get_handle(), visualization_pipeline_layout->get_handle(), VK_SHADER_STAGE_COMPUTE_BIT, 0, + sizeof(glm::uvec2), &render_target.get_extent()); + uint32_t group_count_x = (render_target.get_extent().width + 7) / 8; // The visualization shader has a group size of 8 + uint32_t group_count_y = (render_target.get_extent().height + 7) / 8; + vkCmdDispatch(command_buffer.get_handle(), group_count_x, group_count_y, 1); + + // Barrier for `output_image` (written by the visualization compute shader above, read by the BlitSubpass below) + vkb::ImageMemoryBarrier output_image_barrier2; + output_image_barrier2.old_layout = VK_IMAGE_LAYOUT_GENERAL; + output_image_barrier2.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + output_image_barrier2.src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + output_image_barrier2.src_access_mask = VK_ACCESS_SHADER_WRITE_BIT; + output_image_barrier2.dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + output_image_barrier2.dst_access_mask = VK_ACCESS_SHADER_READ_BIT; + command_buffer.image_memory_barrier(*output_image_view, output_image_barrier2); + + // Call the inherited draw_renderpass function to run our blitting pass to display output_image on the screen, and also draw the GUI. + // The output_image may have been recreated due to window resize since the last frame, so make sure the BlitSubpass has the latest one. + static_cast(*get_render_pipeline().get_subpasses()[0]).set_source(output_image_view.get()); + VulkanSample::draw_renderpass(command_buffer, render_target); +} + +/** + * @brief Overridden to show labels for visualized input and output tensors. + */ +void SimpleTensorAndDataGraph::draw_gui() +{ + float cx = get_render_context().get_surface_extent().width * 0.5f; + float cy = get_render_context().get_surface_extent().height * 0.5f; + + ImDrawList *draw_list = ImGui::GetForegroundDrawList(); + draw_list->AddText(ImVec2(cx - 300, cy + 100), IM_COL32_WHITE, "Input tensor"); + draw_list->AddText(ImVec2(cx + 100, cy + 100), IM_COL32_WHITE, "Output tensor"); + + draw_list->AddLine(ImVec2(cx - 25, cy), ImVec2(cx - 5, cy), IM_COL32_WHITE, 5.0f); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(cx + 25.0f, cy), + ImVec2(30.0f, 10.0f), ImGuiDir_Right, IM_COL32_WHITE); + ImVec2 text_size = ImGui::CalcTextSize("Pooling"); + draw_list->AddText(ImVec2(cx - text_size.x / 2, cy + 20), IM_COL32_WHITE, "Pooling"); +} + +std::unique_ptr create_simple_tensor_and_data_graph() +{ + return std::make_unique(); +} diff --git a/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/simple_tensor_and_data_graph.h b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/simple_tensor_and_data_graph.h new file mode 100644 index 0000000000..c77c8db2f4 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/simple_tensor_and_data_graph/simple_tensor_and_data_graph.h @@ -0,0 +1,99 @@ +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "vulkan_sample.h" + +#include "../tensor_and_data_graph_common.h" + +#include +#include + +/** + * @brief Demonstrates how to use the VK_ARM_tensors and VK_ARM_data_graph extensions in a simple example + * which runs a trivial neural network on a small, hardcoded tensor. + * @details A `Tensor` resource (`input_tensor`) is created and initial contents are uploaded. This is a new resource type analogous + * to Images and Buffers. This is read as an input by a `Data Graph Pipeline` (`data_graph_pipeline`), which is a new type of pipeline analogous + * to Graphics Pipelines and Compute Pipelines. The Data Graph Pipeline runs a neural network and produces an output which is written + * into the `output_tensor` Tensor. + * In order to visualize the results of this pipeline, there is a Compute Pipeline (`visualization_pipeline`) which copies the + * contents of `input_tensor` and `output_tensor` into an Image (`output_image`) which is blitted to the Swapchain. + * + * As a diagram, this looks like: + * + * input_tensor -> data_graph_pipeline -> output_tensor + * \ \. + * \-----------------------------------\--------> visualization_pipeline -> output_image -> blit -> swapchain + * + * Because the common Vulkan Samples framework code is not aware of the Tensor resource type or Data Graph Pipelines, + * generic functionality for these concepts has been added to a new tensor_and_data_graph_common.h/cpp file, which this sample + * (and other tensor and data graph samples) makes use of. + */ +class SimpleTensorAndDataGraph : public vkb::VulkanSampleC +{ + public: + SimpleTensorAndDataGraph(); + ~SimpleTensorAndDataGraph() override; + + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + + bool prepare(const vkb::ApplicationOptions &options) override; + + bool resize(uint32_t width, uint32_t height) override; + + void draw_renderpass(vkb::core::CommandBufferC &command_buffer, RenderTargetType &render_target) override; + + void draw_gui() override; + + private: + void prepare_descriptor_pool(); + + void prepare_input_tensor(); + void prepare_output_tensor(); + void prepare_output_image(uint32_t width, uint32_t height); + + void prepare_data_graph_pipeline(); + void prepare_data_graph_pipeline_descriptor_set(); + + void prepare_visualization_pipeline(); + void prepare_visualization_pipeline_descriptor_set(); + + std::unique_ptr input_tensor; + std::unique_ptr input_tensor_view; + + std::unique_ptr output_tensor; + std::unique_ptr output_tensor_view; + + std::unique_ptr output_image; + std::unique_ptr output_image_view; + + // Common descriptor pool which can allocate descriptors for tensors and images. + // We're only allocating a small number of descriptors of a few types, so this simple approach works quite well. + VkDescriptorPool descriptor_pool = VK_NULL_HANDLE; + + std::unique_ptr data_graph_pipeline_layout; + std::unique_ptr data_graph_pipeline; + std::unique_ptr data_graph_pipeline_session; + VkDescriptorSet data_graph_pipeline_descriptor_set = VK_NULL_HANDLE; + + std::unique_ptr visualization_pipeline_layout; + std::unique_ptr visualization_pipeline; + VkDescriptorSet visualization_pipeline_descriptor_set = VK_NULL_HANDLE; +}; + +std::unique_ptr create_simple_tensor_and_data_graph(); diff --git a/samples/extensions/tensor_and_data_graph/tensor_and_data_graph_common.cpp b/samples/extensions/tensor_and_data_graph/tensor_and_data_graph_common.cpp new file mode 100644 index 0000000000..b63877c938 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/tensor_and_data_graph_common.cpp @@ -0,0 +1,748 @@ +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tensor_and_data_graph_common.h" + +#include +#include +#include + +void write_descriptor_set(VkDevice device, + VkDescriptorSet set, + const std::map &image_bindings, + const std::map &tensor_bindings) +{ + std::vector writes; + + for (const auto &image_binding : image_bindings) + { + VkWriteDescriptorSet write{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET}; + write.dstSet = set; + write.dstBinding = image_binding.first; + write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; + write.pImageInfo = &image_binding.second; + write.descriptorCount = 1; + writes.push_back(write); + } + for (const auto &tensor_binding : tensor_bindings) + { + VkWriteDescriptorSet write{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET}; + write.dstSet = set; + write.dstBinding = tensor_binding.first; + write.descriptorType = VK_DESCRIPTOR_TYPE_TENSOR_ARM; + write.pNext = &tensor_binding.second; // Tensor info is provided via pNext, rather than a pTensorInfo like for images/buffers + write.descriptorCount = 1; + writes.push_back(write); + } + + vkUpdateDescriptorSets(device, writes.size(), writes.data(), 0, nullptr); +} + +VkResult vmaCreateTensor(VkDevice device, + VmaAllocator allocator, + const VkTensorCreateInfoARM *pTensorCreateInfo, + const VmaAllocationCreateInfo *pAllocationCreateInfo, + VkTensorARM *pTensor, + VmaAllocation *pAllocation, + VmaAllocationInfo *pAllocationInfo) +{ + // Note that this implementation has some slight differences to the equivalent vmaCreateImage/Buffer functions because we are outside + // the VMA implementation so can't use any of its internal functions and have to use the public APIs instead. + + if (pTensorCreateInfo == nullptr || + pTensorCreateInfo->pDescription == nullptr || + pTensor == nullptr || + pAllocation == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + *pTensor = VK_NULL_HANDLE; + *pAllocation = VK_NULL_HANDLE; + + // 1. Create VkTensor. + VkResult res = vkCreateTensorARM( + device, + pTensorCreateInfo, + nullptr, + pTensor); + if (res >= 0) + { + // 2. vkGetTensorMemoryRequirements. + VkMemoryRequirements2 vkMemReq = {}; + vkMemReq.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2; + VkTensorMemoryRequirementsInfoARM memory_requirements_info = {VK_STRUCTURE_TYPE_TENSOR_MEMORY_REQUIREMENTS_INFO_ARM}; + memory_requirements_info.tensor = *pTensor; + vkGetTensorMemoryRequirementsARM(device, &memory_requirements_info, &vkMemReq); + + // 3. Allocate memory using allocator. + VmaAllocationInfo allocation_info; + res = vmaAllocateMemory(allocator, + &vkMemReq.memoryRequirements, + pAllocationCreateInfo, + pAllocation, + &allocation_info); + + if (res >= 0) + { + if (pAllocationInfo != nullptr) + { + // Return allocation info to caller, if requested + *pAllocationInfo = allocation_info; + } + + // 4. Bind tensor with memory. + if ((pAllocationCreateInfo->flags & VMA_ALLOCATION_CREATE_DONT_BIND_BIT) == 0) + { + VkBindTensorMemoryInfoARM bind_tensor_memory_info = {VK_STRUCTURE_TYPE_BIND_TENSOR_MEMORY_INFO_ARM}; + bind_tensor_memory_info.tensor = *pTensor; + bind_tensor_memory_info.memory = allocation_info.deviceMemory; + bind_tensor_memory_info.memoryOffset = allocation_info.offset; + res = vkBindTensorMemoryARM(device, 1, &bind_tensor_memory_info); + } + if (res >= 0) + { + // All steps succeeded. + return VK_SUCCESS; + } + vmaFreeMemory(allocator, *pAllocation); + *pAllocation = VK_NULL_HANDLE; + } + vkDestroyTensorARM(device, *pTensor, nullptr); + *pTensor = VK_NULL_HANDLE; + return res; + } + return res; +} + +void vmaDestroyTensor(VkDevice device, + VmaAllocator allocator, + VkTensorARM tensor, + VmaAllocation allocation) +{ + if (tensor != VK_NULL_HANDLE) + { + vkDestroyTensorARM(device, tensor, nullptr); + } + + if (allocation != VK_NULL_HANDLE) + { + vmaFreeMemory(allocator, allocation); + } +} + +VkResult vmaCreateDataGraphPipelineSession(VkDevice device, + VmaAllocator allocator, + const VkDataGraphPipelineSessionCreateInfoARM *pDataGraphPipelineSessionCreateInfo, + const VmaAllocationCreateInfo *pAllocationCreateInfo, + VkDataGraphPipelineSessionARM *pDataGraphPipelineSession, + VmaAllocation *pAllocation, + VmaAllocationInfo *pAllocationInfo) +{ + // Note that this implementation has some slight differences to the equivalent vmaCreateImage/Buffer functions because we are outside + // the VMA implementation so can't use any of its internal functions and have to use the public APIs instead. + + if (pDataGraphPipelineSessionCreateInfo == nullptr || + pDataGraphPipelineSession == nullptr || + pAllocation == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + *pDataGraphPipelineSession = VK_NULL_HANDLE; + *pAllocation = VK_NULL_HANDLE; + + // 1. Create DataGraphPipelineSession. + VkResult res = vkCreateDataGraphPipelineSessionARM( + device, + pDataGraphPipelineSessionCreateInfo, + nullptr, + pDataGraphPipelineSession); + if (res >= 0) + { + // 2. Query valid bind points for the session + VkDataGraphPipelineSessionBindPointRequirementsInfoARM bind_point_req_info = {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENTS_INFO_ARM}; + bind_point_req_info.session = *pDataGraphPipelineSession; + uint32_t requirement_count = 0; + + res = vkGetDataGraphPipelineSessionBindPointRequirementsARM(device, &bind_point_req_info, &requirement_count, nullptr); + if (res != VK_SUCCESS) + { + return res; + } + + if (requirement_count > 1) + { + // A session could require more than one bind point, but for simplicity we only support one bind point type in this function. + return VK_ERROR_INITIALIZATION_FAILED; + } + + VkDataGraphPipelineSessionBindPointRequirementARM bind_point_requirement{VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENT_ARM}; + res = vkGetDataGraphPipelineSessionBindPointRequirementsARM(device, &bind_point_req_info, &requirement_count, &bind_point_requirement); + if (res != VK_SUCCESS) + { + return res; + } + + if (bind_point_requirement.numObjects > 1) + { + // A single bind point requirement could require more than one object, but for simplicity we only support one object type in this function. + return VK_ERROR_INITIALIZATION_FAILED; + } + if (bind_point_requirement.bindPointType != VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TYPE_MEMORY_ARM) + { + // Currently we only support the memory bind point type + return VK_ERROR_INITIALIZATION_FAILED; + } + + // 3. vkGetDataGraphPipelineSessionMemoryRequirements. + VkDataGraphPipelineSessionBindPointARM memory_bind_point = VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TRANSIENT_ARM; + VkMemoryRequirements2 vkMemReq = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}; + VkDataGraphPipelineSessionMemoryRequirementsInfoARM memory_requirements_info = {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_MEMORY_REQUIREMENTS_INFO_ARM}; + memory_requirements_info.session = *pDataGraphPipelineSession; + memory_requirements_info.bindPoint = memory_bind_point; + memory_requirements_info.objectIndex = 0; + vkGetDataGraphPipelineSessionMemoryRequirementsARM(device, &memory_requirements_info, &vkMemReq); + + if (vkMemReq.memoryRequirements.size > 0) + { + // 4. Allocate memory using allocator. + VmaAllocationInfo allocation_info; + res = vmaAllocateMemory(allocator, + &vkMemReq.memoryRequirements, + pAllocationCreateInfo, + pAllocation, + &allocation_info); + + if (res >= 0) + { + if (pAllocationInfo != nullptr) + { + // Return allocation info to caller, if requested + *pAllocationInfo = allocation_info; + } + + // 5. Bind session with memory. + if ((pAllocationCreateInfo->flags & VMA_ALLOCATION_CREATE_DONT_BIND_BIT) == 0) + { + VkBindDataGraphPipelineSessionMemoryInfoARM bind_info = {VK_STRUCTURE_TYPE_BIND_DATA_GRAPH_PIPELINE_SESSION_MEMORY_INFO_ARM}; + bind_info.session = *pDataGraphPipelineSession; + bind_info.memory = allocation_info.deviceMemory; + bind_info.memoryOffset = allocation_info.offset; + bind_info.bindPoint = memory_bind_point; + bind_info.objectIndex = 0; + res = vkBindDataGraphPipelineSessionMemoryARM(device, 1, &bind_info); + } + + if (res >= 0) + { + // All steps succeeded. + return VK_SUCCESS; + } + + // Cleanup in case of errors + vmaFreeMemory(allocator, *pAllocation); + *pAllocation = VK_NULL_HANDLE; + } + + // Cleanup in case of errors + vkDestroyDataGraphPipelineSessionARM(device, *pDataGraphPipelineSession, nullptr); + *pDataGraphPipelineSession = VK_NULL_HANDLE; + } + } + + return res; +} + +void vmaDestroyDataGraphPipelineSession(VkDevice device, + VmaAllocator allocator, + VkDataGraphPipelineSessionARM tensor, + VmaAllocation allocation) +{ + if (tensor != VK_NULL_HANDLE) + { + vkDestroyDataGraphPipelineSessionARM(device, tensor, nullptr); + } + + if (allocation != VK_NULL_HANDLE) + { + vmaFreeMemory(allocator, allocation); + } +} + +TensorBuilder::TensorBuilder(std::vector in_dimensions) : + vkb::allocated::BuilderBaseC(VkTensorCreateInfoARM{VK_STRUCTURE_TYPE_TENSOR_CREATE_INFO_ARM}), + dimensions(std::move(in_dimensions)), + description{VK_STRUCTURE_TYPE_TENSOR_DESCRIPTION_ARM} +{ + description.dimensionCount = dimensions.size(); + description.pDimensions = dimensions.data(); // Note we point to the dimensions array stored in this object, not the one passed in (which is already empty!) + get_create_info().pDescription = &description; + + alloc_create_info.usage = VMA_MEMORY_USAGE_UNKNOWN; // The default value set by the base class of 'VMA_MEMORY_USAGE_AUTO' won't work for tensors + + description.tiling = VK_TENSOR_TILING_LINEAR_ARM; + description.usage = VK_TENSOR_USAGE_SHADER_BIT_ARM; + description.format = VK_FORMAT_R32_SFLOAT; +} + +TensorBuilder &TensorBuilder::with_format(VkFormat format) +{ + description.format = format; + return *this; +} +TensorBuilder &TensorBuilder::with_tiling(VkTensorTilingARM tiling) +{ + description.tiling = tiling; + return *this; +} +TensorBuilder &TensorBuilder::with_usage(VkTensorUsageFlagsARM usage) +{ + description.usage = usage; + return *this; +} + +TensorDescriptor::TensorDescriptor(const TensorBuilder &builder) +{ + // Note that we need to do a deep copy of this struct as it contains a couple of pointers. + create_info = builder.get_create_info(); + description = *create_info.pDescription; + create_info.pDescription = &description; + dimensions.assign(description.pDimensions, description.pDimensions + description.dimensionCount); + description.pDimensions = dimensions.data(); +} + +const VkTensorCreateInfoARM &TensorDescriptor::get_create_info() const +{ + return create_info; +} + +const VkTensorDescriptionARM &TensorDescriptor::get_description() const +{ + return description; +} + +Tensor::Tensor(vkb::core::DeviceC &device, TensorBuilder const &builder) : + vkb::allocated::AllocatedC(builder.get_allocation_create_info(), nullptr, &device), + descriptor(builder) +{ + VkTensorARM tensor = VK_NULL_HANDLE; + VmaAllocationInfo allocation_info{}; + VmaAllocation allocation = VK_NULL_HANDLE; + VK_CHECK(vmaCreateTensor( + device.get_handle(), + vkb::allocated::get_memory_allocator(), + &descriptor.get_create_info(), + &builder.get_allocation_create_info(), + &tensor, + &allocation, + &allocation_info)); + + set_allocation(allocation); + post_create(allocation_info); + set_handle(tensor); + if (!builder.get_debug_name().empty()) + { + set_debug_name(builder.get_debug_name()); + } +} + +Tensor::~Tensor() +{ + if (get_handle() != VK_NULL_HANDLE && get_allocation() != VK_NULL_HANDLE) + { + unmap(); + vmaDestroyTensor(get_device().get_handle(), vkb::allocated::get_memory_allocator(), get_handle(), get_allocation()); + clear(); + } +} + +const VkTensorDescriptionARM &Tensor::get_description() const +{ + return descriptor.get_description(); +} + +VkFormat Tensor::get_format() const +{ + return descriptor.get_create_info().pDescription->format; +}; + +ExternallyAllocatedTensor::ExternallyAllocatedTensor(vkb::core::DeviceC &device, TensorBuilder const &builder, VkDeviceMemory existing_memory, + VkDeviceSize existing_memory_offset) : + vkb::core::VulkanResourceC(VK_NULL_HANDLE, &device), // Handle will be set later in the constructor + descriptor(builder) +{ + // Create tensor + VkTensorARM tensor = VK_NULL_HANDLE; + VkResult res = vkCreateTensorARM(device.get_handle(), &descriptor.get_create_info(), nullptr, &tensor); + + // Bind it to existing memory + VkBindTensorMemoryInfoARM bind_info = {VK_STRUCTURE_TYPE_BIND_TENSOR_MEMORY_INFO_ARM, + nullptr, tensor, existing_memory, existing_memory_offset}; + vkBindTensorMemoryARM(device.get_handle(), 1, &bind_info); + + set_handle(tensor); + if (!builder.get_debug_name().empty()) + { + set_debug_name(builder.get_debug_name()); + } +} + +ExternallyAllocatedTensor::~ExternallyAllocatedTensor() +{ + if (get_handle() != VK_NULL_HANDLE) + { + vkDestroyTensorARM(get_device().get_handle(), get_handle(), nullptr); + } +} + +const VkTensorDescriptionARM &ExternallyAllocatedTensor::get_description() const +{ + return descriptor.get_description(); +} + +VkFormat ExternallyAllocatedTensor::get_format() const +{ + return descriptor.get_create_info().pDescription->format; +}; + +TensorView::TensorView(Tensor &tensor, VkFormat format) : + vkb::core::VulkanResourceC(VK_NULL_HANDLE, &tensor.get_device()) +{ + Init(tensor, format); +} + +TensorView::TensorView(ExternallyAllocatedTensor &tensor, VkFormat format) : + vkb::core::VulkanResourceC(VK_NULL_HANDLE, &tensor.get_device()) +{ + Init(tensor, format); +} + +template +void TensorView::Init(T &tensor, VkFormat format) +{ + if (format == VK_FORMAT_UNDEFINED) // VK_FORMAT_UNDEFINED means to use the same format as the provided tensor. + { + format = tensor.get_format(); + } + + VkTensorViewCreateInfoARM view_info{VK_STRUCTURE_TYPE_TENSOR_VIEW_CREATE_INFO_ARM}; + view_info.tensor = tensor.get_handle(); + view_info.format = format; + VK_CHECK(vkCreateTensorViewARM(get_device().get_handle(), &view_info, nullptr, &get_handle())); +} + +template void TensorView::Init(Tensor &, VkFormat); +template void TensorView::Init(ExternallyAllocatedTensor &, VkFormat); + +TensorView::~TensorView() +{ + vkDestroyTensorViewARM(get_device().get_handle(), get_handle(), nullptr); +} + +DataGraphPipelineLayout::DataGraphPipelineLayout(vkb::core::DeviceC &device, const std::set &tensor_bindings) : + vkb::core::VulkanResourceC(VK_NULL_HANDLE, &device) +{ + std::vector layout_bindings; + for (uint32_t binding : tensor_bindings) + { + VkDescriptorSetLayoutBinding layout_binding{}; + layout_binding.binding = binding; + layout_binding.descriptorCount = 1; + layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_TENSOR_ARM; + layout_binding.stageFlags = VK_SHADER_STAGE_ALL; // Data graph pipelines don't have shader stages per-se, so VK_SHADER_STAGE_ALL is used. + layout_bindings.push_back(layout_binding); + } + + // Create set layout + VkDescriptorSetLayoutCreateInfo set_layout_create_info{VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; + set_layout_create_info.bindingCount = static_cast(layout_bindings.size()); + set_layout_create_info.pBindings = layout_bindings.data(); + VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &set_layout_create_info, nullptr, &descriptor_set_layout)); + + // Create pipeline layout + VkPipelineLayoutCreateInfo pipeline_layout_create_info{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + pipeline_layout_create_info.setLayoutCount = 1; + pipeline_layout_create_info.pSetLayouts = &descriptor_set_layout; + VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &get_handle())); +} + +DataGraphPipelineLayout::~DataGraphPipelineLayout() +{ + vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout, nullptr); + vkDestroyPipelineLayout(get_device().get_handle(), get_handle(), nullptr); +} + +const VkDescriptorSetLayout &DataGraphPipelineLayout::get_descriptor_set_layout() const +{ + return descriptor_set_layout; +} + +DataGraphPipeline::DataGraphPipeline(vkb::core::DeviceC &device, + VkPipelineLayout layout, + VkShaderModule shader_module, + const char *entry_point, + const std::map> &tensor_descriptions, + const std::vector &data_graph_pipeline_constants) : + vkb::core::VulkanResourceC(VK_NULL_HANDLE, &device), shader_module(shader_module) +{ + // Create array of data graph pipeline resource infos (one for each input/output tensor) + std::vector resource_infos; + for (const auto &tensor_descriptions_set : tensor_descriptions) + { + uint32_t set_idx = tensor_descriptions_set.first; + const std::map &tensor_descriptions_this_set = tensor_descriptions_set.second; + + for (const auto &tensor_description_binding : tensor_descriptions_this_set) + { + const VkTensorDescriptionARM *tensor_description = tensor_description_binding.second; + + VkDataGraphPipelineResourceInfoARM resource_info = {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_RESOURCE_INFO_ARM}; + resource_info.pNext = tensor_description; + resource_info.descriptorSet = set_idx; + resource_info.binding = tensor_description_binding.first; + resource_infos.push_back(resource_info); + } + } + + // Create data graph pipeline + VkDataGraphPipelineShaderModuleCreateInfoARM pipeline_shader_module_create_info = {VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SHADER_MODULE_CREATE_INFO_ARM}; + pipeline_shader_module_create_info.module = shader_module; + pipeline_shader_module_create_info.pName = entry_point; + + std::vector constants_array(data_graph_pipeline_constants.size()); + if (!data_graph_pipeline_constants.empty()) + { + for (uint32_t i = 0; i < data_graph_pipeline_constants.size(); i++) + { + constants_array[i] = *data_graph_pipeline_constants[i]; + } + + pipeline_shader_module_create_info.constantCount = data_graph_pipeline_constants.size(); + pipeline_shader_module_create_info.pConstants = constants_array.data(); + } + + VkDataGraphPipelineCreateInfoARM pipeline_create_info{VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_CREATE_INFO_ARM}; + pipeline_create_info.pNext = &pipeline_shader_module_create_info; + pipeline_create_info.layout = layout; + pipeline_create_info.resourceInfoCount = resource_infos.size(); + pipeline_create_info.pResourceInfos = resource_infos.data(); + + VK_CHECK(vkCreateDataGraphPipelinesARM(get_device().get_handle(), VK_NULL_HANDLE, VK_NULL_HANDLE, 1, &pipeline_create_info, nullptr, &get_handle())); +} + +DataGraphPipeline::~DataGraphPipeline() +{ + vkDestroyShaderModule(get_device().get_handle(), shader_module, nullptr); + vkDestroyPipeline(get_device().get_handle(), get_handle(), nullptr); +} + +DataGraphPipelineSession::DataGraphPipelineSession(vkb::core::DeviceC &device, + VkPipeline data_graph_pipeline, + VmaAllocationCreateInfo alloc_create_info) : + vkb::allocated::AllocatedC(alloc_create_info, nullptr, &device) +{ + VkDataGraphPipelineSessionCreateInfoARM pipeline_session_create_info = {}; + pipeline_session_create_info.sType = VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_CREATE_INFO_ARM; + pipeline_session_create_info.dataGraphPipeline = data_graph_pipeline; + + VkDataGraphPipelineSessionARM data_graph_pipeline_session = VK_NULL_HANDLE; + VmaAllocationInfo allocation_info{}; + VmaAllocation allocation = VK_NULL_HANDLE; + VK_CHECK(vmaCreateDataGraphPipelineSession( + device.get_handle(), + vkb::allocated::get_memory_allocator(), + &pipeline_session_create_info, + &alloc_create_info, + &data_graph_pipeline_session, + &allocation, + &allocation_info)); + + set_allocation(allocation); + if (allocation_info.size > 0) // Sometimes no memory is needed, which is fine. + { + post_create(allocation_info); + } + set_handle(data_graph_pipeline_session); +} + +DataGraphPipelineSession::~DataGraphPipelineSession() +{ + if (get_handle() != VK_NULL_HANDLE) + { + vmaDestroyDataGraphPipelineSession(get_device().get_handle(), vkb::allocated::get_memory_allocator(), get_handle(), get_allocation()); + clear(); + } +} + +ComputePipelineLayoutWithTensors::ComputePipelineLayoutWithTensors(vkb::core::DeviceC &device, vkb::ShaderModule &shader_module) : + vkb::core::VulkanResourceC(nullptr, &device) +{ + // Create a regular vkb::PipelineLayout to reflect all the regular shader resources except tensors + std::unique_ptr layout_without_tensors = std::make_unique(device, std::vector{&shader_module}); + + // Gather all the binding info that was found + std::map> all_bindings; + for (const std::pair> set_and_resources : layout_without_tensors->get_shader_sets()) + { + uint32_t set_idx = set_and_resources.first; + all_bindings[set_idx] = layout_without_tensors->get_descriptor_set_layout(set_idx).get_bindings(); + } + + // Add tensor resources using reflection of the SPIR-V binary + spirv_cross::CompilerGLSL compiler{shader_module.get_binary()}; + spirv_cross::CompilerGLSL::Options opts = compiler.get_common_options(); + opts.enable_420pack_extension = true; + compiler.set_common_options(opts); + + spirv_cross::SmallVector tensor_resources = compiler.get_shader_resources().tensors; + for (const spirv_cross::Resource &tensor_resource : tensor_resources) + { + uint32_t set_idx = compiler.get_decoration(tensor_resource.id, spv::DecorationDescriptorSet); + uint32_t binding = compiler.get_decoration(tensor_resource.id, spv::DecorationBinding); + + VkDescriptorSetLayoutBinding layout_binding{}; + + layout_binding.binding = binding; + layout_binding.descriptorCount = 1; // Assume this isn't an array (though this support could be added) + layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_TENSOR_ARM; + layout_binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + + all_bindings[set_idx].push_back(layout_binding); + } + + // Create set layouts now that we have the full set of bindings + std::vector descriptor_set_layouts_array; // As well as storing a std::map of descriptor set layouts, we need a linear array for use in VkPipelineLayoutCreateInfo + for (const std::pair> &set_idx_and_bindings : all_bindings) + { + uint32_t set_idx = set_idx_and_bindings.first; + const std::vector &bindings = set_idx_and_bindings.second; + + VkDescriptorSetLayoutCreateInfo create_info{VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; + create_info.bindingCount = bindings.size(); + create_info.pBindings = bindings.data(); + + VkDescriptorSetLayout set_layout; + VK_CHECK(vkCreateDescriptorSetLayout(device.get_handle(), &create_info, nullptr, &set_layout)); + + descriptor_set_layouts[set_idx] = set_layout; + descriptor_set_layouts_array.push_back(set_layout); + } + + // Create pipeline layout using these layouts + VkPipelineLayoutCreateInfo create_info{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + create_info.setLayoutCount = descriptor_set_layouts_array.size(); + create_info.pSetLayouts = descriptor_set_layouts_array.data(); + + // Collect all the push constant shader resources + std::vector push_constant_ranges; + for (const auto &push_constant_resource : layout_without_tensors->get_resources(vkb::ShaderResourceType::PushConstant)) + { + push_constant_ranges.push_back({push_constant_resource.stages, push_constant_resource.offset, push_constant_resource.size}); + } + create_info.pushConstantRangeCount = push_constant_ranges.size(); + create_info.pPushConstantRanges = push_constant_ranges.data(); + + // Finally we can create the pipeline layout + VK_CHECK(vkCreatePipelineLayout(device.get_handle(), &create_info, nullptr, &get_handle())); +} + +ComputePipelineLayoutWithTensors::~ComputePipelineLayoutWithTensors() +{ + for (const std::pair &set_idx_and_layout : descriptor_set_layouts) + { + vkDestroyDescriptorSetLayout(get_device().get_handle(), set_idx_and_layout.second, nullptr); + } + vkDestroyPipelineLayout(get_device().get_handle(), get_handle(), nullptr); +} + +const std::map &ComputePipelineLayoutWithTensors::get_descriptor_set_layouts() const +{ + return descriptor_set_layouts; +} + +ComputePipelineWithTensors::ComputePipelineWithTensors(vkb::core::DeviceC &device, VkPipelineLayout layout, vkb::ShaderModule &shader) : + vkb::core::VulkanResourceC(VK_NULL_HANDLE, &device) +{ + // Create shader module + VkShaderModuleCreateInfo module_create_info{}; + module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + module_create_info.codeSize = shader.get_binary().size() * sizeof(uint32_t); + module_create_info.pCode = shader.get_binary().data(); + VK_CHECK(vkCreateShaderModule(device.get_handle(), &module_create_info, NULL, &shader_module)); + + // Create compute pipeline + VkPipelineShaderStageCreateInfo stage{VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO}; + stage.stage = VK_SHADER_STAGE_COMPUTE_BIT; + stage.pName = shader.get_entry_point().c_str(); + stage.module = shader_module; + + VkComputePipelineCreateInfo create_info{VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO}; + create_info.layout = layout; + create_info.stage = stage; + + VK_CHECK(vkCreateComputePipelines(device.get_handle(), VK_NULL_HANDLE, 1, &create_info, nullptr, &get_handle())); +} + +ComputePipelineWithTensors::~ComputePipelineWithTensors() +{ + vkDestroyShaderModule(get_device().get_handle(), shader_module, nullptr); + vkDestroyPipeline(get_device().get_handle(), get_handle(), nullptr); +} + +BlitSubpass::BlitSubpass(vkb::rendering::RenderContextC &renderContext, vkb::core::ImageView *source) : + vkb::rendering::SubpassC(renderContext, vkb::ShaderSource{"tensor_and_data_graph/glsl/fullscreen.vert.spv"}, vkb::ShaderSource{"tensor_and_data_graph/glsl/blit.frag.spv"}), + source(source) +{ +} + +void BlitSubpass::prepare() +{ + vkb::ShaderModule &fullscreen_vert = + get_render_context().get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, vkb::ShaderSource{"tensor_and_data_graph/glsl/fullscreen.vert.spv"}); + vkb::ShaderModule &blit_frag = + get_render_context().get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, vkb::ShaderSource{"tensor_and_data_graph/glsl/blit.frag.spv"}); + pipeline_layout = &get_render_context().get_device().get_resource_cache().request_pipeline_layout({&fullscreen_vert, &blit_frag}); + + VkSamplerCreateInfo sampler_create_info{VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; + sampler_create_info.minFilter = VK_FILTER_LINEAR; + sampler_create_info.magFilter = VK_FILTER_LINEAR; + sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; + sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; + sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; + sampler = std::make_unique(get_render_context().get_device(), sampler_create_info); +} + +void BlitSubpass::set_source(vkb::core::ImageView *source) +{ + this->source = source; +} + +void BlitSubpass::draw(vkb::core::CommandBufferC &command_buffer) +{ + vkb::RasterizationState rasterization_state = {}; + rasterization_state.cull_mode = VK_CULL_MODE_NONE; + command_buffer.set_rasterization_state(rasterization_state); + + vkb::DepthStencilState depth_stencil_state = {}; + depth_stencil_state.depth_test_enable = VK_FALSE; + command_buffer.set_depth_stencil_state(depth_stencil_state); + + command_buffer.bind_pipeline_layout(*pipeline_layout); + command_buffer.bind_image(*source, *sampler, 0, 0, 0); + command_buffer.draw(3, 1, 0, 0); +} diff --git a/samples/extensions/tensor_and_data_graph/tensor_and_data_graph_common.h b/samples/extensions/tensor_and_data_graph/tensor_and_data_graph_common.h new file mode 100644 index 0000000000..e339347fa0 --- /dev/null +++ b/samples/extensions/tensor_and_data_graph/tensor_and_data_graph_common.h @@ -0,0 +1,326 @@ +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * @file Contains helper functions and types for working with tensors and data graph pipelines. + * Many of these are analogous with the Image and Buffer equivalents in the sample framework. + */ + +#pragma once + +#include +#include +#include +#include +#include + +/** + * Simple wrapper around an array of elements of type T which interprets it as a multidimensional array, + * allowing convenient access to elements using a multidimensional index. + */ +template +struct MultidimensionalArrayView +{ + T *data; + std::vector dimensions; + + MultidimensionalArrayView(T *data, const std::vector &dimensions) : + data(data), dimensions(dimensions) + { + } + + T &operator[](std::initializer_list indices) + { + if (indices.size() != dimensions.size()) + { + throw std::runtime_error("Number of indices must match number of dimensions"); + } + size_t index = 0; + size_t multiplier = 1; + // Calculate the index based on the provided indices and dimensions + for (int i = dimensions.size() - 1; i >= 0; --i) + { + index += *(indices.begin() + i) * multiplier; + multiplier *= dimensions[i]; + } + return data[index]; + } +}; + +/* + ** @brief Helper function to write a series of image and tensor bindings to a descriptor set. Does not support descriptor arrays. + */ +void write_descriptor_set(VkDevice device, + VkDescriptorSet set, + const std::map &image_bindings, + const std::map &tensor_bindings); + +/* + * @brief Creates a Tensor resource and backs it with memory. Analogous to vmaCreateImage/Buffer. + * @detail When finished, destroy the tensor and its memory using vmaDestroyTensor. + */ +VkResult vmaCreateTensor(VkDevice device, + VmaAllocator allocator, + const VkTensorCreateInfoARM *pTensorCreateInfo, + const VmaAllocationCreateInfo *pAllocationCreateInfo, + VkTensorARM *pTensor, + VmaAllocation *pAllocation, + VmaAllocationInfo *pAllocationInfo); + +/* + ** @brief Destroys a Tensor resource and its backing memory, which were created from vmaCreateTensor. Analogous to vmaDestroyImage/Buffer. + */ +void vmaDestroyTensor(VkDevice device, + VmaAllocator allocator, + VkTensorARM tensor, + VmaAllocation allocation); + +/* + * @brief Creates a VkDataGraphPipelineSessionARM resource and backs it with memory. Analogous to vmaCreateImage/Buffer. + * @detail When finished, destroy the session and its memory using vmaDestroyDataGraphPipelineSession. + */ +VkResult vmaCreateDataGraphPipelineSession(VkDevice device, + VmaAllocator allocator, + const VkDataGraphPipelineSessionCreateInfoARM *pDataGraphPipelineSessionCreateInfo, + const VmaAllocationCreateInfo *pAllocationCreateInfo, + VkDataGraphPipelineSessionARM *pDataGraphPipelineSession, + VmaAllocation *pAllocation, + VmaAllocationInfo *pAllocationInfo); + +/* + ** @brief Destroys a DataGraphPipelineSession resource and its backing memory, which were created from vmaCreateDataGraphPipelineSession. Analogous to vmaDestroyImage/Buffer. + */ +void vmaDestroyDataGraphPipelineSession(VkDevice device, + VmaAllocator allocator, + VkDataGraphPipelineSessionARM session, + VmaAllocation allocation); + +/* + * @brief Helper class to describe a Tensor resource that is to be created (see Tensor constructor below). Analogous to vkb::ImageBuilder/BufferBuilder. + */ +class TensorBuilder : public vkb::allocated::BuilderBaseC +{ + public: + TensorBuilder(std::vector in_dimensions); + + TensorBuilder &with_format(VkFormat format); + TensorBuilder &with_tiling(VkTensorTilingARM tiling); + TensorBuilder &with_usage(VkTensorUsageFlagsARM usage); + + private: + // VkTensorCreateInfoARM (stored in the base class) has a pointer to a VkTensorDescriptionARM, + // so we need to store that struct separately so that it outlives the pointer. + VkTensorDescriptionARM description; + // The description points to a dimensions array, so we need to store that array separately so that it outlives the pointer. + std::vector dimensions; +}; + +/* + * @brief Common descriptor class used by Tensor and ExternallyAllocatedTensor. + */ +class TensorDescriptor +{ + public: + TensorDescriptor(const TensorBuilder &builder); + ~TensorDescriptor() = default; + + const VkTensorCreateInfoARM &get_create_info() const; + + const VkTensorDescriptionARM &get_description() const; + + private: + VkTensorCreateInfoARM create_info; + // create_info has a pointer to a VkTensorDescriptionARM, so we need to store that struct separately so that it outlives the pointer. + VkTensorDescriptionARM description; + // The description points to a dimensions array, so we need to store that array separately so that it outlives the pointer. + std::vector dimensions; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkTensorARM resource. Analogous to vkb::Image/Buffer. + */ +class Tensor : public vkb::allocated::AllocatedC +{ + public: + Tensor(vkb::core::DeviceC &device, TensorBuilder const &builder); + ~Tensor(); + + const VkTensorDescriptionARM &get_description() const; + + VkFormat get_format() const; + + private: + TensorDescriptor descriptor; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkTensorARM resource, but does not allocate + * any its own memory. Memory must be provided on construction and is useful for creating tensors that alias existing memory. + */ +class ExternallyAllocatedTensor : public vkb::core::VulkanResourceC +{ + public: + ExternallyAllocatedTensor(vkb::core::DeviceC &device, TensorBuilder const &builder, VkDeviceMemory existing_memory, + VkDeviceSize existing_memory_offset); + ~ExternallyAllocatedTensor(); + + const VkTensorDescriptionARM &get_description() const; + + VkFormat get_format() const; + + private: + TensorDescriptor descriptor; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkTensorARM resource. Analogous to vkb::ImageView/BufferView. + */ +class TensorView : public vkb::core::VulkanResourceC +{ + public: + TensorView(Tensor &tensor, VkFormat format = VK_FORMAT_UNDEFINED); // VK_FORMAT_UNDEFINED means to use the same format as the provided tensor. + TensorView(ExternallyAllocatedTensor &tensor, VkFormat format = VK_FORMAT_UNDEFINED); // VK_FORMAT_UNDEFINED means to use the same format as the provided tensor. + ~TensorView(); + + private: + template + void Init(T &tensor, VkFormat format); +}; + +/* + * @brief Helper struct to hold the resources needed for a constant tensor. + */ +template +struct PipelineConstantTensor +{ + std::vector dimensions; + std::vector constant_data; + VkTensorDescriptionARM tensor_description{}; + VkDataGraphPipelineConstantARM pipeline_constant{}; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkPipelineLayout resource for a Data Graph Pipeline. Analogous to vkb::PipelineLayout. + * @detail This class only supports a single descriptor set, but the underyling APIs do support multiple desriptor sets. + We also create and manage this corresponding VkDescriptorSetLayout. + Typically, layout creation would be done using reflection on the assembled SPIR-V shader code, however spirv-cross does not yet support + reflection on data graph shaders. Therefore the caller must provide the layout themselves, but thankfully this is quite minimal (we just need to know + the binding points for tensors). + */ +class DataGraphPipelineLayout : public vkb::core::VulkanResourceC +{ + public: + /* + * @brief Creates a DataGraphPipelineLayout. Assumes all tensor bindings are in the first descriptor set. + * @param tensor_bindings The binding numbers for every tensor, which are assumed to be in the first descriptor set. + */ + DataGraphPipelineLayout(vkb::core::DeviceC &device, const std::set &tensor_bindings); + ~DataGraphPipelineLayout(); + + const VkDescriptorSetLayout &get_descriptor_set_layout() const; + + private: + VkDescriptorSetLayout descriptor_set_layout = VK_NULL_HANDLE; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkPipeline resource for a Data Graph Pipeline. Similar to vkb::ComputePipeline. + */ +class DataGraphPipeline : public vkb::core::VulkanResourceC +{ + public: + /* + * @brief Creates a DataGraphPipeline. + * @param tensor_descriptions Descriptions (shape, format, etc.) for each tensor that will be bound to this pipeline. + * The first key in the map is the set number and the second key is the binding number. + */ + DataGraphPipeline(vkb::core::DeviceC &device, + VkPipelineLayout layout, + VkShaderModule shader_module, + const char *entry_point, + const std::map> &tensor_descriptions, + const std::vector &data_graph_pipeline_constants = std::vector()); + ~DataGraphPipeline(); + + private: + VkShaderModule shader_module = VK_NULL_HANDLE; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkDataGraphPipelineSessionARM resource. + * @detail Unlike compute and graphics pipelines, data graph pipelines require additional state to be stored (e.g. for intermediate results). This is stored + * separately to the pipeline itself in a new 'pipeline session' resource. This requires memory to be allocated and bound to it (similar to a buffer). + */ +class DataGraphPipelineSession : public vkb::allocated::AllocatedC +{ + public: + DataGraphPipelineSession(vkb::core::DeviceC &device, VkPipeline data_graph_pipeline, VmaAllocationCreateInfo alloc_create_info); + ~DataGraphPipelineSession(); +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkPipelineLayout resource for a Compute Pipeline. Similar to vkb::PipelineLayout, but supports Tensor resources. + * @detail The sample framework's vkb::PipelineLayout class doesn't understand Tensor resources, so can't be used for compute shaders that use tensors. + * This class is a modified copy of vkb::PipelineLayout that does support tensors, albeit with less other features. + */ +class ComputePipelineLayoutWithTensors : public vkb::core::VulkanResourceC +{ + public: + ComputePipelineLayoutWithTensors(vkb::core::DeviceC &device, vkb::ShaderModule &shader_module); + ~ComputePipelineLayoutWithTensors(); + + const std::map &get_descriptor_set_layouts() const; + + private: + std::map descriptor_set_layouts; +}; + +/* + * @brief Helper class to create and manage the lifetime of a VkPipeline resource for a Compute Pipeline. Similar to vkb::ComputePipeline, but supports Tensor resources. + * @detail The sample framework's vkb::ComputePipeline class (and its dependencies) don't understand Tensor resources, so can't be used for compute shaders that use tensors. + * This class is a modified copy of vkb::ComputePipeline that does support tensors, albeit with less other features. + * We can't use the vkb::PipelineState as that doesn't support tensors, so instead take the VkPipelineLayout and vkb::ShaderModule directly. + */ +class ComputePipelineWithTensors : public vkb::core::VulkanResourceC +{ + public: + ComputePipelineWithTensors(vkb::core::DeviceC &device, VkPipelineLayout layout, vkb::ShaderModule &shader); + ~ComputePipelineWithTensors(); + + private: + VkShaderModule shader_module = VK_NULL_HANDLE; +}; + +/* + * @brief Simple subpass for use with vkb::RenderPipeline, which blits an image to the render target (stretching to fit). + */ +class BlitSubpass : public vkb::rendering::SubpassC +{ + public: + BlitSubpass(vkb::rendering::RenderContextC &renderContext, vkb::core::ImageView *source = nullptr); + + void prepare() override; + + void set_source(vkb::core::ImageView *source); + + void draw(vkb::core::CommandBufferC &command_buffer) override; + + private: + vkb::PipelineLayout *pipeline_layout = nullptr; + vkb::core::ImageView *source = nullptr; + std::unique_ptr sampler = nullptr; +}; diff --git a/samples/extensions/tensor_and_data_graph/verify_layers.png b/samples/extensions/tensor_and_data_graph/verify_layers.png new file mode 100644 index 0000000000..333320790a Binary files /dev/null and b/samples/extensions/tensor_and_data_graph/verify_layers.png differ diff --git a/samples/extensions/timeline_semaphore/CMakeLists.txt b/samples/extensions/timeline_semaphore/CMakeLists.txt index 4458805124..e0ee3f4696 100644 --- a/samples/extensions/timeline_semaphore/CMakeLists.txt +++ b/samples/extensions/timeline_semaphore/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, Arm Limited and Contributors +# Copyright (c) 2021-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -26,8 +26,15 @@ add_sample_with_tags( NAME "Timeline semaphore" DESCRIPTION "Demonstrates use of timeline semaphores to express complex queue dependency graphs" SHADER_FILES_GLSL - "timeline_semaphore/game_of_life_update.comp" - "timeline_semaphore/game_of_life_mutate.comp" - "timeline_semaphore/game_of_life_init.comp" - "timeline_semaphore/render.vert" - "timeline_semaphore/render.frag") + "timeline_semaphore/glsl/game_of_life_update.comp" + "timeline_semaphore/glsl/game_of_life_mutate.comp" + "timeline_semaphore/glsl/game_of_life_init.comp" + "timeline_semaphore/glsl/render.vert" + "timeline_semaphore/glsl/render.frag" + SHADER_FILES_SLANG + "timeline_semaphore/slang/game_of_life_update.comp.slang" + "timeline_semaphore/slang/game_of_life_mutate.comp.slang" + "timeline_semaphore/slang/game_of_life_init.comp.slang" + "timeline_semaphore/slang/render.vert.slang" + "timeline_semaphore/slang/render.frag.slang" +) diff --git a/samples/extensions/timeline_semaphore/timeline_semaphore.cpp b/samples/extensions/timeline_semaphore/timeline_semaphore.cpp index fc888f1df8..3c7ee9fd22 100644 --- a/samples/extensions/timeline_semaphore/timeline_semaphore.cpp +++ b/samples/extensions/timeline_semaphore/timeline_semaphore.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -330,20 +330,20 @@ void TimelineSemaphore::setup_compute_pipeline() VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &layout_info, nullptr, &compute.pipeline_layout)); VkComputePipelineCreateInfo info = vkb::initializers::compute_pipeline_create_info(compute.pipeline_layout); - info.stage = load_shader("timeline_semaphore/game_of_life_update.comp", VK_SHADER_STAGE_COMPUTE_BIT); + info.stage = load_shader("timeline_semaphore", "game_of_life_update.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &compute.update_pipeline)); - info.stage = load_shader("timeline_semaphore/game_of_life_mutate.comp", VK_SHADER_STAGE_COMPUTE_BIT); + info.stage = load_shader("timeline_semaphore", "game_of_life_mutate.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &compute.mutate_pipeline)); - info.stage = load_shader("timeline_semaphore/game_of_life_init.comp", VK_SHADER_STAGE_COMPUTE_BIT); + info.stage = load_shader("timeline_semaphore", "game_of_life_init.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT); VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &compute.init_pipeline)); } void TimelineSemaphore::setup_compute_resources() { // Get compute queue - compute.queue_family_index = get_device().get_queue_family_index(VK_QUEUE_COMPUTE_BIT); + compute.queue_family_index = vkb::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), VK_QUEUE_COMPUTE_BIT); vkGetDeviceQueue(get_device().get_handle(), compute.queue_family_index, 0, &compute.queue); compute.command_pool = get_device().create_command_pool(compute.queue_family_index, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); @@ -398,7 +398,7 @@ void TimelineSemaphore::setup_game_of_life() VK_CHECK(vkQueueSubmit(compute.queue, 1, &submit_info, VK_NULL_HANDLE)); - VK_CHECK(get_device().wait_idle()); + get_device().wait_idle(); } void TimelineSemaphore::build_compute_command_buffers(const float elapsed) @@ -498,7 +498,7 @@ void TimelineSemaphore::do_graphics_work() void TimelineSemaphore::setup_graphics_resources() { - graphics.queue_family_index = get_device().get_queue_family_index(VK_QUEUE_GRAPHICS_BIT); + graphics.queue_family_index = vkb::get_queue_family_index(get_device().get_gpu().get_queue_family_properties(), VK_QUEUE_GRAPHICS_BIT); graphics.queue = queue; graphics.command_pool = get_device().create_command_pool(graphics.queue_family_index, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); @@ -550,8 +550,8 @@ void TimelineSemaphore::setup_graphics_pipeline() info.pStages = stages; info.stageCount = 2; - stages[0] = load_shader("timeline_semaphore/render.vert", VK_SHADER_STAGE_VERTEX_BIT); - stages[1] = load_shader("timeline_semaphore/render.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + stages[0] = load_shader("timeline_semaphore", "render.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + stages[1] = load_shader("timeline_semaphore", "render.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), VK_NULL_HANDLE, 1, &info, nullptr, &graphics.pipeline)); } @@ -607,13 +607,10 @@ void TimelineSemaphore::build_graphics_command_buffer() VK_CHECK(vkEndCommandBuffer(graphics.command_buffer)); } -void TimelineSemaphore::request_gpu_features(vkb::PhysicalDevice &gpu) +void TimelineSemaphore::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Need to enable the timelineSemaphore feature. - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceTimelineSemaphoreFeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, - timelineSemaphore); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceTimelineSemaphoreFeaturesKHR, timelineSemaphore); } bool TimelineSemaphore::prepare(const vkb::ApplicationOptions &options) diff --git a/samples/extensions/timeline_semaphore/timeline_semaphore.h b/samples/extensions/timeline_semaphore/timeline_semaphore.h index cfa0a17b29..b04f253400 100644 --- a/samples/extensions/timeline_semaphore/timeline_semaphore.h +++ b/samples/extensions/timeline_semaphore/timeline_semaphore.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -120,7 +120,7 @@ class TimelineSemaphore : public ApiVulkanSample void setup_graphics_pipeline(); void build_graphics_command_buffer(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual bool prepare(const vkb::ApplicationOptions &options) override; virtual void render(float delta_time) override; }; diff --git a/samples/extensions/vertex_dynamic_state/CMakeLists.txt b/samples/extensions/vertex_dynamic_state/CMakeLists.txt index a8f7449f46..4e6f59d648 100644 --- a/samples/extensions/vertex_dynamic_state/CMakeLists.txt +++ b/samples/extensions/vertex_dynamic_state/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, Mobica Limited +# Copyright (c) 2022-2025, Mobica Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,8 @@ add_sample( "vertex_dynamic_state/glsl/gbuffer.frag" SHADER_FILES_HLSL "vertex_dynamic_state/hlsl/gbuffer.vert.hlsl" - "vertex_dynamic_state/hlsl/gbuffer.frag.hlsl") + "vertex_dynamic_state/hlsl/gbuffer.frag.hlsl" + SHADER_FILES_SLANG + "vertex_dynamic_state/slang/gbuffer.vert.slang" + "vertex_dynamic_state/slang/gbuffer.frag.slang") + diff --git a/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.cpp b/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.cpp index 87e7df81b3..6b03063d60 100644 --- a/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.cpp +++ b/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Mobica Limited +/* Copyright (c) 2022-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -215,8 +215,8 @@ void VertexDynamicState::create_pipeline() 0); std::array shader_stages{}; - shader_stages[0] = load_shader("vertex_dynamic_state", "gbuffer.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("vertex_dynamic_state", "gbuffer.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("vertex_dynamic_state", "gbuffer.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("vertex_dynamic_state", "gbuffer.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); /* Create graphics pipeline for dynamic rendering */ VkFormat color_rendering_format = get_render_context().get_format(); @@ -445,14 +445,11 @@ void VertexDynamicState::create_descriptor_sets() vkUpdateDescriptorSets(get_device().get_handle(), static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr); } -void VertexDynamicState::request_gpu_features(vkb::PhysicalDevice &gpu) +void VertexDynamicState::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { /* Enable extension features required by this sample These are passed to device creation via a pNext structure chain */ - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, - vertexInputDynamicState); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT, vertexInputDynamicState); if (gpu.get_features().samplerAnisotropy) { diff --git a/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.h b/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.h index 9f84a5e763..996ee36502 100644 --- a/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.h +++ b/samples/extensions/vertex_dynamic_state/vertex_dynamic_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, Mobica Limited +/* Copyright (c) 2022-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -70,7 +70,7 @@ class VertexDynamicState : public ApiVulkanSample virtual void render(float delta_time) override; virtual void build_command_buffers() override; virtual bool prepare(const vkb::ApplicationOptions &options) override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void prepare_uniform_buffers(); void update_uniform_buffers(); diff --git a/samples/general/mobile_nerf/CMakeLists.txt b/samples/general/mobile_nerf/CMakeLists.txt index c9cfa6023a..1074a91864 100644 --- a/samples/general/mobile_nerf/CMakeLists.txt +++ b/samples/general/mobile_nerf/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. +# Copyright (c) 2023-2025, Qualcomm Innovation Center, Inc. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -25,4 +25,16 @@ add_sample_with_tags( AUTHOR "Qualcomm" NAME "Mobile NeRF" DESCRIPTION "A Mobile Neural Radiance Field synthesizer sample, based on textured polygons" -) \ No newline at end of file + SHADER_FILES_GLSL + "mobile_nerf/merged.frag" + "mobile_nerf/merged_morpheus.frag" + "mobile_nerf/mlp.frag" + "mobile_nerf/mlp_combo.frag" + "mobile_nerf/mlp_morpheus.frag" + "mobile_nerf/mlp_morpheus_combo.frag" + "mobile_nerf/quad.vert" + "mobile_nerf/raster.frag" + "mobile_nerf/raster.vert" + "mobile_nerf/raster_combo.frag" + "mobile_nerf/raster_morpheus.frag" + "mobile_nerf/raster_morpheus_combo.frag") \ No newline at end of file diff --git a/samples/general/mobile_nerf/mobile_nerf.cpp b/samples/general/mobile_nerf/mobile_nerf.cpp index 564dcd411a..697faa3153 100644 --- a/samples/general/mobile_nerf/mobile_nerf.cpp +++ b/samples/general/mobile_nerf/mobile_nerf.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved. +/* Copyright (c) 2023-2025, Qualcomm Innovation Center, Inc. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -356,27 +356,27 @@ void MobileNerf::load_shaders() if (use_deferred) { // Loading first pass shaders - shader_stages_first_pass[0] = load_shader("mobile_nerf/raster.vert", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages_first_pass[0] = load_shader("mobile_nerf/raster.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shader_stages_first_pass[1] = load_shader( combo_mode ? - (using_original_nerf_models[0] ? "mobile_nerf/raster_combo.frag" : "mobile_nerf/raster_morpheus_combo.frag") : - (using_original_nerf_models[0] ? "mobile_nerf/raster.frag" : "mobile_nerf/raster_morpheus.frag"), + (using_original_nerf_models[0] ? "mobile_nerf/raster_combo.frag.spv" : "mobile_nerf/raster_morpheus_combo.frag.spv") : + (using_original_nerf_models[0] ? "mobile_nerf/raster.frag.spv" : "mobile_nerf/raster_morpheus.frag.spv"), VK_SHADER_STAGE_FRAGMENT_BIT); // Loading second pass shaders shader_stages_second_pass[0] = load_shader("mobile_nerf/quad.vert", VK_SHADER_STAGE_VERTEX_BIT); shader_stages_second_pass[1] = load_shader( combo_mode ? - (using_original_nerf_models[0] ? "mobile_nerf/mlp_combo.frag" : "mobile_nerf/mlp_morpheus_combo.frag") : - (using_original_nerf_models[0] ? "mobile_nerf/mlp.frag" : "mobile_nerf/mlp_morpheus.frag"), + (using_original_nerf_models[0] ? "mobile_nerf/mlp_combo.frag.spv" : "mobile_nerf/mlp_morpheus_combo.frag.spv") : + (using_original_nerf_models[0] ? "mobile_nerf/mlp.frag.spv" : "mobile_nerf/mlp_morpheus.frag.spv"), VK_SHADER_STAGE_FRAGMENT_BIT); } else { // Loading one pass shaders - shader_stages_first_pass[0] = load_shader("mobile_nerf/raster.vert", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages_first_pass[0] = load_shader("mobile_nerf/raster.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shader_stages_first_pass[1] = load_shader( - using_original_nerf_models[0] ? "mobile_nerf/merged.frag" : "mobile_nerf/merged_morpheus.frag", + using_original_nerf_models[0] ? "mobile_nerf/merged.frag.spv" : "mobile_nerf/merged_morpheus.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); } } @@ -476,11 +476,11 @@ bool MobileNerf::resize(const uint32_t width, const uint32_t height) return true; } -void MobileNerf::request_gpu_features(vkb::PhysicalDevice &gpu) +void MobileNerf::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, shaderUniformBufferArrayNonUniformIndexing); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, runtimeDescriptorArray); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, descriptorBindingVariableDescriptorCount); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, shaderUniformBufferArrayNonUniformIndexing); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, runtimeDescriptorArray); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, descriptorBindingVariableDescriptorCount); } void MobileNerf::render(float delta_time) @@ -1292,10 +1292,11 @@ void MobileNerf::create_static_object_buffers(int model_index, int sub_model_ind staging_index_buffer->update(model.indices); // Copy over the data for each of the models - with_vkb_command_buffer([&](vkb::CommandBuffer &cmd) { - cmd.copy_buffer(*staging_vertex_buffer, *model.vertex_buffer, staging_vertex_buffer->get_size()); - cmd.copy_buffer(*staging_index_buffer, *model.index_buffer, staging_index_buffer->get_size()); - }); + with_vkb_command_buffer( + [&](vkb::core::CommandBufferC &cmd) { + cmd.copy_buffer(*staging_vertex_buffer, *model.vertex_buffer, staging_vertex_buffer->get_size()); + cmd.copy_buffer(*staging_index_buffer, *model.index_buffer, staging_index_buffer->get_size()); + }); LOGI("Done Creating static object buffers"); } @@ -1552,9 +1553,7 @@ void MobileNerf::prepare_instance_data() staging_instance_buffer->update(instance_data); // now transfer over to the end buffer - with_vkb_command_buffer([&](vkb::CommandBuffer &cmd) { - cmd.copy_buffer(*staging_instance_buffer, *instance_buffer, staging_instance_buffer->get_size()); - }); + with_vkb_command_buffer([&](vkb::core::CommandBufferC &cmd) { cmd.copy_buffer(*staging_instance_buffer, *instance_buffer, staging_instance_buffer->get_size()); }); } void MobileNerf::draw() diff --git a/samples/general/mobile_nerf/mobile_nerf.h b/samples/general/mobile_nerf/mobile_nerf.h index 950082a66a..b172d42a8d 100644 --- a/samples/general/mobile_nerf/mobile_nerf.h +++ b/samples/general/mobile_nerf/mobile_nerf.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved. +/* Copyright (c) 2023-2025, Qualcomm Innovation Center, Inc. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" #include #include @@ -42,7 +41,7 @@ class MobileNerf : public ApiVulkanSample public: MobileNerf(); ~MobileNerf() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void render(float delta_time) override; bool prepare(const vkb::ApplicationOptions &options) override; bool resize(const uint32_t width, const uint32_t height) override; diff --git a/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.cpp b/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.cpp index 85ef0194e7..2d4b2e04de 100644 --- a/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.cpp +++ b/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved. +/* Copyright (c) 2023-2025, Qualcomm Innovation Center, Inc. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -150,6 +150,12 @@ bool MobileNerfRayQuery::prepare(const vkb::ApplicationOptions &options) camera.set_perspective(60.0f, static_cast(width) / static_cast(height), 0.01f, 256.0f); + VkPhysicalDeviceProperties2 device_properties{}; + device_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + device_properties.pNext = &acceleration_structure_properties; + + vkGetPhysicalDeviceProperties2(get_device().get_gpu().get_handle(), &device_properties); + // Each models may have submodels int models_entry = 0; for (int model_index = 0; model_index < num_models; model_index++) @@ -179,17 +185,17 @@ bool MobileNerfRayQuery::prepare(const vkb::ApplicationOptions &options) return true; } -void MobileNerfRayQuery::request_gpu_features(vkb::PhysicalDevice &gpu) +void MobileNerfRayQuery::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, bufferDeviceAddress); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, accelerationStructure); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayQueryFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, rayQuery); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, shaderUniformBufferArrayNonUniformIndexing); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, shaderSampledImageArrayNonUniformIndexing); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, shaderStorageBufferArrayNonUniformIndexing); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, runtimeDescriptorArray); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, descriptorBindingVariableDescriptorCount); - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceScalarBlockLayoutFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, scalarBlockLayout); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceBufferDeviceAddressFeaturesKHR, bufferDeviceAddress); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceAccelerationStructureFeaturesKHR, accelerationStructure); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceRayQueryFeaturesKHR, rayQuery); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, shaderUniformBufferArrayNonUniformIndexing); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, shaderSampledImageArrayNonUniformIndexing); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, shaderStorageBufferArrayNonUniformIndexing); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, runtimeDescriptorArray); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, descriptorBindingVariableDescriptorCount); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceScalarBlockLayoutFeaturesEXT, scalarBlockLayout); } void MobileNerfRayQuery::render(float delta_time) @@ -556,11 +562,11 @@ void MobileNerfRayQuery::initialize_mlp_uniform_buffers(int model_index) void MobileNerfRayQuery::load_shaders() { - shader_stages[0] = load_shader("mobile_nerf_rayquery/quad.vert", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[0] = load_shader("mobile_nerf_rayquery/quad.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shader_stages[1] = load_shader( combo_mode ? - "mobile_nerf_rayquery/rayquery_morpheus_combo.frag" : - "mobile_nerf_rayquery/rayquery_morpheus.frag", + "mobile_nerf_rayquery/rayquery_morpheus_combo.frag.spv" : + "mobile_nerf_rayquery/rayquery_morpheus.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); } @@ -714,7 +720,7 @@ void MobileNerfRayQuery::create_static_object_buffers(int models_entry) staging_index_buffer->update(model.indices); // Copy over the data for each of the models - with_vkb_command_buffer([&](vkb::CommandBuffer &cmd) { + with_vkb_command_buffer([&](vkb::core::CommandBufferC &cmd) { cmd.copy_buffer(*staging_vertex_buffer, *model.vertex_buffer, staging_vertex_buffer->get_size()); cmd.copy_buffer(*staging_index_buffer, *model.index_buffer, staging_index_buffer->get_size()); }); @@ -837,6 +843,7 @@ void MobileNerfRayQuery::create_top_level_acceleration_structure() top_level_acceleration_structure = std::make_unique(get_device(), VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR); top_level_acceleration_structure->add_instance_geometry(instances_buffer, acceleration_structure_instances.size()); + top_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); top_level_acceleration_structure->build(queue); } @@ -880,6 +887,7 @@ void MobileNerfRayQuery::create_bottom_level_acceleration_structure(int model_en get_buffer_device_address(model.vertex_buffer->get_handle()), get_buffer_device_address(model.index_buffer->get_handle())); } + model.bottom_level_acceleration_structure->set_scrach_buffer_alignment(acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment); model.bottom_level_acceleration_structure->build(queue, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR); } diff --git a/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.h b/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.h index 019ceca58c..a77419727c 100644 --- a/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.h +++ b/samples/general/mobile_nerf_rayquery/mobile_nerf_rayquery.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved. +/* Copyright (c) 2023-2025, Qualcomm Innovation Center, Inc. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ #pragma once #include "api_vulkan_sample.h" -#include "glsl_compiler.h" #include #include @@ -42,7 +41,7 @@ class MobileNerfRayQuery : public ApiVulkanSample public: MobileNerfRayQuery(); ~MobileNerfRayQuery() override; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void render(float delta_time) override; bool prepare(const vkb::ApplicationOptions &options) override; @@ -168,6 +167,9 @@ class MobileNerfRayQuery : public ApiVulkanSample // Feature map format VkFormat feature_map_format = VK_FORMAT_R16G16B16A16_SFLOAT; + // Acceleration structure properties. + VkPhysicalDeviceAccelerationStructurePropertiesKHR acceleration_structure_properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR}; + void read_json_map(); void load_shaders(); void create_uniforms(); diff --git a/samples/performance/16bit_arithmetic/16bit_arithmetic.cpp b/samples/performance/16bit_arithmetic/16bit_arithmetic.cpp index 27d90233bb..a2fd2e3f80 100644 --- a/samples/performance/16bit_arithmetic/16bit_arithmetic.cpp +++ b/samples/performance/16bit_arithmetic/16bit_arithmetic.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -106,20 +106,20 @@ bool KHR16BitArithmeticSample::prepare(const vkb::ApplicationOptions &options) VMA_MEMORY_USAGE_GPU_ONLY); auto staging_buffer = vkb::core::BufferC::create_staging_buffer(device, initial_data_fp16); - auto &cmd = device.request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); - cmd.copy_buffer(staging_buffer, *blob_buffer, sizeof(initial_data_fp16)); + auto cmd = device.get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + cmd->copy_buffer(staging_buffer, *blob_buffer, sizeof(initial_data_fp16)); vkb::BufferMemoryBarrier barrier; barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; barrier.dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; barrier.src_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; - cmd.buffer_memory_barrier(*blob_buffer, 0, VK_WHOLE_SIZE, barrier); - cmd.end(); + cmd->buffer_memory_barrier(*blob_buffer, 0, VK_WHOLE_SIZE, barrier); + cmd->end(); auto &queue = device.get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(cmd, device.request_fence()); + queue.submit(*cmd, device.get_fence_pool().request_fence()); device.get_fence_pool().wait(); // Create the target image we render into in the main compute shader. @@ -148,7 +148,7 @@ bool KHR16BitArithmeticSample::prepare(const vkb::ApplicationOptions &options) // Load shader modules. auto &module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, - vkb::ShaderSource{"16bit_arithmetic/compute_buffer.comp"}); + vkb::ShaderSource{"16bit_arithmetic/compute_buffer.comp.spv"}); compute_layout = &device.get_resource_cache().request_pipeline_layout({&module}); if (supported_extensions) @@ -156,14 +156,18 @@ bool KHR16BitArithmeticSample::prepare(const vkb::ApplicationOptions &options) vkb::ShaderVariant variant; if (supports_push_constant16) { - variant.add_define("PUSH_CONSTANT_16"); + auto &module_fp16 = + device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, + vkb::ShaderSource{"16bit_arithmetic/compute_buffer_fp16.comp.spv"}, variant); + compute_layout_fp16 = &device.get_resource_cache().request_pipeline_layout({&module_fp16}); + } + else + { + auto &module_fp16 = + device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, + vkb::ShaderSource{"16bit_arithmetic/compute_buffer_fp16_fallback.comp.spv"}, variant); + compute_layout_fp16 = &device.get_resource_cache().request_pipeline_layout({&module_fp16}); } - - const char *shader = "16bit_arithmetic/compute_buffer_fp16.comp"; - auto &module_fp16 = - device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, - vkb::ShaderSource{shader}, variant); - compute_layout_fp16 = &device.get_resource_cache().request_pipeline_layout({&module_fp16}); } else { @@ -171,11 +175,9 @@ bool KHR16BitArithmeticSample::prepare(const vkb::ApplicationOptions &options) } // Setup the visualization subpass which is there to blit the final result to screen. - vkb::ShaderSource vertex_source{"16bit_arithmetic/visualize.vert"}; - vkb::ShaderSource fragment_source{"16bit_arithmetic/visualize.frag"}; - auto subpass = std::make_unique(get_render_context(), - std::move(vertex_source), - std::move(fragment_source)); + vkb::ShaderSource vertex_source{"16bit_arithmetic/visualize.vert.spv"}; + vkb::ShaderSource fragment_source{"16bit_arithmetic/visualize.frag.spv"}; + auto subpass = std::make_unique(get_render_context(), std::move(vertex_source), std::move(fragment_source)); subpass->view = image_view.get(); subpass->sampler = sampler.get(); @@ -188,15 +190,15 @@ bool KHR16BitArithmeticSample::prepare(const vkb::ApplicationOptions &options) return true; } -KHR16BitArithmeticSample::VisualizationSubpass::VisualizationSubpass(vkb::RenderContext &context, - vkb::ShaderSource &&vertex_source, - vkb::ShaderSource &&fragment_source) : +KHR16BitArithmeticSample::VisualizationSubpass::VisualizationSubpass(vkb::rendering::RenderContextC &context, + vkb::ShaderSource &&vertex_source, + vkb::ShaderSource &&fragment_source) : vkb::rendering::SubpassC(context, std::move(vertex_source), std::move(fragment_source)) { set_output_attachments({0}); } -void KHR16BitArithmeticSample::VisualizationSubpass::draw(vkb::CommandBuffer &command_buffer) +void KHR16BitArithmeticSample::VisualizationSubpass::draw(vkb::core::CommandBufferC &command_buffer) { command_buffer.bind_pipeline_layout(*layout); @@ -221,29 +223,20 @@ void KHR16BitArithmeticSample::VisualizationSubpass::prepare() layout = &device.get_resource_cache().request_pipeline_layout(shader_modules); } -void KHR16BitArithmeticSample::request_gpu_features(vkb::PhysicalDevice &gpu) +void KHR16BitArithmeticSample::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { // Required features. - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDevice16BitStorageFeatures, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, - storageBuffer16BitAccess); - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDevice16BitStorageFeatures, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, - uniformAndStorageBuffer16BitAccess); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevice16BitStorageFeatures, storageBuffer16BitAccess); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevice16BitStorageFeatures, uniformAndStorageBuffer16BitAccess); // Optional features. - supported_extensions = REQUEST_OPTIONAL_FEATURE(gpu, - VkPhysicalDeviceFloat16Int8FeaturesKHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR, - shaderFloat16); + supported_extensions = REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceFloat16Int8FeaturesKHR, shaderFloat16); supports_push_constant16 = - REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDevice16BitStorageFeatures, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, storagePushConstant16); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDevice16BitStorageFeatures, storagePushConstant16); } -void KHR16BitArithmeticSample::draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void KHR16BitArithmeticSample::draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { if (khr_16bit_arith_enabled) { diff --git a/samples/performance/16bit_arithmetic/16bit_arithmetic.h b/samples/performance/16bit_arithmetic/16bit_arithmetic.h index 44ca69f6ac..c7a15ad56e 100644 --- a/samples/performance/16bit_arithmetic/16bit_arithmetic.h +++ b/samples/performance/16bit_arithmetic/16bit_arithmetic.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -32,9 +32,9 @@ class KHR16BitArithmeticSample : public vkb::VulkanSampleC virtual bool prepare(const vkb::ApplicationOptions &options) override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; - virtual void draw_renderpass(vkb::CommandBuffer &cmd, vkb::RenderTarget &render_target) override; + virtual void draw_renderpass(vkb::core::CommandBufferC &cmd, vkb::RenderTarget &render_target) override; private: virtual void draw_gui() override; @@ -59,9 +59,9 @@ class KHR16BitArithmeticSample : public vkb::VulkanSampleC struct VisualizationSubpass : vkb::rendering::SubpassC { - VisualizationSubpass(vkb::RenderContext &context, vkb::ShaderSource &&vertex_source, vkb::ShaderSource &&fragment_source); + VisualizationSubpass(vkb::rendering::RenderContextC &context, vkb::ShaderSource &&vertex_source, vkb::ShaderSource &&fragment_source); virtual void prepare() override; - virtual void draw(vkb::CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; vkb::PipelineLayout *layout{nullptr}; const vkb::core::ImageView *view{nullptr}; diff --git a/samples/performance/16bit_arithmetic/CMakeLists.txt b/samples/performance/16bit_arithmetic/CMakeLists.txt index af953c4b02..d62fafb49f 100644 --- a/samples/performance/16bit_arithmetic/CMakeLists.txt +++ b/samples/performance/16bit_arithmetic/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2021, Arm Limited and Contributors +# Copyright (c) 2020-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -20,12 +20,15 @@ get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH) get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME) add_sample_with_tags( - ID ${FOLDER_NAME} - CATEGORY ${CATEGORY_NAME} - AUTHOR "Hans-Kristian Arntzen" - NAME "16-bit arithmetic" - DESCRIPTION "Using VK_KHR_shader_float16_int8 to improve arithmetic throughput." - SHADER_FILES_GLSL - "16bit_arithmetic/visualize.vert" - "16bit_arithmetic/visualize.frag" - "16bit_arithmetic/compute_buffer.comp") + ID ${FOLDER_NAME} + CATEGORY ${CATEGORY_NAME} + AUTHOR "Hans-Kristian Arntzen" + NAME "16-bit arithmetic" + DESCRIPTION "Using VK_KHR_shader_float16_int8 to improve arithmetic throughput." + SHADER_FILES_GLSL + "16bit_arithmetic/visualize.vert" + "16bit_arithmetic/visualize.frag" + "16bit_arithmetic/compute_buffer.comp" + "16bit_arithmetic/compute_buffer_fp16.comp" + "16bit_arithmetic/compute_buffer_fp16_fallback.comp" + ) \ No newline at end of file diff --git a/samples/performance/16bit_storage_input_output/16bit_storage_input_output.cpp b/samples/performance/16bit_storage_input_output/16bit_storage_input_output.cpp index 37eebbb5eb..2d83b7ab77 100644 --- a/samples/performance/16bit_storage_input_output/16bit_storage_input_output.cpp +++ b/samples/performance/16bit_storage_input_output/16bit_storage_input_output.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -119,7 +119,7 @@ void KHR16BitStorageInputOutputSample::setup_scene() continue; } - auto node = std::make_unique(-1, "Teapot"); + auto node = std::make_unique(-1, "Teapot"); node->set_component(*teapot_mesh); teapot_mesh->add_node(*node); @@ -148,13 +148,13 @@ void KHR16BitStorageInputOutputSample::update_pipeline() const std::string base_path = "16bit_storage_input_output/"; if (khr_16bit_storage_input_output_enabled && supports_16bit_storage) { - vertex_path = "16bit_storage_input_output_enabled.vert"; - fragment_path = "16bit_storage_input_output_enabled.frag"; + vertex_path = "16bit_storage_input_output_enabled.vert.spv"; + fragment_path = "16bit_storage_input_output_enabled.frag.spv"; } else { - vertex_path = "16bit_storage_input_output_disabled.vert"; - fragment_path = "16bit_storage_input_output_disabled.frag"; + vertex_path = "16bit_storage_input_output_disabled.vert.spv"; + fragment_path = "16bit_storage_input_output_disabled.frag.spv"; } vkb::ShaderSource vert_shader(base_path + vertex_path); @@ -192,9 +192,9 @@ bool KHR16BitStorageInputOutputSample::prepare(const vkb::ApplicationOptions &op return true; } -void KHR16BitStorageInputOutputSample::request_gpu_features(vkb::PhysicalDevice &gpu) +void KHR16BitStorageInputOutputSample::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { - REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevice16BitStorageFeatures, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, storageInputOutput16); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevice16BitStorageFeatures, storageInputOutput16); } void KHR16BitStorageInputOutputSample::update(float delta_time) diff --git a/samples/performance/16bit_storage_input_output/16bit_storage_input_output.h b/samples/performance/16bit_storage_input_output/16bit_storage_input_output.h index 03a9125cb8..7817da17e5 100644 --- a/samples/performance/16bit_storage_input_output/16bit_storage_input_output.h +++ b/samples/performance/16bit_storage_input_output/16bit_storage_input_output.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -33,7 +33,7 @@ class KHR16BitStorageInputOutputSample : public vkb::VulkanSampleC virtual void update(float delta_time) override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; private: vkb::sg::Camera *camera{nullptr}; diff --git a/samples/performance/README.adoc b/samples/performance/README.adoc index fb97ea964e..5436959b53 100644 --- a/samples/performance/README.adoc +++ b/samples/performance/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2024, The Khronos Group +- Copyright (c) 2021-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -105,7 +105,7 @@ This sample will look in detail at the implementation and performance implicatio Vulkan render-passes use attachments to describe input and output render targets. This sample shows how loading and storing attachments might affect performance on mobile. During the creation of a render-pass, you can specify various color attachments and a depth-stencil attachment. -Each of those is described by a https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentDescription.html[`VkAttachmentDescription`] struct, which contains attributes to specify the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentLoadOp.html[load operation] (`loadOp`) and the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentStoreOp.html[store operation] (`storeOp`). +Each of those is described by a https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentDescription.html[`VkAttachmentDescription`] struct, which contains attributes to specify the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentLoadOp.html[load operation] (`loadOp`) and the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentStoreOp.html[store operation] (`storeOp`). This sample lets you choose between different combinations of these operations at runtime. === xref:./{performance_samplespath}specialization_constants/README.adoc[Specialization constants] diff --git a/samples/performance/afbc/afbc.cpp b/samples/performance/afbc/afbc.cpp index a4ab46214c..f17fadf0f7 100644 --- a/samples/performance/afbc/afbc.cpp +++ b/samples/performance/afbc/afbc.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -60,8 +60,8 @@ bool AFBCSample::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); @@ -121,7 +121,7 @@ void AFBCSample::draw_gui() /* body = */ [this]() { ImGui::Checkbox("Enable AFBC", &afbc_enabled); - if (get_device().is_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) + if (get_device().is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) { ImGui::SameLine(); ImGui::Text("(%s)", vkb::image_compression_flags_to_string(get_render_context().get_swapchain().get_applied_compression()).c_str()); diff --git a/samples/performance/async_compute/CMakeLists.txt b/samples/performance/async_compute/CMakeLists.txt index a3453bd954..8307387e74 100644 --- a/samples/performance/async_compute/CMakeLists.txt +++ b/samples/performance/async_compute/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Arm Limited and Contributors +# Copyright (c) 2021-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -26,9 +26,12 @@ add_sample_with_tags( NAME "Async compute" DESCRIPTION "Using multiple queues to achieve more parallelism on the GPU." SHADER_FILES_GLSL + "async_compute/blur_down.comp" + "async_compute/blur_up.comp" "async_compute/forward.vert" "async_compute/forward.frag" "async_compute/shadow.vert" "async_compute/shadow.frag" "async_compute/composite.vert" - "async_compute/composite.frag") + "async_compute/composite.frag" + "async_compute/threshold.comp") diff --git a/samples/performance/async_compute/async_compute.cpp b/samples/performance/async_compute/async_compute.cpp index f211a01047..c87597a862 100644 --- a/samples/performance/async_compute/async_compute.cpp +++ b/samples/performance/async_compute/async_compute.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -38,12 +38,11 @@ AsyncComputeSample::AsyncComputeSample() config.insert(1, double_buffer_hdr_frames, true); } -void AsyncComputeSample::request_gpu_features(vkb::PhysicalDevice &gpu) +void AsyncComputeSample::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { #ifdef VKB_ENABLE_PORTABILITY // Since sampler_info.compareEnable = VK_TRUE, must enable the mutableComparisonSamplers feature of VK_KHR_portability_subset - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDevicePortabilitySubsetFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, mutableComparisonSamplers); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevicePortabilitySubsetFeaturesKHR, mutableComparisonSamplers); #endif } @@ -191,10 +190,11 @@ void AsyncComputeSample::setup_queues() if (async_enabled) { - uint32_t graphics_family_index = get_device().get_queue_family_index(VK_QUEUE_GRAPHICS_BIT); - uint32_t compute_family_index = get_device().get_queue_family_index(VK_QUEUE_COMPUTE_BIT); + const auto &queue_family_properties = get_device().get_gpu().get_queue_family_properties(); + uint32_t graphics_family_index = vkb::get_queue_family_index(queue_family_properties, VK_QUEUE_GRAPHICS_BIT); + uint32_t compute_family_index = vkb::get_queue_family_index(queue_family_properties, VK_QUEUE_COMPUTE_BIT); - if (get_device().get_num_queues_for_queue_family(graphics_family_index) >= 2) + if (queue_family_properties[graphics_family_index].queueCount >= 2) { LOGI("Device has 2 or more graphics queues."); early_graphics_queue = &get_device().get_queue(graphics_family_index, 1); @@ -252,9 +252,9 @@ bool AsyncComputeSample::prepare(const vkb::ApplicationOptions &options) // Hardcoded to fit to the scene. auto ortho_camera = std::make_unique("shadow_camera", - -2000, 3000, - -2500, 1500, - -2000, 2000); + -2000.0f, 3000.0f, + -2500.0f, 1500.0f, + -2000.0f, 2000.0f); ortho_camera->set_node(*node); get_scene().add_component(std::move(ortho_camera), *node); @@ -265,22 +265,20 @@ bool AsyncComputeSample::prepare(const vkb::ApplicationOptions &options) prepare_render_targets(); - vkb::ShaderSource vert_shader("async_compute/forward.vert"); - vkb::ShaderSource frag_shader("async_compute/forward.frag"); - auto scene_subpass = std::make_unique(get_render_context(), - std::move(vert_shader), std::move(frag_shader), - get_scene(), *camera, - *shadow_camera); - - vkb::ShaderSource shadow_vert_shader("async_compute/shadow.vert"); - vkb::ShaderSource shadow_frag_shader("async_compute/shadow.frag"); - auto shadow_scene_subpass = std::make_unique(get_render_context(), - std::move(shadow_vert_shader), std::move(shadow_frag_shader), - get_scene(), *shadow_camera); + vkb::ShaderSource vert_shader("async_compute/forward.vert.spv"); + vkb::ShaderSource frag_shader("async_compute/forward.frag.spv"); + auto scene_subpass = + std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera, *shadow_camera); + + vkb::ShaderSource shadow_vert_shader("async_compute/shadow.vert.spv"); + vkb::ShaderSource shadow_frag_shader("async_compute/shadow.frag.spv"); + auto shadow_scene_subpass = + std::make_unique(get_render_context(), std::move(shadow_vert_shader), std::move(shadow_frag_shader), get_scene(), *shadow_camera); shadow_render_pipeline.add_subpass(std::move(shadow_scene_subpass)); + shadow_render_pipeline.set_load_store({{VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE}}); - vkb::ShaderSource composite_vert_shader("async_compute/composite.vert"); - vkb::ShaderSource composite_frag_shader("async_compute/composite.frag"); + vkb::ShaderSource composite_vert_shader("async_compute/composite.vert.spv"); + vkb::ShaderSource composite_frag_shader("async_compute/composite.frag.spv"); auto composite_scene_subpass = std::make_unique(get_render_context(), std::move(composite_vert_shader), std::move(composite_frag_shader)); @@ -311,11 +309,11 @@ bool AsyncComputeSample::prepare(const vkb::ApplicationOptions &options) start_time = std::chrono::system_clock::now(); auto &threshold_module = get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, - vkb::ShaderSource("async_compute/threshold.comp")); + vkb::ShaderSource("async_compute/threshold.comp.spv")); auto &blur_up_module = get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, - vkb::ShaderSource("async_compute/blur_up.comp")); + vkb::ShaderSource("async_compute/blur_up.comp.spv")); auto &blur_down_module = get_device().get_resource_cache().request_shader_module(VK_SHADER_STAGE_COMPUTE_BIT, - vkb::ShaderSource("async_compute/blur_down.comp")); + vkb::ShaderSource("async_compute/blur_down.comp.spv")); threshold_pipeline = &get_device().get_resource_cache().request_pipeline_layout({&threshold_module}); blur_up_pipeline = &get_device().get_resource_cache().request_pipeline_layout({&blur_up_module}); blur_down_pipeline = &get_device().get_resource_cache().request_pipeline_layout({&blur_down_module}); @@ -328,9 +326,9 @@ bool AsyncComputeSample::prepare(const vkb::ApplicationOptions &options) void AsyncComputeSample::render_shadow_pass() { auto &queue = *early_graphics_queue; - auto &command_buffer = get_render_context().get_active_frame().request_command_buffer(queue); - command_buffer.set_debug_name("shadow_pass"); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + auto command_buffer = get_render_context().get_active_frame().get_command_pool(queue).request_command_buffer(); + command_buffer->set_debug_name("shadow_pass"); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); auto &views = shadow_render_target->get_views(); assert(!views.empty()); @@ -344,27 +342,28 @@ void AsyncComputeSample::render_shadow_pass() memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - command_buffer.image_memory_barrier(views[0], memory_barrier); + command_buffer->image_memory_barrier(views[0], memory_barrier); } - set_viewport_and_scissor(command_buffer, shadow_render_target->get_extent()); - shadow_render_pipeline.draw(command_buffer, *shadow_render_target, VK_SUBPASS_CONTENTS_INLINE); - command_buffer.end_render_pass(); + set_viewport_and_scissor(*command_buffer, shadow_render_target->get_extent()); + shadow_render_pipeline.draw(*command_buffer, *shadow_render_target, VK_SUBPASS_CONTENTS_INLINE); + command_buffer->end_render_pass(); { vkb::ImageMemoryBarrier memory_barrier{}; memory_barrier.old_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; memory_barrier.src_access_mask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + memory_barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT; memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - command_buffer.image_memory_barrier(views[0], memory_barrier); + command_buffer->image_memory_barrier(views[0], memory_barrier); } - command_buffer.end(); + command_buffer->end(); - get_render_context().submit(queue, {&command_buffer}); + get_render_context().submit(queue, {command_buffer}); } vkb::RenderTarget &AsyncComputeSample::get_current_forward_render_target() @@ -375,15 +374,22 @@ vkb::RenderTarget &AsyncComputeSample::get_current_forward_render_target() VkSemaphore AsyncComputeSample::render_forward_offscreen_pass(VkSemaphore hdr_wait_semaphore) { auto &queue = *early_graphics_queue; - auto &command_buffer = get_render_context().get_active_frame().request_command_buffer(queue); - command_buffer.set_debug_name("forward_offscreen_pass"); + auto command_buffer = get_render_context().get_active_frame().get_command_pool(queue).request_command_buffer(); + command_buffer->set_debug_name("forward_offscreen_pass"); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); auto &views = get_current_forward_render_target().get_views(); assert(1 < views.size()); { + // If maintenance9 is not enabled, resources with VK_SHARING_MODE_EXCLUSIVE must only be accessed by queues in the queue family that has ownership of the resource. + // Upon creation resources with VK_SHARING_MODE_EXCLUSIVE are not owned by any queue, ownership is implicitly acquired upon first use. + // The application must perform a queue family ownership transfer if it wishes to make the memory contents of the resource accessible to a different queue family. + // A queue family can take ownership of a resource without an ownership transfer, in the same way as for a resource that was just created, but the content will be undefined. + // We do not need to acquire color_targets[0] from present_graphics to early_graphics + // A queue transfer barrier is not necessary for the resource first access. + // Moreover, in our sample we do not care about the content at this point so we can skip the queue transfer barrier. vkb::ImageMemoryBarrier memory_barrier{}; memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; memory_barrier.new_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; @@ -392,7 +398,7 @@ VkSemaphore AsyncComputeSample::render_forward_offscreen_pass(VkSemaphore hdr_wa memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - command_buffer.image_memory_barrier(views[0], memory_barrier); + command_buffer->image_memory_barrier(views[0], memory_barrier); } { @@ -404,43 +410,48 @@ VkSemaphore AsyncComputeSample::render_forward_offscreen_pass(VkSemaphore hdr_wa memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - command_buffer.image_memory_barrier(views[1], memory_barrier); + command_buffer->image_memory_barrier(views[1], memory_barrier); } - set_viewport_and_scissor(command_buffer, get_current_forward_render_target().get_extent()); - forward_render_pipeline.draw(command_buffer, get_current_forward_render_target(), VK_SUBPASS_CONTENTS_INLINE); - command_buffer.end_render_pass(); + set_viewport_and_scissor(*command_buffer, get_current_forward_render_target().get_extent()); + forward_render_pipeline.draw(*command_buffer, get_current_forward_render_target(), VK_SUBPASS_CONTENTS_INLINE); + command_buffer->end_render_pass(); + const bool queue_family_transfer = early_graphics_queue->get_family_index() != post_compute_queue->get_family_index(); { - vkb::ImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.src_access_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - memory_barrier.dst_access_mask = 0; - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - - // In a release barrier, dst_stage_mask/access_mask should be BOTTOM_OF_PIPE/0. - // We cannot access the resource anymore after all. Semaphore takes care of things from here. - - // Release barrier if we're going to read HDR texture in compute queue - // of a different queue family index. We'll have to duplicate this barrier - // on compute queue's end. - if (early_graphics_queue->get_family_index() != post_compute_queue->get_family_index()) - { - memory_barrier.old_queue_family = early_graphics_queue->get_family_index(); - memory_barrier.new_queue_family = post_compute_queue->get_family_index(); - } - - command_buffer.image_memory_barrier(views[0], memory_barrier); + // When doing async compute this barrier is used to do a queue family ownership transfer + + // release_barrier_0: Releasing color_targets[0] from early_graphics to post_compute + // This release barrier is replicated by the corresponding acquire_barrier_0 in the post_compute queue + // The application must ensure the release operation happens before the acquire operation. This sample uses semaphores for that. + // The transfer ownership barriers are submitted twice (release and acquire) but they are only executed once. + vkb::ImageMemoryBarrier memory_barrier{ + .src_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dst_stage_mask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // Ignored for the release barrier. + // Release barriers ignore dst_access_mask unless using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + .src_access_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dst_access_mask = 0, // dst_access_mask is ignored for release barriers, without affecting its validity + .old_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // We want a layout transition, so the old_layout and new_layout values need to be replicated in the acquire barrier + .new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + .src_queue_family = queue_family_transfer ? + early_graphics_queue->get_family_index() : + VK_QUEUE_FAMILY_IGNORED, // Release barriers are executed from a queue of the source queue family + .dst_queue_family = queue_family_transfer ? post_compute_queue->get_family_index() : VK_QUEUE_FAMILY_IGNORED, + }; + + command_buffer->image_memory_barrier(views[0], memory_barrier); } - command_buffer.end(); + command_buffer->end(); // Conditionally waits on hdr_wait_semaphore. // This resolves the write-after-read hazard where previous frame tonemap read from HDR buffer. - auto signal_semaphore = get_render_context().submit(queue, {&command_buffer}, - hdr_wait_semaphore, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); + + // We are not using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + // so VK_PIPELINE_STAGE_ALL_COMMANDS_BIT is the only valid stage to wait for queue transfer operations. + const VkPipelineStageFlags wait_stage = queue_family_transfer ? VK_PIPELINE_STAGE_ALL_COMMANDS_BIT : VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + + auto signal_semaphore = get_render_context().submit(queue, {command_buffer}, hdr_wait_semaphore, wait_stage); if (hdr_wait_semaphore) { @@ -453,30 +464,61 @@ VkSemaphore AsyncComputeSample::render_forward_offscreen_pass(VkSemaphore hdr_wa VkSemaphore AsyncComputeSample::render_swapchain(VkSemaphore post_semaphore) { auto &queue = *present_graphics_queue; - auto &command_buffer = get_render_context().get_active_frame().request_command_buffer(queue); - command_buffer.set_debug_name("swapchain"); + auto command_buffer = get_render_context().get_active_frame().get_command_pool(queue).request_command_buffer(); + command_buffer->set_debug_name("swapchain"); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); if (post_compute_queue->get_family_index() != present_graphics_queue->get_family_index()) { - // Purely ownership transfer here. No layout change required. - vkb::ImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.src_access_mask = 0; - memory_barrier.dst_access_mask = 0; - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - memory_barrier.old_queue_family = post_compute_queue->get_family_index(); - memory_barrier.new_queue_family = present_graphics_queue->get_family_index(); - - command_buffer.image_memory_barrier(get_current_forward_render_target().get_views()[0], memory_barrier); + // acquire_barrier_1: Acquiring color_targets[0] from post_compute to present_graphics + // This acquire barrier is replicated by the corresponding release_barrier_1 in the post_compute queue + // The application must ensure the acquire operation happens after the release operation. This sample uses semaphores for that. + // The transfer ownership barriers are submitted twice (release and acquire) but they are only executed once. + vkb::ImageMemoryBarrier memory_barrier{ + .src_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // Ignored for the acquire barrier. + // Acquire barriers ignore src_access_mask unless using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + .dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .src_access_mask = 0, // src_access_mask is ignored for acquire barriers, without affecting its validity + .dst_access_mask = VK_ACCESS_SHADER_READ_BIT, + .old_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // Purely ownership transfer. We do not need a layout transition. + .new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + .src_queue_family = post_compute_queue->get_family_index(), + .dst_queue_family = present_graphics_queue->get_family_index(), // Acquire barriers are executed from a queue of the destination queue family + }; + + command_buffer->image_memory_barrier(get_current_forward_render_target().get_views()[0], memory_barrier); + + // acquire_barrier_2: Acquiring blur_chain_views[1] from post_compute to present_graphics + // This acquire barrier is replicated by the corresponding release_barrier_2 in the post_compute queue + // The application must ensure the acquire operation happens after the release operation. This sample uses semaphores for that. + // The transfer ownership barriers are submitted twice (release and acquire) but they are only executed once. + vkb::ImageMemoryBarrier memory_barrier_2{ + .src_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // Ignored for the acquire barrier. + // Acquire barriers ignore src_access_mask unless using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + .dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .src_access_mask = 0, // src_access_mask is ignored for acquire barriers, without affecting its validity + .dst_access_mask = VK_ACCESS_SHADER_READ_BIT, + .old_layout = VK_IMAGE_LAYOUT_GENERAL, // We want a layout transition, so the old_layout and new_layout values need to be replicated in the acquire barrier + .new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + .src_queue_family = post_compute_queue->get_family_index(), + .dst_queue_family = present_graphics_queue->get_family_index(), // Acquire barriers are executed from a queue of the destination queue family + + }; + command_buffer->image_memory_barrier(*blur_chain_views[1], memory_barrier_2); } - draw(command_buffer, get_render_context().get_active_frame().get_render_target()); + draw(*command_buffer, get_render_context().get_active_frame().get_render_target()); + + // If maintenance9 is not enabled, resources with VK_SHARING_MODE_EXCLUSIVE must only be accessed by queues in the queue family that has ownership of the resource. + // Upon creation resources with VK_SHARING_MODE_EXCLUSIVE are not owned by any queue, ownership is implicitly acquired upon first use. + // The application must perform a queue family ownership transfer if it wishes to make the memory contents of the resource accessible to a different queue family. + // A queue family can take ownership of a resource without an ownership transfer, in the same way as for a resource that was just created, but the content will be undefined. + // We do not need to release blur_chain_views[1] and color_targets[0] from present_graphics + // A queue transfer barrier is not necessary for the resource first access. + // Moreover, in our sample we do not care about the content after presenting so we can skip the queue transfer barrier. - command_buffer.end(); + command_buffer->end(); // We're going to wait on this semaphore in different frame, // so we need to hold ownership of the semaphore until we complete the wait. @@ -511,9 +553,9 @@ VkSemaphore AsyncComputeSample::render_swapchain(VkSemaphore post_semaphore) info.waitSemaphoreCount = 2; info.pWaitDstStageMask = wait_stages; info.commandBufferCount = 1; - info.pCommandBuffers = &command_buffer.get_handle(); + info.pCommandBuffers = &command_buffer->get_handle(); - queue.submit({info}, get_render_context().get_active_frame().request_fence()); + queue.submit({info}, get_render_context().get_active_frame().get_fence_pool().request_fence()); get_render_context().release_owned_semaphore(wait_semaphores[1]); return signal_semaphores[0]; } @@ -521,31 +563,39 @@ VkSemaphore AsyncComputeSample::render_swapchain(VkSemaphore post_semaphore) VkSemaphore AsyncComputeSample::render_compute_post(VkSemaphore wait_graphics_semaphore, VkSemaphore wait_present_semaphore) { auto &queue = *post_compute_queue; - auto &command_buffer = get_render_context().get_active_frame().request_command_buffer(queue); - command_buffer.set_debug_name("compute_post"); + auto command_buffer = get_render_context().get_active_frame().get_command_pool(queue).request_command_buffer(); + command_buffer->set_debug_name("compute_post"); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - // Acquire barrier if we're going to read HDR texture in compute queue - // of a different queue family index. We'll have to duplicate this barrier - // on compute queue's end. if (early_graphics_queue->get_family_index() != post_compute_queue->get_family_index()) { - vkb::ImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.src_access_mask = 0; - memory_barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT; - // Match pWaitDstStages for src stage here. - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - memory_barrier.old_queue_family = early_graphics_queue->get_family_index(); - memory_barrier.new_queue_family = post_compute_queue->get_family_index(); - - command_buffer.image_memory_barrier(get_current_forward_render_target().get_views()[0], memory_barrier); + // acquire_barrier_0: Acquiring color_targets[0] from early_graphics to post_compute + // This acquire barrier is replicated by the corresponding release_barrier_0 in the early_graphics queue + // The application must ensure the acquire operation happens after the release operation. This sample uses semaphores for that. + // The transfer ownership barriers are submitted twice (release and acquire) but they are only executed once. + vkb::ImageMemoryBarrier memory_barrier{ + .src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // Ignored for the acquire barrier. + // Acquire barriers ignore src_access_mask unless using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + .dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + .src_access_mask = 0, // src_access_mask is ignored for acquire barriers, without affecting its validity + .dst_access_mask = VK_ACCESS_SHADER_READ_BIT, + .old_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // We want a layout transition, so the old_layout and new_layout values need to be replicated in the release barrier + .new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + .src_queue_family = early_graphics_queue->get_family_index(), + .dst_queue_family = post_compute_queue->get_family_index(), // Acquire barriers are executed from a queue of the destination queue family + }; + command_buffer->image_memory_barrier(get_current_forward_render_target().get_views()[0], memory_barrier); } const auto discard_blur_view = [&](const vkb::core::ImageView &view) { + // If maintenance9 is not enabled, resources with VK_SHARING_MODE_EXCLUSIVE must only be accessed by queues in the queue family that has ownership of the resource. + // Upon creation resources with VK_SHARING_MODE_EXCLUSIVE are not owned by any queue, ownership is implicitly acquired upon first use. + // The application must perform a queue family ownership transfer if it wishes to make the memory contents of the resource accessible to a different queue family. + // A queue family can take ownership of a resource without an ownership transfer, in the same way as for a resource that was just created, but the content will be undefined. + // We do not need to acquire blur_chain_views[1] from present_graphics to post_compute + // A queue transfer barrier is not necessary for the resource first access. + // Moreover, in our sample we do not care about the content at this point so we can skip the queue transfer barrier. vkb::ImageMemoryBarrier memory_barrier{}; memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -555,20 +605,29 @@ VkSemaphore AsyncComputeSample::render_compute_post(VkSemaphore wait_graphics_se memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - command_buffer.image_memory_barrier(view, memory_barrier); + command_buffer->image_memory_barrier(view, memory_barrier); }; - const auto read_only_blur_view = [&](const vkb::core::ImageView &view, bool final) { - vkb::ImageMemoryBarrier memory_barrier{}; - - memory_barrier.old_layout = VK_IMAGE_LAYOUT_GENERAL; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.src_access_mask = VK_ACCESS_SHADER_WRITE_BIT; - memory_barrier.dst_access_mask = final ? 0 : VK_ACCESS_SHADER_READ_BIT; - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - memory_barrier.dst_stage_mask = final ? VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT : VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - - command_buffer.image_memory_barrier(view, memory_barrier); + const auto read_only_blur_view = [&](const vkb::core::ImageView &view, bool is_final) { + const bool queue_family_transfer = is_final && post_compute_queue->get_family_index() != present_graphics_queue->get_family_index(); + + // release_barrier_2: Releasing blur_chain_views[1] from post_compute to present_graphics + // This release barrier is replicated by the corresponding acquire_barrier_2 in the present_graphics queue + // The application must ensure the release operation happens before the acquire operation. This sample uses semaphores for that. + // The transfer ownership barriers are submitted twice (release and acquire) but they are only executed once. + vkb::ImageMemoryBarrier memory_barrier{ + .src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + .dst_stage_mask = is_final ? VkPipelineStageFlags(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) : VkPipelineStageFlags(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT), // Ignored for the release barrier. + // Release barriers ignore dst_access_mask unless using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + .src_access_mask = VK_ACCESS_SHADER_WRITE_BIT, + .dst_access_mask = is_final ? VkAccessFlags(0) : VkAccessFlags(VK_ACCESS_SHADER_READ_BIT), // dst_access_mask is ignored for release barriers, without affecting its validity + .old_layout = VK_IMAGE_LAYOUT_GENERAL, // We want a layout transition, so the old_layout and new_layout values need to be replicated in the acquire barrier + .new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + .src_queue_family = queue_family_transfer ? post_compute_queue->get_family_index() : VK_QUEUE_FAMILY_IGNORED, // Release barriers are executed from a queue of the source queue family + .dst_queue_family = queue_family_transfer ? present_graphics_queue->get_family_index() : VK_QUEUE_FAMILY_IGNORED, // Release barriers are executed from a queue of the source queue family + }; + + command_buffer->image_memory_barrier(view, memory_barrier); }; struct Push @@ -578,7 +637,7 @@ VkSemaphore AsyncComputeSample::render_compute_post(VkSemaphore wait_graphics_se float inv_input_width, inv_input_height; }; - const auto dispatch_pass = [&](const vkb::core::ImageView &dst, const vkb::core::ImageView &src, bool final = false) { + const auto dispatch_pass = [&](const vkb::core::ImageView &dst, const vkb::core::ImageView &src, bool is_final = false) { discard_blur_view(dst); auto dst_extent = downsample_extent(dst.get_image().get_extent(), dst.get_subresource_range().baseMipLevel); @@ -592,12 +651,12 @@ VkSemaphore AsyncComputeSample::render_compute_post(VkSemaphore wait_graphics_se push.inv_input_width = 1.0f / static_cast(src_extent.width); push.inv_input_height = 1.0f / static_cast(src_extent.height); - command_buffer.push_constants(push); - command_buffer.bind_image(src, *linear_sampler, 0, 0, 0); - command_buffer.bind_image(dst, 0, 1, 0); - command_buffer.dispatch((push.width + 7) / 8, (push.height + 7) / 8, 1); + command_buffer->push_constants(push); + command_buffer->bind_image(src, *linear_sampler, 0, 0, 0); + command_buffer->bind_image(dst, 0, 1, 0); + command_buffer->dispatch((push.width + 7) / 8, (push.height + 7) / 8, 1); - read_only_blur_view(dst, final); + read_only_blur_view(dst, is_final); }; // A very basic and dumb HDR Bloom pipeline. Don't consider this a particularly good or efficient implementation. @@ -605,39 +664,43 @@ VkSemaphore AsyncComputeSample::render_compute_post(VkSemaphore wait_graphics_se // - Threshold pass // - Blur down // - Blur up - command_buffer.bind_pipeline_layout(*threshold_pipeline); + command_buffer->bind_pipeline_layout(*threshold_pipeline); dispatch_pass(*blur_chain_views[0], get_current_forward_render_target().get_views()[0]); - command_buffer.bind_pipeline_layout(*blur_down_pipeline); + command_buffer->bind_pipeline_layout(*blur_down_pipeline); for (uint32_t index = 1; index < blur_chain_views.size(); index++) { dispatch_pass(*blur_chain_views[index], *blur_chain_views[index - 1]); } - command_buffer.bind_pipeline_layout(*blur_up_pipeline); + command_buffer->bind_pipeline_layout(*blur_up_pipeline); for (uint32_t index = static_cast(blur_chain_views.size() - 2); index >= 1; index--) { dispatch_pass(*blur_chain_views[index], *blur_chain_views[index + 1], index == 1); } - // We're going to read the HDR texture again in the present queue. - // Need to release ownership back to that queue. if (post_compute_queue->get_family_index() != present_graphics_queue->get_family_index()) { - vkb::ImageMemoryBarrier memory_barrier{}; - memory_barrier.old_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memory_barrier.src_access_mask = 0; - memory_barrier.dst_access_mask = 0; - memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - memory_barrier.old_queue_family = post_compute_queue->get_family_index(); - memory_barrier.new_queue_family = present_graphics_queue->get_family_index(); - - command_buffer.image_memory_barrier(get_current_forward_render_target().get_views()[0], memory_barrier); + // release_barrier_1: Releasing color_targets[0] from post_compute to present_graphics + // This release barrier is replicated by the corresponding acquire_barrier_1 in the present_graphics queue + // The application must ensure the release operation happens before the acquire operation. This sample uses semaphores for that. + // The transfer ownership barriers are submitted twice (release and acquire) but they are only executed once. + vkb::ImageMemoryBarrier memory_barrier{ + .src_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + .dst_stage_mask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // Ignored for the release barrier. + // Release barriers ignore dst_access_mask unless using VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR + .src_access_mask = VK_ACCESS_SHADER_READ_BIT, + .dst_access_mask = 0, // dst_access_mask is ignored for release barriers, without affecting its validity + .old_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // Purely ownership transfer. We do not need a layout transition. + .new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + .src_queue_family = post_compute_queue->get_family_index(), // Release barriers are executed from a queue of the source queue family + .dst_queue_family = present_graphics_queue->get_family_index(), + }; + + command_buffer->image_memory_barrier(get_current_forward_render_target().get_views()[0], memory_barrier); } - command_buffer.end(); + command_buffer->end(); VkPipelineStageFlags wait_stages[] = {VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT}; VkSemaphore wait_semaphores[] = {wait_graphics_semaphore, wait_present_semaphore}; @@ -650,7 +713,7 @@ VkSemaphore AsyncComputeSample::render_compute_post(VkSemaphore wait_graphics_se info.waitSemaphoreCount = wait_present_semaphore != VK_NULL_HANDLE ? 2 : 1; info.pWaitDstStageMask = wait_stages; info.commandBufferCount = 1; - info.pCommandBuffers = &command_buffer.get_handle(); + info.pCommandBuffers = &command_buffer->get_handle(); if (wait_present_semaphore != VK_NULL_HANDLE) { @@ -686,7 +749,8 @@ void AsyncComputeSample::update(float delta_time) auto *composite_subpass = static_cast(get_render_pipeline().get_subpasses()[0].get()); forward_subpass->set_shadow_map(&shadow_render_target->get_views()[0], comparison_sampler.get()); - composite_subpass->set_texture(&get_current_forward_render_target().get_views()[0], blur_chain_views[1].get(), linear_sampler.get()); + + composite_subpass->set_texture(&get_current_forward_render_target().get_views()[0], blur_chain_views[1].get(), linear_sampler.get()); // blur_chain[1] and color_targets[0] will be used by the present queue float rotation_factor = std::chrono::duration(std::chrono::system_clock::now() - start_time).count(); @@ -761,7 +825,7 @@ std::unique_ptr create_async_compute() return std::make_unique(); } -AsyncComputeSample::DepthMapSubpass::DepthMapSubpass(vkb::RenderContext &render_context, +AsyncComputeSample::DepthMapSubpass::DepthMapSubpass(vkb::rendering::RenderContextC &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene, vkb::sg::Camera &camera) : vkb::ForwardSubpass(render_context, std::move(vertex_shader), std::move(fragment_shader), scene, camera) @@ -770,14 +834,14 @@ AsyncComputeSample::DepthMapSubpass::DepthMapSubpass(vkb::RenderContext &render_ base_rasterization_state.depth_bias_enable = VK_TRUE; } -void AsyncComputeSample::DepthMapSubpass::draw(vkb::CommandBuffer &command_buffer) +void AsyncComputeSample::DepthMapSubpass::draw(vkb::core::CommandBufferC &command_buffer) { // Negative bias since we're using inverted Z. command_buffer.set_depth_bias(-1.0f, 0.0f, -2.0f); vkb::ForwardSubpass::draw(command_buffer); } -AsyncComputeSample::ShadowMapForwardSubpass::ShadowMapForwardSubpass(vkb::RenderContext &render_context, +AsyncComputeSample::ShadowMapForwardSubpass::ShadowMapForwardSubpass(vkb::rendering::RenderContextC &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene, vkb::sg::Camera &camera, vkb::sg::Camera &shadow_camera_) : vkb::ForwardSubpass(render_context, std::move(vertex_shader), std::move(fragment_shader), scene, camera), @@ -791,7 +855,7 @@ void AsyncComputeSample::ShadowMapForwardSubpass::set_shadow_map(const vkb::core shadow_sampler = sampler; } -void AsyncComputeSample::ShadowMapForwardSubpass::draw(vkb::CommandBuffer &command_buffer) +void AsyncComputeSample::ShadowMapForwardSubpass::draw(vkb::core::CommandBufferC &command_buffer) { auto shadow_matrix = vkb::rendering::vulkan_style_projection(shadow_camera.get_projection()) * shadow_camera.get_view(); @@ -810,7 +874,9 @@ void AsyncComputeSample::ShadowMapForwardSubpass::draw(vkb::CommandBuffer &comma vkb::ForwardSubpass::draw(command_buffer); } -AsyncComputeSample::CompositeSubpass::CompositeSubpass(vkb::RenderContext &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader) : +AsyncComputeSample::CompositeSubpass::CompositeSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader) : vkb::rendering::SubpassC(render_context, std::move(vertex_shader), std::move(fragment_shader)) { } @@ -831,7 +897,7 @@ void AsyncComputeSample::CompositeSubpass::prepare() layout = &device.get_resource_cache().request_pipeline_layout({&vertex, &fragment}); } -void AsyncComputeSample::CompositeSubpass::draw(vkb::CommandBuffer &command_buffer) +void AsyncComputeSample::CompositeSubpass::draw(vkb::core::CommandBufferC &command_buffer) { command_buffer.bind_image(*hdr_view, *sampler, 0, 0, 0); command_buffer.bind_image(*bloom_view, *sampler, 0, 1, 0); diff --git a/samples/performance/async_compute/async_compute.h b/samples/performance/async_compute/async_compute.h index eb39091955..4ce2fd766b 100644 --- a/samples/performance/async_compute/async_compute.h +++ b/samples/performance/async_compute/async_compute.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -33,7 +33,7 @@ class AsyncComputeSample : public vkb::VulkanSampleC virtual ~AsyncComputeSample() = default; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual bool prepare(const vkb::ApplicationOptions &options) override; @@ -83,19 +83,24 @@ class AsyncComputeSample : public vkb::VulkanSampleC struct DepthMapSubpass : vkb::ForwardSubpass { - DepthMapSubpass(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, - vkb::sg::Scene &scene, vkb::sg::Camera &camera); - virtual void draw(vkb::CommandBuffer &command_buffer) override; + DepthMapSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera); + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; }; struct ShadowMapForwardSubpass : vkb::ForwardSubpass { - ShadowMapForwardSubpass(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, - vkb::sg::Scene &scene, vkb::sg::Camera &camera, vkb::sg::Camera &shadow_camera); + ShadowMapForwardSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera, + vkb::sg::Camera &shadow_camera); void set_shadow_map(const vkb::core::ImageView *view, const vkb::core::Sampler *sampler); - virtual void draw(vkb::CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; const vkb::core::ImageView *shadow_view{nullptr}; const vkb::core::Sampler *shadow_sampler{nullptr}; @@ -104,11 +109,10 @@ class AsyncComputeSample : public vkb::VulkanSampleC struct CompositeSubpass : vkb::rendering::SubpassC { - CompositeSubpass(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader); + CompositeSubpass(vkb::rendering::RenderContextC &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader); void set_texture(const vkb::core::ImageView *hdr_view, const vkb::core::ImageView *bloom_view, const vkb::core::Sampler *sampler); - virtual void draw(vkb::CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; virtual void prepare() override; const vkb::core::ImageView *hdr_view{nullptr}; diff --git a/samples/performance/command_buffer_usage/README.adoc b/samples/performance/command_buffer_usage/README.adoc index e3cd0e5020..cf27203566 100644 --- a/samples/performance/command_buffer_usage/README.adoc +++ b/samples/performance/command_buffer_usage/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -35,12 +35,12 @@ This way they can all be submitted to the same render pass, and can take advanta == Secondary command buffers -Secondary command buffers can inherit the render pass state from a primary command buffer using a https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandBufferInheritanceInfo.html[VkCommandBufferInheritanceInfo] structure which is passed to https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkBeginCommandBuffer.html[vkBeginCommandBuffer] as part of https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandBufferBeginInfo.html[VkCommandBufferBeginInfo], along with the flag `VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT`. +Secondary command buffers can inherit the render pass state from a primary command buffer using a https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandBufferInheritanceInfo.html[VkCommandBufferInheritanceInfo] structure which is passed to https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkBeginCommandBuffer.html[vkBeginCommandBuffer] as part of https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandBufferBeginInfo.html[VkCommandBufferBeginInfo], along with the flag `VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT`. Secondary command buffers may then be recorded concurrently. -The primary command buffer must have used the flag `VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS` in https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdBeginRenderPass.html[vkCmdBeginRenderPass]. +The primary command buffer must have used the flag `VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS` in https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdBeginRenderPass.html[vkCmdBeginRenderPass]. -Finally, the primary command buffer records https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdExecuteCommands.html[vkCmdExecuteCommands] (before https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdEndRenderPass.html[vkCmdEndRenderPass]) with an array of recorded secondary command buffers to execute. +Finally, the primary command buffer records https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdExecuteCommands.html[vkCmdExecuteCommands] (before https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdEndRenderPass.html[vkCmdEndRenderPass]) with an array of recorded secondary command buffers to execute. The sample divides the draw calls for opaque objects based on the slider value. It then submits a separate buffer for transparent objects if any, and finally one for the GUI elements if visible. @@ -49,8 +49,8 @@ It then submits a separate buffer for transparent objects if any, and finally on To record command buffers concurrently, the framework needs to manage resource pools per frame and per thread. According to the Vulkan Spec: -* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandPool.html[_A command pool must not be used concurrently in multiple threads._] -* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDescriptorPool.html[_The application must not allocate and/or free descriptor sets from the same pool in multiple threads simultaneously._] +* https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandPool.html[_A command pool must not be used concurrently in multiple threads._] +* https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkDescriptorPool.html[_The application must not allocate and/or free descriptor sets from the same pool in multiple threads simultaneously._] In the framework, each frame in the queue (e.g. three frames in case of triple buffering) manages a collection of pools so that each thread can own: @@ -95,12 +95,12 @@ This sample compares them and demonstrates the best approach. === Allocate and free -Command buffers are allocated from a command pool with https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkAllocateCommandBuffers.html[vkAllocateCommandBuffers]. +Command buffers are allocated from a command pool with https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkAllocateCommandBuffers.html[vkAllocateCommandBuffers]. They can then be recorded and submitted to a queue for the Vulkan device to execute them. -A possible approach to managing the command buffers for each frame in our application would be to free them once they are executed, using https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkFreeCommandBuffers.html[vkFreeCommandBuffers]. +A possible approach to managing the command buffers for each frame in our application would be to free them once they are executed, using https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkFreeCommandBuffers.html[vkFreeCommandBuffers]. -The command pool will not automatically recycle memory from deleted command buffers if the command pool was created without the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] flag. +The command pool will not automatically recycle memory from deleted command buffers if the command pool was created without the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] flag. This flag however will force separate internal allocators to be used for each command buffer in the pool, which can increase CPU overhead compared to a single pool reset. This is the worst-performing method of managing command buffers as it involves a significant CPU overhead for allocating and freeing memory frequently. @@ -109,23 +109,23 @@ The sample shows how to use the framework to follow this approach and profile it image::./images/allocate_and_free.jpg[Allocate and Free] Rather than freeing and re-allocating the memory used by a command buffer, it is more efficient to recycle it for recording new commands. -There are two ways of resetting a command buffer: individually, with https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer], or indirectly by resetting the command pool with https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandPool.html[vkResetCommandPool]. +There are two ways of resetting a command buffer: individually, with https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer], or indirectly by resetting the command pool with https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandPool.html[vkResetCommandPool]. === Resetting individual command buffers -In order to reset command buffers individually with https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer], the pool must have been created with the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] flag set. +In order to reset command buffers individually with https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer], the pool must have been created with the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] flag set. The buffer will then return to a recordable state and the command pool can reuse the memory it allocated for it. -However frequent calls to https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer] are more expensive than a command pool reset. +However frequent calls to https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer] are more expensive than a command pool reset. image::./images/reset_buffers.jpg[Reset Buffers] === Resetting the command pool -Resetting the pool with https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandPool.html[vkResetCommandPool] automatically resets all the command buffers allocated by it. +Resetting the pool with https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandPool.html[vkResetCommandPool] automatically resets all the command buffers allocated by it. Doing this periodically will allow the pool to reuse the memory allocated for command buffers with lower CPU overhead. -To reset the pool the flag https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] is _not_ required, and it is actually better to avoid it since it prevents it from using a single large allocator for all buffers in the pool thus increasing memory overhead. +To reset the pool the flag https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] is _not_ required, and it is actually better to avoid it since it prevents it from using a single large allocator for all buffers in the pool thus increasing memory overhead. image::./images/reset_pool.jpg[Reset Pool] @@ -137,9 +137,9 @@ However the number of secondary command buffers should be kept low since their i This sample lets the user adjust the number of command buffers. Using a high number of secondary command buffers causes the application to become CPU bound and makes the differences between the described memory allocation approaches more pronounced. -All command buffers in this sample are initialized with the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandBufferUsageFlagBits.html[ONE_TIME_SUBMIT_BIT] flag set. +All command buffers in this sample are initialized with the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandBufferUsageFlagBits.html[ONE_TIME_SUBMIT_BIT] flag set. This indicates to the driver that the buffer will not be re-submitted after execution, and allows it to optimize accordingly. -Performance may be reduced if the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandBufferUsageFlagBits.html[SIMULTANEOUS_USE_BIT] flag is set instead. +Performance may be reduced if the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandBufferUsageFlagBits.html[SIMULTANEOUS_USE_BIT] flag is set instead. This sample provides options to try the three different approaches to command buffer management described above and monitor their efficiency. This is relatively obvious directly on the device by monitoring frame time. @@ -178,7 +178,7 @@ In this application the differences between individual reset and pool reset are == Further reading * xref:samples/performance/multithreading_render_passes/README.adoc[Multi-threaded recording with multiple render passes] -* https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/chap6.html#commandbuffer-allocation[Command Buffer Allocation and Management] +* https://www.khronos.org/registry/vulkan/specs/latest/html/chap6.html#commandbuffer-allocation[Command Buffer Allocation and Management] * https://www.khronos.org/registry/vulkan/specs/1.0-wsi_extensions/html/chap5.html#commandbuffers-lifecycle[Command Buffer Lifecycle] * _"Writing an efficient Vulkan renderer"_ by Arseny Kapoulkine (from "GPU Zen 2: Advanced Rendering Techniques") @@ -188,14 +188,14 @@ In this application the differences between individual reset and pool reset are * Use secondary command buffers to allow multi-threaded render pass construction. * Minimize the number of secondary command buffer invocations used per frame. -* Set https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandBufferUsageFlagBits.html[ONE_TIME_SUBMIT_BIT] if you are not going to reuse the command buffer. -* Periodically call https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandPool.html[vkResetCommandPool()] to release the memory if you are not reusing command buffers. +* Set https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandBufferUsageFlagBits.html[ONE_TIME_SUBMIT_BIT] if you are not going to reuse the command buffer. +* Periodically call https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandPool.html[vkResetCommandPool()] to release the memory if you are not reusing command buffers. *Don't* -* Set https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] if you only need to free the whole pool. +* Set https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandPoolCreateFlagBits.html[RESET_COMMAND_BUFFER_BIT] if you only need to free the whole pool. If the bit is not set, some implementations might use a single large allocator for the pool, reducing memory management overhead. -* Call https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer()] on a high frequency call path. +* Call https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer()] on a high frequency call path. *Impact* @@ -206,5 +206,5 @@ If the bit is not set, some implementations might use a single large allocator f *Debugging* -* Evaluate every use of any command buffer flag other than https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkCommandBufferUsageFlagBits.html[ONE_TIME_SUBMIT_BIT], and review whether it's a necessary use of the flag combination. -* Evaluate every use of https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer()] and see if it could be replaced with https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetCommandPool.html[vkResetCommandPool()] instead. +* Evaluate every use of any command buffer flag other than https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkCommandBufferUsageFlagBits.html[ONE_TIME_SUBMIT_BIT], and review whether it's a necessary use of the flag combination. +* Evaluate every use of https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandBuffer.html[vkResetCommandBuffer()] and see if it could be replaced with https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetCommandPool.html[vkResetCommandPool()] instead. diff --git a/samples/performance/command_buffer_usage/command_buffer_usage.cpp b/samples/performance/command_buffer_usage/command_buffer_usage.cpp index bd49cbe77f..9088849937 100644 --- a/samples/performance/command_buffer_usage/command_buffer_usage.cpp +++ b/samples/performance/command_buffer_usage/command_buffer_usage.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -20,6 +20,7 @@ #include #include +#include "core/debug.h" #include "core/device.h" #include "core/pipeline_layout.h" #include "core/shader_module.h" @@ -37,15 +38,15 @@ CommandBufferUsage::CommandBufferUsage() config.insert(0, gui_multi_threading, false); config.insert(0, gui_command_buffer_reset_mode, 0); - config.insert(1, gui_secondary_cmd_buf_count, 2); + config.insert(1, gui_secondary_cmd_buf_count, 8); config.insert(1, gui_multi_threading, true); config.insert(1, gui_command_buffer_reset_mode, 0); - config.insert(2, gui_secondary_cmd_buf_count, 2); + config.insert(2, gui_secondary_cmd_buf_count, 16); config.insert(2, gui_multi_threading, true); config.insert(2, gui_command_buffer_reset_mode, 1); - config.insert(3, gui_secondary_cmd_buf_count, 2); + config.insert(3, gui_secondary_cmd_buf_count, 32); config.insert(3, gui_multi_threading, true); config.insert(3, gui_command_buffer_reset_mode, 2); } @@ -62,8 +63,8 @@ bool CommandBufferUsage::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = dynamic_cast(&camera_node.get_component()); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); @@ -116,7 +117,7 @@ void CommandBufferUsage::update(float delta_time) // If there are not enough command buffers to keep all threads busy, use fewer threads subpass_state.thread_count = std::min(subpass_state.secondary_cmd_buf_count, max_thread_count); - subpass_state.command_buffer_reset_mode = static_cast(gui_command_buffer_reset_mode); + subpass_state.command_buffer_reset_mode = static_cast(gui_command_buffer_reset_mode); subpass_state.multi_threading = gui_multi_threading; @@ -126,17 +127,17 @@ void CommandBufferUsage::update(float delta_time) update_gui(delta_time); - auto &primary_command_buffer = render_context.begin(subpass_state.command_buffer_reset_mode); + auto primary_command_buffer = render_context.begin(subpass_state.command_buffer_reset_mode); update_stats(delta_time); - primary_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - get_stats().begin_sampling(primary_command_buffer); + primary_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + get_stats().begin_sampling(*primary_command_buffer); - draw(primary_command_buffer, render_context.get_active_frame().get_render_target()); + draw(*primary_command_buffer, render_context.get_active_frame().get_render_target()); - get_stats().end_sampling(primary_command_buffer); - primary_command_buffer.end(); + get_stats().end_sampling(*primary_command_buffer); + primary_command_buffer->end(); render_context.submit(primary_command_buffer); } @@ -149,7 +150,8 @@ void CommandBufferUsage::draw_gui() const auto &subpass = static_cast(get_render_pipeline().get_active_subpass().get()); get_gui().show_options_window( - /* body = */ [&]() { + /* body = */ + [&]() { // Secondary command buffer count ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.55f); ImGui::SliderInt("##secCmdBufs", &gui_secondary_cmd_buf_count, 0, max_secondary_command_buffer_count, "Secondary CmdBuffs: %d"); @@ -162,22 +164,25 @@ void CommandBufferUsage::draw_gui() ImGui::Text("(%d threads)", subpass->get_state().thread_count); // Buffer management options - ImGui::RadioButton("Allocate and free", &gui_command_buffer_reset_mode, static_cast(vkb::CommandBuffer::ResetMode::AlwaysAllocate)); + ImGui::RadioButton( + "Allocate and free", &gui_command_buffer_reset_mode, static_cast(vkb::CommandBufferResetMode::AlwaysAllocate)); if (landscape) { ImGui::SameLine(); } - ImGui::RadioButton("Reset buffer", &gui_command_buffer_reset_mode, static_cast(vkb::CommandBuffer::ResetMode::ResetIndividually)); + ImGui::RadioButton( + "Reset buffer", &gui_command_buffer_reset_mode, static_cast(vkb::CommandBufferResetMode::ResetIndividually)); if (landscape) { ImGui::SameLine(); } - ImGui::RadioButton("Reset pool", &gui_command_buffer_reset_mode, static_cast(vkb::CommandBuffer::ResetMode::ResetPool)); + ImGui::RadioButton( + "Reset pool", &gui_command_buffer_reset_mode, static_cast(vkb::CommandBufferResetMode::ResetPool)); }, /* lines = */ lines); } -void CommandBufferUsage::render(vkb::CommandBuffer &primary_command_buffer) +void CommandBufferUsage::render(vkb::core::CommandBufferC &primary_command_buffer) { if (has_render_pipeline()) { @@ -195,7 +200,7 @@ void CommandBufferUsage::render(vkb::CommandBuffer &primary_command_buffer) } } -void CommandBufferUsage::draw_renderpass(vkb::CommandBuffer &primary_command_buffer, vkb::RenderTarget &render_target) +void CommandBufferUsage::draw_renderpass(vkb::core::CommandBufferC &primary_command_buffer, vkb::RenderTarget &render_target) { const auto &subpass = static_cast(get_render_pipeline().get_active_subpass().get()); auto &extent = render_target.get_extent(); @@ -222,19 +227,22 @@ void CommandBufferUsage::draw_renderpass(vkb::CommandBuffer &primary_command_buf { const auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - auto &secondary_command_buffer = get_render_context().get_active_frame().request_command_buffer(queue, subpass->get_state().command_buffer_reset_mode, VK_COMMAND_BUFFER_LEVEL_SECONDARY); + auto secondary_command_buffer = get_render_context() + .get_active_frame() + .get_command_pool(queue, subpass->get_state().command_buffer_reset_mode) + .request_command_buffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY); - secondary_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &primary_command_buffer); + secondary_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &primary_command_buffer); - secondary_command_buffer.set_viewport(0, {viewport}); + secondary_command_buffer->set_viewport(0, {viewport}); - secondary_command_buffer.set_scissor(0, {scissor}); + secondary_command_buffer->set_scissor(0, {scissor}); - get_gui().draw(secondary_command_buffer); + get_gui().draw(*secondary_command_buffer); - secondary_command_buffer.end(); + secondary_command_buffer->end(); - primary_command_buffer.execute_commands(secondary_command_buffer); + primary_command_buffer.execute_commands(*secondary_command_buffer); } else { @@ -245,15 +253,20 @@ void CommandBufferUsage::draw_renderpass(vkb::CommandBuffer &primary_command_buf primary_command_buffer.end_render_pass(); } -CommandBufferUsage::ForwardSubpassSecondary::ForwardSubpassSecondary(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene_, vkb::sg::Camera &camera) : +CommandBufferUsage::ForwardSubpassSecondary::ForwardSubpassSecondary(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene_, + vkb::sg::Camera &camera) : vkb::ForwardSubpass{render_context, std::move(vertex_shader), std::move(fragment_shader), scene_, camera} { } -void CommandBufferUsage::ForwardSubpassSecondary::record_draw(vkb::CommandBuffer &command_buffer, - const std::vector> &nodes, - uint32_t mesh_start, uint32_t mesh_end, size_t thread_index) +void CommandBufferUsage::ForwardSubpassSecondary::record_draw(vkb::core::CommandBufferC &command_buffer, + const std::vector> &nodes, + uint32_t mesh_start, + uint32_t mesh_end, + size_t thread_index) { command_buffer.set_color_blend_state(color_blend_state); @@ -270,39 +283,49 @@ void CommandBufferUsage::ForwardSubpassSecondary::record_draw(vkb::CommandBuffer } } -vkb::CommandBuffer *CommandBufferUsage::ForwardSubpassSecondary::record_draw_secondary(vkb::CommandBuffer &primary_command_buffer, - const std::vector> &nodes, - uint32_t mesh_start, uint32_t mesh_end, size_t thread_index) +std::shared_ptr + CommandBufferUsage::ForwardSubpassSecondary::record_draw_secondary(vkb::core::CommandBufferC &primary_command_buffer, + const std::vector> &nodes, + uint32_t mesh_start, + uint32_t mesh_end, + uint32_t subpass_index, + size_t thread_index) { const auto &queue = get_render_context().get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - auto &secondary_command_buffer = - get_render_context().get_active_frame().request_command_buffer(queue, state.command_buffer_reset_mode, VK_COMMAND_BUFFER_LEVEL_SECONDARY, thread_index); + auto secondary_command_buffer = get_render_context() + .get_active_frame() + .get_command_pool(queue, state.command_buffer_reset_mode, thread_index) + .request_command_buffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY); - secondary_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &primary_command_buffer); + secondary_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &primary_command_buffer); - secondary_command_buffer.set_viewport(0, {viewport}); + { + vkb::ScopedDebugLabel subpass_debug_label{*secondary_command_buffer, fmt::format("Record secondary command buffer, subpass #{}", subpass_index).c_str()}; + + secondary_command_buffer->set_viewport(0, {viewport}); - secondary_command_buffer.set_scissor(0, {scissor}); + secondary_command_buffer->set_scissor(0, {scissor}); - record_draw(secondary_command_buffer, nodes, mesh_start, mesh_end, thread_index); + record_draw(*secondary_command_buffer, nodes, mesh_start, mesh_end, thread_index); + } - secondary_command_buffer.end(); + secondary_command_buffer->end(); - return &secondary_command_buffer; + return secondary_command_buffer; } -void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::CommandBuffer &primary_command_buffer) +void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::core::CommandBufferC &primary_command_buffer) { - std::multimap> opaque_nodes; + std::multimap> opaque_nodes; - std::multimap> transparent_nodes; + std::multimap> transparent_nodes; get_sorted_nodes(opaque_nodes, transparent_nodes); // Sort opaque objects in front-to-back order // Note: sorting objects does not help on PowerVR, so it can be avoided to save CPU cycles - std::vector> sorted_opaque_nodes; + std::vector> sorted_opaque_nodes; for (auto node_it = opaque_nodes.begin(); node_it != opaque_nodes.end(); node_it++) { sorted_opaque_nodes.push_back(node_it->second); @@ -310,7 +333,7 @@ void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::CommandBuffer &prima const auto opaque_submeshes = vkb::to_u32(sorted_opaque_nodes.size()); // Sort transparent objects in back-to-front order - std::vector> sorted_transparent_nodes; + std::vector> sorted_transparent_nodes; for (auto node_it = transparent_nodes.rbegin(); node_it != transparent_nodes.rend(); node_it++) { sorted_transparent_nodes.push_back(node_it->second); @@ -325,8 +348,8 @@ void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::CommandBuffer &prima // Draw opaque objects. Depending on the subpass state, use one or multiple // command buffers, and one or multiple threads - const bool use_secondary_command_buffers = state.secondary_cmd_buf_count > 0; - std::vector secondary_command_buffers; + const bool use_secondary_command_buffers = state.secondary_cmd_buf_count > 0; + std::vector> secondary_command_buffers; avg_draws_per_buffer = (state.secondary_cmd_buf_count > 0) ? static_cast(opaque_submeshes) / state.secondary_cmd_buf_count : 0; if (state.thread_count != thread_pool.size()) @@ -336,7 +359,7 @@ void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::CommandBuffer &prima if (use_secondary_command_buffers) { - std::vector> secondary_cmd_buf_futures; + std::vector>> secondary_cmd_buf_futures; // Save the number of draws left over, these will be distributed among the first buffers uint32_t draws_per_buffer = vkb::to_u32(std::floor(avg_draws_per_buffer)); @@ -355,16 +378,20 @@ void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::CommandBuffer &prima if (state.multi_threading) { - auto fut = thread_pool.push( - [this, cb_count, &primary_command_buffer, &sorted_opaque_nodes, mesh_start, mesh_end](size_t thread_id) { - return record_draw_secondary(primary_command_buffer, sorted_opaque_nodes, mesh_start, mesh_end, thread_id); - }); + auto fut = thread_pool.push(std::bind(&CommandBufferUsage::ForwardSubpassSecondary::record_draw_secondary, + this, + std::ref(primary_command_buffer), + std::cref(sorted_opaque_nodes), + mesh_start, + mesh_end, + cb_count, + std::placeholders::_1)); secondary_cmd_buf_futures.push_back(std::move(fut)); } else { - secondary_command_buffers.push_back(record_draw_secondary(primary_command_buffer, sorted_opaque_nodes, mesh_start, mesh_end)); + secondary_command_buffers.push_back(record_draw_secondary(primary_command_buffer, sorted_opaque_nodes, mesh_start, mesh_end, cb_count)); } mesh_start = mesh_end; @@ -396,7 +423,8 @@ void CommandBufferUsage::ForwardSubpassSecondary::draw(vkb::CommandBuffer &prima { if (use_secondary_command_buffers) { - secondary_command_buffers.push_back(record_draw_secondary(primary_command_buffer, sorted_transparent_nodes, 0, transparent_submeshes)); + secondary_command_buffers.push_back( + record_draw_secondary(primary_command_buffer, sorted_transparent_nodes, 0, transparent_submeshes, state.secondary_cmd_buf_count)); } else { diff --git a/samples/performance/command_buffer_usage/command_buffer_usage.h b/samples/performance/command_buffer_usage/command_buffer_usage.h index aa1bf91f70..2c2728f4eb 100644 --- a/samples/performance/command_buffer_usage/command_buffer_usage.h +++ b/samples/performance/command_buffer_usage/command_buffer_usage.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,8 +17,6 @@ #pragma once -#include - #include "buffer_pool.h" #include "common/utils.h" #include "rendering/render_pipeline.h" @@ -28,6 +26,86 @@ #include "scene_graph/components/perspective_camera.h" #include "vulkan_sample.h" +class ThreadPool +{ + public: + explicit ThreadPool() : + stop_flag(false) + {} + + ~ThreadPool() + { + shutdown(); + } + + template + auto push(F &&f, Args &&...args) -> std::future> + { + using return_type = std::invoke_result_t; + auto task_ptr = std::make_shared>(std::bind(std::forward(f), std::forward(args)..., std::placeholders::_1)); + std::future res = task_ptr->get_future(); + { + std::unique_lock lock(queue_mutex); + tasks.emplace([task_ptr](size_t thread_index) { (*task_ptr)(thread_index); }); + } + condition.notify_one(); + return res; + } + + void resize(size_t thread_count) + { + if (thread_count != workers.size()) + { + shutdown(); + + for (size_t i = 0; i < thread_count; ++i) + { + workers.emplace_back([this, i] { + size_t thread_index = i; + while (true) + { + std::function task; + { + std::unique_lock lock(queue_mutex); + condition.wait(lock, [this] { return stop_flag || !tasks.empty(); }); + if (stop_flag && tasks.empty()) + return; + task = std::move(tasks.front()); + tasks.pop(); + } + task(thread_index); + } + }); + } + } + } + + void shutdown() + { + { + std::unique_lock lock(queue_mutex); + stop_flag = true; + } + condition.notify_all(); + for (auto &worker : workers) + worker.join(); + workers.clear(); + stop_flag = false; + } + + size_t size() const + { + return workers.size(); + } + + private: + std::vector workers; + std::queue> tasks; + std::mutex queue_mutex; + std::condition_variable condition; + std::atomic stop_flag; +}; + /** * @brief Sample showing the use of secondary command buffers for * multi-threaded recording, as well as the different @@ -51,7 +129,7 @@ class CommandBufferUsage : public vkb::VulkanSampleC { uint32_t secondary_cmd_buf_count = 0; - vkb::CommandBuffer::ResetMode command_buffer_reset_mode = vkb::CommandBuffer::ResetMode::ResetPool; + vkb::CommandBufferResetMode command_buffer_reset_mode = vkb::CommandBufferResetMode::ResetPool; bool multi_threading = false; @@ -66,11 +144,13 @@ class CommandBufferUsage : public vkb::VulkanSampleC class ForwardSubpassSecondary : public vkb::ForwardSubpass { public: - ForwardSubpassSecondary(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_source, vkb::ShaderSource &&fragment_source, - vkb::sg::Scene &scene, vkb::sg::Camera &camera); + ForwardSubpassSecondary(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_source, + vkb::ShaderSource &&fragment_source, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera); - void draw(vkb::CommandBuffer &primary_command_buffer) override; + void draw(vkb::core::CommandBufferC &primary_command_buffer) override; void set_viewport(VkViewport &viewport); @@ -89,8 +169,11 @@ class CommandBufferUsage : public vkb::VulkanSampleC * @param mesh_end Index to the mesh where recording will stop (not included) * @param thread_index Identifies the resources allocated for this thread */ - void record_draw(vkb::CommandBuffer &command_buffer, const std::vector> &nodes, - uint32_t mesh_start, uint32_t mesh_end, size_t thread_index = 0); + void record_draw(vkb::core::CommandBufferC &command_buffer, + const std::vector> &nodes, + uint32_t mesh_start, + uint32_t mesh_end, + size_t thread_index = 0); /** * @brief Records the necessary commands to draw the specified range of scene meshes @@ -100,11 +183,16 @@ class CommandBufferUsage : public vkb::VulkanSampleC * @param nodes The meshes to draw * @param mesh_start Index to the first mesh to draw * @param mesh_end Index to the mesh where recording will stop (not included) + * @param subpass_index Index of the subpass being recorded * @param thread_index Identifies the resources allocated for this thread * @return a pointer to the recorded secondary command buffer */ - vkb::CommandBuffer *record_draw_secondary(vkb::CommandBuffer &primary_command_buffer, const std::vector> &nodes, - uint32_t mesh_start, uint32_t mesh_end, size_t thread_index = 0); + std::shared_ptr record_draw_secondary(vkb::core::CommandBufferC &primary_command_buffer, + const std::vector> &nodes, + uint32_t mesh_start, + uint32_t mesh_end, + uint32_t subpass_index, + size_t thread_index = 0); VkViewport viewport{}; @@ -118,7 +206,7 @@ class CommandBufferUsage : public vkb::VulkanSampleC float avg_draws_per_buffer{0}; - ctpl::thread_pool thread_pool; + ThreadPool thread_pool; }; private: @@ -126,9 +214,9 @@ class CommandBufferUsage : public vkb::VulkanSampleC vkb::sg::PerspectiveCamera *camera{nullptr}; - void render(vkb::CommandBuffer &command_buffer) override; + void render(vkb::core::CommandBufferC &command_buffer) override; - void draw_renderpass(vkb::CommandBuffer &primary_command_buffer, vkb::RenderTarget &render_target) override; + void draw_renderpass(vkb::core::CommandBufferC &primary_command_buffer, vkb::RenderTarget &render_target) override; void draw_gui() override; diff --git a/samples/performance/constant_data/CMakeLists.txt b/samples/performance/constant_data/CMakeLists.txt index c7873a8798..f6be9a9871 100644 --- a/samples/performance/constant_data/CMakeLists.txt +++ b/samples/performance/constant_data/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2021, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -26,9 +26,11 @@ add_sample( NAME "Constant Data" DESCRIPTION "Comparing the various ways of specifying shader constants." SHADER_FILES_GLSL - "constant_data/push_constant.vert" + "constant_data/push_constant_small.vert" + "constant_data/push_constant_large.vert" "constant_data/push_constant.frag" - "constant_data/ubo.vert" + "constant_data/ubo_small.vert" + "constant_data/ubo_large.vert" "constant_data/ubo.frag" "constant_data/buffer_array.vert" "constant_data/buffer_array.frag") \ No newline at end of file diff --git a/samples/performance/constant_data/README.adoc b/samples/performance/constant_data/README.adoc index 8f4ebbb5a1..46ab6a5f01 100644 --- a/samples/performance/constant_data/README.adoc +++ b/samples/performance/constant_data/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2024, Arm Limited and Contributors +- Copyright (c) 2021-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -170,8 +170,8 @@ When we break this down, we have the following methods: * Dynamic Descriptor Sets * Update-after-bind Descriptor Sets * Buffer array with dynamic indexing -* https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_inline_uniform_block.html[Inline uniform buffer objects] (click to read more) -* https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_push_descriptor.html[Push descriptors] (click to read more) +* https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_EXT_inline_uniform_block.html[Inline uniform buffer objects] (click to read more) +* https://www.khronos.org/registry/vulkan/specs/latest/man/html/VK_KHR_push_descriptor.html[Push descriptors] (click to read more) *Inline uniform buffer objects* and *push descriptors* are not covered by this tutorial, please use the links above to learn more about them. @@ -234,7 +234,7 @@ layout(push_constant) uniform MeshData } mesh_data; ---- -To then send the push constant data to the shader we use the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdPushConstants[`vkCmdPushConstants`] function: +To then send the push constant data to the shader we use the https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html#vkCmdPushConstants[`vkCmdPushConstants`] function: ---- void vkCmdPushConstants( @@ -285,7 +285,7 @@ So therefore we can deduce that for this shader we'd need a pipeline that has on To create a *descriptor set*, we need to allocate it from a *descriptor set pool* and give it a specific *descriptor set layout*. After a *descriptor set* is allocated, it needs to be updated with the *descriptors*. -The update process requires us to specify a list of *write operations*, where a write operation is a https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkWriteDescriptorSet.html[`VkWriteDescriptorSet`] struct. +The update process requires us to specify a list of *write operations*, where a write operation is a https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkWriteDescriptorSet.html[`VkWriteDescriptorSet`] struct. Then the valid *descriptor set* is bound to a command buffer so that when `vkCmdDraw*()` commands are run, the right resources are made available in the GPU. @@ -385,7 +385,7 @@ To control the value of `gl_InstanceIndex` we use the `uint32_t firstInstance` p It's important to note that we can use other mechanisms to push this index to the shader, such as push constants. -For example, this `vkCmdDrawIndexed` is taken from the https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCmdDrawIndexed.html[Vulkan spec]: +For example, this `vkCmdDrawIndexed` is taken from the https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdDrawIndexed.html[Vulkan spec]: ---- void vkCmdDrawIndexed( @@ -431,7 +431,7 @@ A few different stats are affected in the Mali GPU by using this, but the main t == Further reading -* The https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html[Vulkan 1.2 spec] +* The https://www.khronos.org/registry/vulkan/specs/latest/html/vkspec.html[Vulkan 1.2 spec] * "Writing an efficient Vulkan renderer" by Arseny Kapoulkine https://zeux.io/2020/02/27/writing-an-efficient-vulkan-renderer/ * Alexander Overvoorde's https://vulkan-tutorial.com/Uniform_buffers/Descriptor_layout_and_buffer[Vulkan Tutorial on Descriptors] guide * Vulkan Fast Paths https://gpuopen.com/wp-content/uploads/2016/03/VulkanFastPaths.pdf diff --git a/samples/performance/constant_data/constant_data.cpp b/samples/performance/constant_data/constant_data.cpp index 5628571b8f..a7bda6d223 100644 --- a/samples/performance/constant_data/constant_data.cpp +++ b/samples/performance/constant_data/constant_data.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: MIT * @@ -47,7 +47,7 @@ namespace /** * @brief Helper function to fill the contents of the MVPUniform struct with the transform of the node and the camera view-projection matrix. */ -inline MVPUniform fill_mvp(vkb::sg::Node &node, vkb::sg::Camera &camera) +inline MVPUniform fill_mvp(vkb::scene_graph::NodeC &node, vkb::sg::Camera &camera) { MVPUniform mvp; @@ -90,8 +90,8 @@ bool ConstantData::prepare(const vkb::ApplicationOptions &options) // If descriptor indexing and its dependencies were enabled, then we can mark the update after bind method as supported if (get_instance().is_enabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) && - get_device().is_enabled(VK_KHR_MAINTENANCE3_EXTENSION_NAME) && - get_device().is_enabled(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)) + get_device().is_extension_enabled(VK_KHR_MAINTENANCE3_EXTENSION_NAME) && + get_device().is_extension_enabled(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)) { methods[Method::UpdateAfterBindDescriptorSets].supported = true; } @@ -108,9 +108,13 @@ bool ConstantData::prepare(const vkb::ApplicationOptions &options) camera = dynamic_cast(&camera_node.get_component()); // Create the render pipelines - push_constant_render_pipeline = create_render_pipeline("constant_data/push_constant.vert", "constant_data/push_constant.frag"); - descriptor_set_render_pipeline = create_render_pipeline("constant_data/ubo.vert", "constant_data/ubo.frag"); - buffer_array_render_pipeline = create_render_pipeline("constant_data/buffer_array.vert", "constant_data/buffer_array.frag"); + + // Shader data passing depends on max. push constant size of the implementation + auto push_constant_limit = get_device().get_gpu().get_properties().limits.maxPushConstantsSize; + + push_constant_render_pipeline = create_render_pipeline(push_constant_limit >= 256 ? "constant_data/push_constant_large.vert.spv" : "constant_data/push_constant_small.vert.spv", "constant_data/push_constant.frag.spv"); + descriptor_set_render_pipeline = create_render_pipeline(push_constant_limit >= 256 ? "constant_data/ubo_large.vert.spv" : "constant_data/ubo_small.vert.spv", "constant_data/ubo.frag.spv"); + buffer_array_render_pipeline = create_render_pipeline("constant_data/buffer_array.vert.spv", "constant_data/buffer_array.frag.spv"); // Add a GUI with the stats you want to monitor get_stats().request_stats(std::set{vkb::StatIndex::frame_times, vkb::StatIndex::gpu_load_store_cycles}); @@ -119,7 +123,7 @@ bool ConstantData::prepare(const vkb::ApplicationOptions &options) return true; } -void ConstantData::request_gpu_features(vkb::PhysicalDevice &gpu) +void ConstantData::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().vertexPipelineStoresAndAtomics) { @@ -131,7 +135,7 @@ void ConstantData::request_gpu_features(vkb::PhysicalDevice &gpu) } } -void ConstantData::draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void ConstantData::draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { auto &extent = render_target.get_extent(); @@ -292,31 +296,22 @@ void ConstantData::ConstantDataSubpass::prepare() { for (auto &sub_mesh : mesh->get_submeshes()) { - auto &variant = sub_mesh->get_mut_shader_variant(); - - // Copied from vkb::ForwardSubpass - variant.add_definitions({"SCENE_MESH_COUNT " + std::to_string(scene.get_components().size())}); - variant.add_definitions({"MAX_LIGHT_COUNT " + std::to_string(MAX_FORWARD_LIGHT_COUNT)}); - variant.add_definitions(vkb::rendering::light_type_definitions); - - // If struct size is 256 we add a definition so the uniform has more values - if (struct_size == 256) - { - variant.add_definitions({"PUSH_CONSTANT_LIMIT_256"}); - } - + auto &variant = sub_mesh->get_mut_shader_variant(); auto &vert_module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, get_vertex_shader(), variant); auto &frag_module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, get_fragment_shader(), variant); } } } -void ConstantData::PushConstantSubpass::update_uniform(vkb::CommandBuffer &command_buffer, vkb::sg::Node &node, size_t thread_index) +void ConstantData::PushConstantSubpass::update_uniform(vkb::core::CommandBufferC &command_buffer, + vkb::scene_graph::NodeC &node, + size_t thread_index) { mvp_uniform = fill_mvp(node, camera); } -vkb::PipelineLayout &ConstantData::PushConstantSubpass::prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) +vkb::PipelineLayout &ConstantData::PushConstantSubpass::prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) { /** * POI @@ -325,7 +320,7 @@ vkb::PipelineLayout &ConstantData::PushConstantSubpass::prepare_pipeline_layout( return command_buffer.get_device().get_resource_cache().request_pipeline_layout(shader_modules); } -void ConstantData::PushConstantSubpass::prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) +void ConstantData::PushConstantSubpass::prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) { /** * POI @@ -345,7 +340,9 @@ void ConstantData::PushConstantSubpass::prepare_push_constants(vkb::CommandBuffe } } -void ConstantData::DescriptorSetSubpass::update_uniform(vkb::CommandBuffer &command_buffer, vkb::sg::Node &node, size_t thread_index) +void ConstantData::DescriptorSetSubpass::update_uniform(vkb::core::CommandBufferC &command_buffer, + vkb::scene_graph::NodeC &node, + size_t thread_index) { MVPUniform mvp; @@ -365,7 +362,8 @@ void ConstantData::DescriptorSetSubpass::update_uniform(vkb::CommandBuffer &comm command_buffer.bind_buffer(allocation.get_buffer(), allocation.get_offset(), allocation.get_size(), 0, 1, 0); } -vkb::PipelineLayout &ConstantData::DescriptorSetSubpass::prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) +vkb::PipelineLayout &ConstantData::DescriptorSetSubpass::prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) { /** * POI @@ -391,7 +389,7 @@ vkb::PipelineLayout &ConstantData::DescriptorSetSubpass::prepare_pipeline_layout return command_buffer.get_device().get_resource_cache().request_pipeline_layout(shader_modules); } -void ConstantData::DescriptorSetSubpass::prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) +void ConstantData::DescriptorSetSubpass::prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) { /** * POI @@ -400,7 +398,7 @@ void ConstantData::DescriptorSetSubpass::prepare_push_constants(vkb::CommandBuff return; } -void ConstantData::BufferArraySubpass::draw(vkb::CommandBuffer &command_buffer) +void ConstantData::BufferArraySubpass::draw(vkb::core::CommandBufferC &command_buffer) { auto &render_frame = get_render_context().get_active_frame(); @@ -426,17 +424,9 @@ void ConstantData::BufferArraySubpass::draw(vkb::CommandBuffer &command_buffer) // Push 128 bytes of data allocation.update(uniforms[i].model, offset + 0); // Update bytes 0 - 63 allocation.update(uniforms[i].camera_view_proj, offset + 64); // Update bytes 64 - 127 - - offset += 128; - - // If we can push another 128 bytes, push more as this will make the delta more prominent - if (struct_size == 256) - { - allocation.update(uniforms[i].scale, offset); // Update bytes 128 - 191 - allocation.update(uniforms[i].padding, offset + 64); // Update bytes 192 - 255 - - offset += 128; - } + allocation.update(uniforms[i].scale, offset + 128); // Update bytes 128 - 191 + allocation.update(uniforms[i].padding, offset + 192); // Update bytes 192 - 255 + offset += 256; } command_buffer.bind_buffer(allocation.get_buffer(), allocation.get_offset(), allocation.get_size(), 0, 1, 0); @@ -450,7 +440,9 @@ void ConstantData::BufferArraySubpass::draw(vkb::CommandBuffer &command_buffer) GeometrySubpass::draw(command_buffer); } -void ConstantData::BufferArraySubpass::update_uniform(vkb::CommandBuffer &command_buffer, vkb::sg::Node &node, size_t thread_index) +void ConstantData::BufferArraySubpass::update_uniform(vkb::core::CommandBufferC &command_buffer, + vkb::scene_graph::NodeC &node, + size_t thread_index) { /** * POI @@ -459,7 +451,8 @@ void ConstantData::BufferArraySubpass::update_uniform(vkb::CommandBuffer &comman return; } -vkb::PipelineLayout &ConstantData::BufferArraySubpass::prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) +vkb::PipelineLayout &ConstantData::BufferArraySubpass::prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) { /** * POI @@ -468,7 +461,7 @@ vkb::PipelineLayout &ConstantData::BufferArraySubpass::prepare_pipeline_layout(v return command_buffer.get_device().get_resource_cache().request_pipeline_layout(shader_modules); } -void ConstantData::BufferArraySubpass::prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) +void ConstantData::BufferArraySubpass::prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) { /** * POI @@ -477,7 +470,7 @@ void ConstantData::BufferArraySubpass::prepare_push_constants(vkb::CommandBuffer return; } -void ConstantData::BufferArraySubpass::draw_submesh_command(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) +void ConstantData::BufferArraySubpass::draw_submesh_command(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) { /** * POI diff --git a/samples/performance/constant_data/constant_data.h b/samples/performance/constant_data/constant_data.h index 5866efd203..195dfaba05 100644 --- a/samples/performance/constant_data/constant_data.h +++ b/samples/performance/constant_data/constant_data.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: MIT * @@ -105,7 +105,11 @@ class ConstantData : public vkb::VulkanSampleC class ConstantDataSubpass : public vkb::ForwardSubpass { public: - ConstantDataSubpass(vkb::RenderContext &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene, vkb::sg::Camera &camera) : + ConstantDataSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera) : vkb::ForwardSubpass(render_context, std::move(vertex_shader), std::move(fragment_shader), scene, camera) {} @@ -122,24 +126,29 @@ class ConstantData : public vkb::VulkanSampleC class PushConstantSubpass : public ConstantDataSubpass { public: - PushConstantSubpass(vkb::RenderContext &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene, vkb::sg::Camera &camera) : + PushConstantSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera) : ConstantDataSubpass(render_context, std::move(vertex_shader), std::move(fragment_shader), scene, camera) {} /** * @brief Updates the MVP uniform member variable to then be pushed into the shader */ - virtual void update_uniform(vkb::CommandBuffer &command_buffer, vkb::sg::Node &node, size_t thread_index) override; + virtual void update_uniform(vkb::core::CommandBufferC &command_buffer, vkb::scene_graph::NodeC &node, size_t thread_index) override; /** * @brief Overridden to intentionally disable any dynamic shader module updates */ - virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) override; + virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) override; /** * @brief Overridden to push a custom data structure to the shader */ - virtual void prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) override; + virtual void prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) override; // The MVP uniform data structure MVPUniform mvp_uniform; @@ -154,24 +163,29 @@ class ConstantData : public vkb::VulkanSampleC class DescriptorSetSubpass : public ConstantDataSubpass { public: - DescriptorSetSubpass(vkb::RenderContext &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene, vkb::sg::Camera &camera) : + DescriptorSetSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera) : ConstantDataSubpass(render_context, std::move(vertex_shader), std::move(fragment_shader), scene, camera) {} /** * @brief Creates a buffer filled with the mvp data and binds it */ - virtual void update_uniform(vkb::CommandBuffer &command_buffer, vkb::sg::Node &node, size_t thread_index) override; + virtual void update_uniform(vkb::core::CommandBufferC &command_buffer, vkb::scene_graph::NodeC &node, size_t thread_index) override; /** * @brief Dynamically retrieves the correct pipeline layout depending on the method of UBO */ - virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) override; + virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) override; /** * @brief Overridden to intentionally disable any push constants */ - virtual void prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) override; + virtual void prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) override; // The method by which the UBO subpass will operate Method method; @@ -186,31 +200,36 @@ class ConstantData : public vkb::VulkanSampleC class BufferArraySubpass : public ConstantDataSubpass { public: - BufferArraySubpass(vkb::RenderContext &render_context, vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene, vkb::sg::Camera &camera) : + BufferArraySubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera) : ConstantDataSubpass(render_context, std::move(vertex_shader), std::move(fragment_shader), scene, camera) {} - virtual void draw(vkb::CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; /** * @brief No-op, uniform data is sent upfront before the draw call */ - virtual void update_uniform(vkb::CommandBuffer &command_buffer, vkb::sg::Node &node, size_t thread_index) override; + virtual void update_uniform(vkb::core::CommandBufferC &command_buffer, vkb::scene_graph::NodeC &node, size_t thread_index) override; /** * @brief Returns a default pipeline layout */ - virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) override; + virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) override; /** * @brief Overridden to intentionally disable any push constants */ - virtual void prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) override; + virtual void prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) override; /** * @brief Overridden to send an index */ - virtual void draw_submesh_command(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) override; + virtual void draw_submesh_command(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) override; uint32_t instance_index{0}; }; @@ -240,9 +259,9 @@ class ConstantData : public vkb::VulkanSampleC private: virtual void draw_gui() override; - virtual void draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) override; + virtual void draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; /** * @brief Helper function to determine the constant data method that is selected and supported by the sample @@ -261,6 +280,8 @@ class ConstantData : public vkb::VulkanSampleC // The render pipeline designed for using a large shader storage buffer object that is instanced into to get the relevant MVP data std::unique_ptr buffer_array_render_pipeline{nullptr}; + uint32_t max_push_constant_size{128}; + // The samples constant data methods and their properties std::unordered_map methods = { {Method::PushConstants, {"Push Constants"}}, diff --git a/samples/performance/descriptor_management/README.adoc b/samples/performance/descriptor_management/README.adoc index 658e4b5866..d03ef46130 100644 --- a/samples/performance/descriptor_management/README.adoc +++ b/samples/performance/descriptor_management/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -41,10 +41,10 @@ We can either bind per-material and per-object descriptor sets separately or col Either way, complex applications will have a large amount of descriptor sets that may need to change on the fly, for example due to textures being streamed in or out. The simplest approach to circumvent the issue is to have one or more ``VkDescriptorPool``s per frame, reset them at the beginning of the frame and allocate the required descriptor sets from it. -This approach will consist of a https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetDescriptorPool.html[vkResetDescriptorPool()] call at the beginning, followed by a series of https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkAllocateDescriptorSets.html[vkAllocateDescriptorSets()] and https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkUpdateDescriptorSets.html[vkUpdateDescriptorSets()] to fill them with data. +This approach will consist of a https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetDescriptorPool.html[vkResetDescriptorPool()] call at the beginning, followed by a series of https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkAllocateDescriptorSets.html[vkAllocateDescriptorSets()] and https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkUpdateDescriptorSets.html[vkUpdateDescriptorSets()] to fill them with data. The issue is that these calls can add a significant overhead to the CPU frame time, especially on mobile. -In the worst cases, for example calling https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkUpdateDescriptorSets.html[vkUpdateDescriptorSets()] for each draw call, the time it takes to update descriptors can be longer than the time of the draws themselves. +In the worst cases, for example calling https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkUpdateDescriptorSets.html[vkUpdateDescriptorSets()] for each draw call, the time it takes to update descriptors can be longer than the time of the draws themselves. image::./images/bonza_no_caching_multiple_buf.jpg[Basic descriptor set management] @@ -57,7 +57,7 @@ Both these factors can significantly affect the results. == Caching descriptor sets A major way to reduce descriptor set updates is to re-use them as much as possible. -Instead of calling https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkResetDescriptorPool.html[vkResetDescriptorPool()] every frame, the app will keep the `VkDescriptorSet` handles stored with some caching mechanism to access them. +Instead of calling https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkResetDescriptorPool.html[vkResetDescriptorPool()] every frame, the app will keep the `VkDescriptorSet` handles stored with some caching mechanism to access them. The cache could be a hashmap with the contents of the descriptor set (images, buffers) as key. This approach is used in our framework by default. @@ -83,7 +83,7 @@ GPU frame time does not change much and the app is still CPU bound, so the speed This system is reasonably easy to implement for a static scene, but it becomes harder when you need to delete descriptor sets. Complex engines may implement techniques to figure out which descriptor sets have not been accessed for a certain number of frames, so they can be removed from the map. -This may correspond to calling https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkFreeDescriptorSets.html[vkFreeDescriptorSets()], but this solution poses another issue: in order to free individual descriptor sets the pool has to be created with the `VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT` flag. +This may correspond to calling https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkFreeDescriptorSets.html[vkFreeDescriptorSets()], but this solution poses another issue: in order to free individual descriptor sets the pool has to be created with the `VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT` flag. Mobile implementations may use a simpler allocator if that flag is not set, relying on the fact that pool memory will only be recycled in block. It is possible to avoid using that flag by updating descriptor sets instead of deleting them. @@ -110,7 +110,7 @@ This means that we will have many descriptor sets to create, since every object Furthermore, we will have to update many buffers separately, meaning we cannot control their memory layout and we might lose some optimization opportunities with caching. We can address both problems by reverting the approach: instead of having a `VkBuffer` per object containing per-frame data, we will have a `VkBuffer` per frame containing per-object data. -The buffer will be cleared at the beginning of the frame, then each object will record its data and will receive a dynamic offset to be used at https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdBindDescriptorSets.html[vkCmdBindDescriptorSets()] time. +The buffer will be cleared at the beginning of the frame, then each object will record its data and will receive a dynamic offset to be used at https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdBindDescriptorSets.html[vkCmdBindDescriptorSets()] time. With this approach we will need less descriptor sets, as more objects can share the same one: they will all reference the same `VkBuffer`, but at different dynamic offsets. Furthermore, we can control the memory layout within the buffer. @@ -151,6 +151,6 @@ For this relatively simple scene stacking the two approaches does not provide a *Debugging* -* The time spent in https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkUpdateDescriptorSets.html[vkUpdateDescriptorSets()] can be checked with a CPU profiler. +* The time spent in https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkUpdateDescriptorSets.html[vkUpdateDescriptorSets()] can be checked with a CPU profiler. In the worst cases it may be comparable or higher than the time spent performing the actual draw calls. -* Monitor if there is contention on https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkAllocateDescriptorSets.html[vkAllocateDescriptorSets()], which will probably be a performance problem if it occurs. +* Monitor if there is contention on https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkAllocateDescriptorSets.html[vkAllocateDescriptorSets()], which will probably be a performance problem if it occurs. diff --git a/samples/performance/descriptor_management/descriptor_management.cpp b/samples/performance/descriptor_management/descriptor_management.cpp index 7a538e3420..0b1f2ffc2a 100644 --- a/samples/performance/descriptor_management/descriptor_management.cpp +++ b/samples/performance/descriptor_management/descriptor_management.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -50,8 +50,8 @@ bool DescriptorManagement::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = dynamic_cast(&camera_node.get_component()); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); render_pipeline->add_subpass(std::move(scene_subpass)); @@ -75,30 +75,30 @@ void DescriptorManagement::update(float delta_time) auto &render_context = get_render_context(); - auto &command_buffer = render_context.begin(); + auto command_buffer = render_context.begin(); update_stats(delta_time); // Process GUI input auto buffer_alloc_strategy = (buffer_allocation.value == 0) ? - vkb::BufferAllocationStrategy::OneAllocationPerBuffer : - vkb::BufferAllocationStrategy::MultipleAllocationsPerBuffer; + vkb::rendering::BufferAllocationStrategy::OneAllocationPerBuffer : + vkb::rendering::BufferAllocationStrategy::MultipleAllocationsPerBuffer; render_context.get_active_frame().set_buffer_allocation_strategy(buffer_alloc_strategy); auto descriptor_management_strategy = (descriptor_caching.value == 0) ? - vkb::DescriptorManagementStrategy::CreateDirectly : - vkb::DescriptorManagementStrategy::StoreInCache; + vkb::rendering::DescriptorManagementStrategy::CreateDirectly : + vkb::rendering::DescriptorManagementStrategy::StoreInCache; render_context.get_active_frame().set_descriptor_management_strategy(descriptor_management_strategy); - command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - get_stats().begin_sampling(command_buffer); + command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + get_stats().begin_sampling(*command_buffer); - draw(command_buffer, render_context.get_active_frame().get_render_target()); + draw(*command_buffer, render_context.get_active_frame().get_render_target()); - get_stats().end_sampling(command_buffer); - command_buffer.end(); + get_stats().end_sampling(*command_buffer); + command_buffer->end(); render_context.submit(command_buffer); } diff --git a/samples/performance/hpp_pipeline_cache/hpp_pipeline_cache.cpp b/samples/performance/hpp_pipeline_cache/hpp_pipeline_cache.cpp index 8f1dedcceb..c6c37d1d7f 100644 --- a/samples/performance/hpp_pipeline_cache/hpp_pipeline_cache.cpp +++ b/samples/performance/hpp_pipeline_cache/hpp_pipeline_cache.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ #include "hpp_pipeline_cache.h" #include "common/hpp_utils.h" -#include "hpp_gui.h" #include "rendering/subpasses/hpp_forward_subpass.h" HPPPipelineCache::HPPPipelineCache() @@ -65,12 +64,8 @@ bool HPPPipelineCache::prepare(const vkb::ApplicationOptions &options) } /* Add initial pipeline cache data from the cached file */ - /* Note: unfortunately, no compiler can detect the correct data type from the "natural" constructor here: */ - /* vk::PipelineCacheCreateInfo pipeline_cache_create_info({}, pipeline_data); */ - /* This is due to the templatized second argument. You could help the compiler by a cast */ - /* vk::PipelineCacheCreateInfo pipeline_cache_create_info({}, vk::ArrayProxyNoTemporaries(pipeline_data)); */ - /* But, obviously, this looks a bit awkward. Instead, you can use the simple two-argument approach with size and pointer: */ - vk::PipelineCacheCreateInfo pipeline_cache_create_info({}, pipeline_data.size(), pipeline_data.data()); + vk::PipelineCacheCreateInfo pipeline_cache_create_info{.initialDataSize = static_cast(pipeline_data.size()), + .pInitialData = pipeline_data.data()}; /* Create Vulkan pipeline cache */ pipeline_cache = get_device().get_handle().createPipelineCache(pipeline_cache_create_info); @@ -107,8 +102,8 @@ bool HPPPipelineCache::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::common::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique( get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); diff --git a/samples/performance/hpp_swapchain_images/README.adoc b/samples/performance/hpp_swapchain_images/README.adoc index 0a857fca06..ce3a3adcc2 100644 --- a/samples/performance/hpp_swapchain_images/README.adoc +++ b/samples/performance/hpp_swapchain_images/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2022-2024, The Khronos Group +- Copyright (c) 2022-2025, The Khronos Group - - SPDX-License-Identifier: Apache-2.0 - @@ -37,11 +37,11 @@ This sample analyzes the available options and their performance implications. == Choosing a number of images The control over the number of swapchain images is shared between the application and the platform. -The application can ask for a minimum number of images by setting the `minImageCount` parameter in https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCreateSwapchainKHR.html[vk::Device::createSwapchainKHR]. -The exact number of images created can then be polled via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetSwapchainImagesKHR.html[vk::Device::getSwapchainImagesKHR]. +The application can ask for a minimum number of images by setting the `minImageCount` parameter in https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCreateSwapchainKHR.html[vk::Device::createSwapchainKHR]. +The exact number of images created can then be polled via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetSwapchainImagesKHR.html[vk::Device::getSwapchainImagesKHR]. -In order to properly set the `minImageCount` parameter, the application should get the surface capabilities of the physical device via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vk::PhysicalDevice::getSurfaceCapabilitiesKHR]. -The https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSurfaceCapabilitiesKHR.html[vk::SurfaceCapabilitiesKHR] structure has the `minImageCount` and `maxImageCount` parameters, which set the boundaries for the image count that can be safely requested. +In order to properly set the `minImageCount` parameter, the application should get the surface capabilities of the physical device via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vk::PhysicalDevice::getSurfaceCapabilitiesKHR]. +The https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html[vk::SurfaceCapabilitiesKHR] structure has the `minImageCount` and `maxImageCount` parameters, which set the boundaries for the image count that can be safely requested. As a rule of thumb on mobile, `+pSurfaceCapabilities->minImageCount+` is usually 2, while `+pSurfaceCapabilities->maxImageCount+` is large enough to not pose any problem with common applications (though it is still good practice to check its value). @@ -55,7 +55,7 @@ We will discuss present modes in the next section. == Choosing a present mode -The available present modes can be queried via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfacePresentModesKHR.html[vk::PhysicalDevice::getSurfacePresentModesKHR]. +The available present modes can be queried via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfacePresentModesKHR.html[vk::PhysicalDevice::getSurfacePresentModesKHR]. There are several presentation modes in Vulkan, but mobile GPUs do not support the ones in which the image is directly presented to the screen (immediate mode). The only ones which satisfy Android's VSync requirement are `vk::PresentModeKHR::eFifo` and `vk::PresentModeKHR::eMailbox`. @@ -131,7 +131,7 @@ After the marker we switch to double buffering and we confirm what we predicted *Do* -* Ensure that the value of `minImageCount` is within the valid range from https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vk::PhysicalDevice::getSurfaceCapabilitiesKHR] (between `minImageCount` and `maxImageCount`). +* Ensure that the value of `minImageCount` is within the valid range from https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vk::PhysicalDevice::getSurfaceCapabilitiesKHR] (between `minImageCount` and `maxImageCount`). * Use `vk::PresentModeKHR::eFifo` to avoid unnecessary CPU and GPU load. * Use triple buffering to maximize performance. @@ -148,5 +148,5 @@ If you want to cap framerate to 30 FPS to save power, this can be achieved on th *Debugging* -* It is possible to check how many images are created via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetSwapchainImagesKHR.html[vk::Device::getSwapchainImagesKHR]. +* It is possible to check how many images are created via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetSwapchainImagesKHR.html[vk::Device::getSwapchainImagesKHR]. If only 2 images are being created, `minImageCount` should be increased to 3, if the physical device allows for it (it normally does). diff --git a/samples/performance/hpp_swapchain_images/hpp_swapchain_images.cpp b/samples/performance/hpp_swapchain_images/hpp_swapchain_images.cpp index 73f2a54412..bad500cdbb 100644 --- a/samples/performance/hpp_swapchain_images/hpp_swapchain_images.cpp +++ b/samples/performance/hpp_swapchain_images/hpp_swapchain_images.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2022-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ #include "hpp_swapchain_images.h" #include -#include #include HPPSwapchainImages::HPPSwapchainImages() @@ -41,8 +40,8 @@ bool HPPSwapchainImages::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::common::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique( get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); diff --git a/samples/performance/hpp_texture_compression_comparison/hpp_texture_compression_comparison.cpp b/samples/performance/hpp_texture_compression_comparison/hpp_texture_compression_comparison.cpp index 2ed6ed9432..c31a8f0c07 100644 --- a/samples/performance/hpp_texture_compression_comparison/hpp_texture_compression_comparison.cpp +++ b/samples/performance/hpp_texture_compression_comparison/hpp_texture_compression_comparison.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2021-2024, Holochip - * Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +/* Copyright (c) 2021-2025, Holochip + * Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -17,9 +17,7 @@ */ #include "hpp_texture_compression_comparison.h" -#include "scene_graph/components/hpp_image.h" -#include "scene_graph/components/hpp_mesh.h" -#include "scene_graph/components/material.h" +#include "core/hpp_queue.h" namespace { @@ -53,7 +51,7 @@ std::string get_sponza_texture_filename(const std::string &short_name) class HPPCompressedImage : public vkb::scene_graph::components::HPPImage { public: - HPPCompressedImage(vkb::core::HPPDevice &device, + HPPCompressedImage(vkb::core::DeviceCpp &device, const std::string &name, std::vector &&mipmaps, vk::Format format) : @@ -84,10 +82,7 @@ HPPTextureCompressionComparison::HPPTextureCompressionComparison() {&vk::PhysicalDeviceFeatures::textureCompressionBC, "", vk::Format::eBc7SrgbBlock, KTX_TTF_BC7_RGBA, "KTX_TTF_BC7_RGBA", "BC7"}, {&vk::PhysicalDeviceFeatures::textureCompressionBC, "", vk::Format::eBc3SrgbBlock, KTX_TTF_BC3_RGBA, "KTX_TTF_BC3_RGBA", "BC3"}, {&vk::PhysicalDeviceFeatures::textureCompressionASTC_LDR, "", vk::Format::eAstc4x4SrgbBlock, KTX_TTF_ASTC_4x4_RGBA, "KTX_TTF_ASTC_4x4_RGBA", "ASTC 4x4"}, - {&vk::PhysicalDeviceFeatures::textureCompressionETC2, "", vk::Format::eEtc2R8G8B8A8SrgbBlock, KTX_TTF_ETC2_RGBA, "KTX_TTF_ETC2_RGBA", "ETC2"}, - {nullptr, VK_IMG_FORMAT_PVRTC_EXTENSION_NAME, vk::Format::ePvrtc14BppSrgbBlockIMG, KTX_TTF_PVRTC1_4_RGBA, "KTX_TTF_PVRTC1_4_RGBA", "PVRTC1 4"}}; - - add_device_extension(VK_IMG_FORMAT_PVRTC_EXTENSION_NAME, true); + {&vk::PhysicalDeviceFeatures::textureCompressionETC2, "", vk::Format::eEtc2R8G8B8A8SrgbBlock, KTX_TTF_ETC2_RGBA, "KTX_TTF_ETC2_RGBA", "ETC2"}}; } void HPPTextureCompressionComparison::draw_gui() @@ -182,7 +177,7 @@ std::unique_ptr HPPTextureCompressionCom const auto vk_format = static_cast(ktx_texture->vkFormat); - vk::Extent3D extent(ktx_texture->baseWidth, ktx_texture->baseHeight, 1); + vk::Extent3D extent{ktx_texture->baseWidth, ktx_texture->baseHeight, 1}; std::vector buffer_copies; std::unique_ptr image_out; @@ -190,7 +185,7 @@ std::unique_ptr HPPTextureCompressionCom std::vector mip_maps; for (uint32_t mip_level = 0; mip_level < ktx_texture->numLevels; ++mip_level) { - vk::Extent3D mip_extent(extent.width >> mip_level, extent.height >> mip_level, 1); + vk::Extent3D mip_extent{extent.width >> mip_level, extent.height >> mip_level, 1}; if (!mip_extent.width || !mip_extent.height) { break; @@ -199,7 +194,7 @@ std::unique_ptr HPPTextureCompressionCom ktx_size_t offset{0}; KTX_CHECK(ktxTexture_GetImageOffset((ktxTexture *) ktx_texture, mip_level, 0, 0, &offset)); vk::BufferImageCopy buffer_image_copy = {}; - buffer_image_copy.imageSubresource = vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, mip_level, 0, 1); + buffer_image_copy.imageSubresource = vk::ImageSubresourceLayers{vk::ImageAspectFlagBits::eColor, mip_level, 0, 1}; buffer_image_copy.imageExtent = mip_extent; buffer_image_copy.bufferOffset = static_cast(offset); buffer_copies.push_back(buffer_image_copy); @@ -216,7 +211,7 @@ std::unique_ptr HPPTextureCompressionCom auto &vkb_image = image_out->get_vk_image(); auto image = vkb_image.get_handle(); - vk::ImageSubresourceRange subresource_range(vk::ImageAspectFlagBits::eColor, 0, static_cast(buffer_copies.size()), 0, 1); + vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, static_cast(buffer_copies.size()), 0, 1}; vk::CommandBuffer command_buffer = get_device().create_command_buffer(vk::CommandBufferLevel::ePrimary, true); @@ -234,8 +229,8 @@ std::unique_ptr HPPTextureCompressionCom void HPPTextureCompressionComparison::create_subpass() { - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_sub_pass = std::make_unique( get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); @@ -248,7 +243,7 @@ void HPPTextureCompressionComparison::create_subpass() bool HPPTextureCompressionComparison::is_texture_format_supported(const HPPTextureCompressionData &tcd, vk::PhysicalDeviceFeatures const &device_features) { const bool supported_by_feature = tcd.feature_ptr && device_features.*tcd.feature_ptr; - const bool supported_by_extension = tcd.extension_name.length() && get_device().is_extension_supported(tcd.extension_name); + const bool supported_by_extension = tcd.extension_name.length() && get_device().get_gpu().is_extension_supported(tcd.extension_name); const bool supported_by_default = tcd.always_supported; return supported_by_default || supported_by_feature || supported_by_extension; diff --git a/samples/performance/image_compression_control/CMakeLists.txt b/samples/performance/image_compression_control/CMakeLists.txt index db26398544..1455d4ca2c 100644 --- a/samples/performance/image_compression_control/CMakeLists.txt +++ b/samples/performance/image_compression_control/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Arm Limited and Contributors +# Copyright (c) 2024-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -24,4 +24,7 @@ add_sample( CATEGORY ${CATEGORY_NAME} AUTHOR "Arm" NAME "Image Compression Control" - DESCRIPTION "Save memory footprint and bandwidth with visually lossless compression") + DESCRIPTION "Save memory footprint and bandwidth with visually lossless compression" + SHADER_FILES_GLSL + "postprocessing/postprocessing.vert" + "postprocessing/chromatic_aberration.frag") \ No newline at end of file diff --git a/samples/performance/image_compression_control/README.adoc b/samples/performance/image_compression_control/README.adoc index f6dcbe1303..8f4af0e561 100644 --- a/samples/performance/image_compression_control/README.adoc +++ b/samples/performance/image_compression_control/README.adoc @@ -1,6 +1,6 @@ //// -- Copyright (c) 2024, The Khronos Group -- Copyright (c) 2024, Arm Limited and Contributors +- Copyright (c) 2024-2025, The Khronos Group +- Copyright (c) 2024-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -30,7 +30,7 @@ endif::[] == Overview -This sample shows how a Vulkan application can control the compression of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImage.html[`VkImage`] elements, in particular a framebuffer attachment and the swapchain. +This sample shows how a Vulkan application can control the compression of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImage.html[`VkImage`] elements, in particular a framebuffer attachment and the swapchain. This requires enabling and using the extensions https://docs.vulkan.org/spec/latest/appendices/extensions.html#VK_EXT_image_compression_control[`VK_EXT_image_compression_control`] and https://docs.vulkan.org/spec/latest/appendices/extensions.html#VK_EXT_image_compression_control_swapchain[`VK_EXT_image_compression_control_swapchain`], respectively. Applications that use compression generally perform better thanks to the reduced memory footprint and bandwidth. @@ -119,12 +119,12 @@ This is the case for the Space Module scene shown above. == VK_EXT_image_compression_control -This sample enables the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_image_compression_control.html[`VK_EXT_image_compression_control`] extension and requests the relevant device feature, https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceImageCompressionControlFeaturesEXT.html[`imageCompressionControl`] +This sample enables the https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_image_compression_control.html[`VK_EXT_image_compression_control`] extension and requests the relevant device feature, https://registry.khronos.org/vulkan/specs/latest/man/html/VkPhysicalDeviceImageCompressionControlFeaturesEXT.html[`imageCompressionControl`] This extension abstracts how applications choose a fixed compression rate, in terms of "minimum number of bits per component (BPC)". === Query for image compression support -To query if a particular image supports fixed-rate compression, add a https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageFormatProperties2KHR.html[`VkImageFormatProperties2`], and call https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceImageFormatProperties2KHR.html[`vkGetPhysicalDeviceImageFormatProperties2KHR`]: +To query if a particular image supports fixed-rate compression, add a https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageFormatProperties2KHR.html[`VkImageFormatProperties2`], and call https://registry.khronos.org/vulkan/specs/latest/man/html/vkGetPhysicalDeviceImageFormatProperties2KHR.html[`vkGetPhysicalDeviceImageFormatProperties2KHR`]: [,cpp] ---- @@ -148,8 +148,8 @@ vkGetPhysicalDeviceImageFormatProperties2KHR(device.get_gpu().get_handle(), &ima In the Vulkan Samples framework, this happens in the https://github.com/KhronosGroup/Vulkan-Samples/blob/main/framework/common/vk_common.cpp[`vkb::query_supported_fixed_rate_compression`] function. -Then inspect the values written to the `imageCompressionFixedRateFlags` component of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`]. -If fixed-rate compression is supported, the flags will indicate which levels may be selected for this image, for instance https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFixedRateFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT`] or https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFixedRateFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT`]. +Then inspect the values written to the `imageCompressionFixedRateFlags` component of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`]. +If fixed-rate compression is supported, the flags will indicate which levels may be selected for this image, for instance https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFixedRateFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT`] or https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFixedRateFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT`]. The sample will use the minimum BPC available for its high compression setting, and the maximum BPC available for its low compression setting. image::./images/fixed_rate_levels.png[Image Compression Control sample, 900, align="center"] @@ -159,7 +159,7 @@ __Fixed-rate options__ === Request image compression -To request fixed-rate compression, provide a https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionControlEXT.html[`VkImageCompressionControlEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCreateInfo.html[`VkImageCreateInfo`]: +To request fixed-rate compression, provide a https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionControlEXT.html[`VkImageCompressionControlEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCreateInfo.html[`VkImageCreateInfo`]: [,cpp] ---- @@ -180,13 +180,13 @@ image_info.pNext = &compression_control; vkCreateImage(device, &image_info, nullptr, &new_image); ---- -Note that, instead of using https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT`], one may use https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT`], and in that case it would not be necessary to provide a specific set of `pFixedRateFlags`. +Note that, instead of using https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT`], one may use https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT`], and in that case it would not be necessary to provide a specific set of `pFixedRateFlags`. In the Vulkan Samples framework, this happens in the https://github.com/KhronosGroup/Vulkan-Samples/blob/main/framework/core/image.cpp[`core::Image`] constructor. === Verify image compression [[verify_image_compression]] -To query which compression was applied, if any, once a https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImage.html[`VkImage`] has been created, add a https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageSubresource2EXT.html[`VkImageSubresource2EXT`], and call https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetImageSubresourceLayout2EXT.html[`vkGetImageSubresourceLayout2EXT`]: +To query which compression was applied, if any, once a https://registry.khronos.org/vulkan/specs/latest/man/html/VkImage.html[`VkImage`] has been created, add a https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageSubresource2EXT.html[`VkImageSubresource2EXT`], and call https://registry.khronos.org/vulkan/specs/latest/man/html/vkGetImageSubresourceLayout2EXT.html[`vkGetImageSubresourceLayout2EXT`]: [,cpp] ---- @@ -203,18 +203,18 @@ image_subresource.imageSubresource.arrayLayer = 0; vkGetImageSubresourceLayout2EXT(device, image, &image_subresource, &subresource_layout); ---- -Then inspect the values written to the `imageCompressionFlags` and `imageCompressionFixedRateFlags` components of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`]. +Then inspect the values written to the `imageCompressionFlags` and `imageCompressionFixedRateFlags` components of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`]. In the Vulkan Samples framework, this happens in the https://github.com/KhronosGroup/Vulkan-Samples/blob/main/framework/core/image.cpp[`core::Image::query_applied_compression`] function. == VK_EXT_image_compression_control_swapchain -Compression control for swapchain images is similar, but it requires the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_image_compression_control_swapchain.html[`VK_EXT_image_compression_control_swapchain`] extension and the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT.html[`imageCompressionControlSwapchain`] device feature to be enabled. -These depend on the https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_image_compression_control.html[`VK_EXT_image_compression_control`] being available and enabled too. +Compression control for swapchain images is similar, but it requires the https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_image_compression_control_swapchain.html[`VK_EXT_image_compression_control_swapchain`] extension and the https://registry.khronos.org/vulkan/specs/latest/man/html/VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT.html[`imageCompressionControlSwapchain`] device feature to be enabled. +These depend on the https://registry.khronos.org/vulkan/specs/latest/man/html/VK_EXT_image_compression_control.html[`VK_EXT_image_compression_control`] being available and enabled too. === Query for surface compression support -To query if the surface supports fixed-rate compression, add a https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageFormatProperties2KHR.html[`VkImageFormatProperties2`], and call https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceImageFormatProperties2KHR.html[`vkGetPhysicalDeviceImageFormatProperties2KHR`]: +To query if the surface supports fixed-rate compression, add a https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageFormatProperties2KHR.html[`VkImageFormatProperties2`], and call https://registry.khronos.org/vulkan/specs/latest/man/html/vkGetPhysicalDeviceImageFormatProperties2KHR.html[`vkGetPhysicalDeviceImageFormatProperties2KHR`]: [,cpp] ---- @@ -239,12 +239,12 @@ for (uint32_t i = 0; i < surface_format_count; i++) vkGetPhysicalDeviceSurfaceFormats2KHR(device, &surface_info, &surface_format_count, surface_formats.data()); ---- -Then inspect the values written to the `imageCompressionFixedRateFlags` component of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`], associated to a particular https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkSurfaceFormat2KHR.html[`VkSurfaceFormat2KHR`]. +Then inspect the values written to the `imageCompressionFixedRateFlags` component of https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionPropertiesEXT.html[`VkImageCompressionPropertiesEXT`], associated to a particular https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceFormat2KHR.html[`VkSurfaceFormat2KHR`]. In the Vulkan Samples framework, this happens in the https://github.com/KhronosGroup/Vulkan-Samples/blob/main/framework/core/swapchain.cpp[`Swapchain::query_supported_fixed_rate_compression`] function. === Request surface compression -To request fixed-rate compression, provide a https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionControlEXT.html[`VkImageCompressionControlEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkSwapchainCreateInfoKHR.html[`VkSwapchainCreateInfoKHR`]: +To request fixed-rate compression, provide a https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionControlEXT.html[`VkImageCompressionControlEXT`] to the `pNext` chain of https://registry.khronos.org/vulkan/specs/latest/man/html/VkSwapchainCreateInfoKHR.html[`VkSwapchainCreateInfoKHR`]: [,cpp] ---- @@ -262,13 +262,13 @@ create_info.pNext = &compression_control; vkCreateSwapchainKHR(device, &create_info, nullptr, &new_swapchain); ---- -Similarly to regular images, https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT`] may be used instead. +Similarly to regular images, https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT`] may be used instead. In the Vulkan Samples framework, this happens in the https://github.com/KhronosGroup/Vulkan-Samples/blob/main/framework/core/swapchain.cpp[`Swapchain`] constructor. === Verify surface compression -To verify that compression was applied to the swapchain images, use the same method as described for a regular https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImage.html[`VkImage`] in <>. +To verify that compression was applied to the swapchain images, use the same method as described for a regular https://registry.khronos.org/vulkan/specs/latest/man/html/VkImage.html[`VkImage`] in <>. No need to enable https://docs.vulkan.org/spec/latest/appendices/extensions.html#VK_EXT_image_compression_control_swapchain[`VK_EXT_image_compression_control_swapchain`] for this. In the Vulkan Samples framework, this happens in the https://github.com/KhronosGroup/Vulkan-Samples/blob/main/framework/core/swapchain.cpp[`Swapchain::get_applied_compression`] function. @@ -278,9 +278,9 @@ The most likely reason is that, even though the GPU supports it, other IP compon == Disabling fixed-rate compression -As explained above, the `flags` in https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionControlEXT.html[`VkImageCompressionControlEXT`] control the compression scheme selection for images. +As explained above, the `flags` in https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionControlEXT.html[`VkImageCompressionControlEXT`] control the compression scheme selection for images. Take care not to accidentally disable <> when disabling <>. -That is, ensure that https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_DEFAULT_EXT`] is used by default, rather than https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_DISABLED_EXT`], which disables all compression, negatively impacting performance. +That is, ensure that https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_DEFAULT_EXT`] is used by default, rather than https://registry.khronos.org/vulkan/specs/latest/man/html/VkImageCompressionFlagBitsEXT.html[`VK_IMAGE_COMPRESSION_DISABLED_EXT`], which disables all compression, negatively impacting performance. == Conclusion diff --git a/samples/performance/image_compression_control/image_compression_control.cpp b/samples/performance/image_compression_control/image_compression_control.cpp index e584752168..e3934bda7c 100644 --- a/samples/performance/image_compression_control/image_compression_control.cpp +++ b/samples/performance/image_compression_control/image_compression_control.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -42,22 +42,16 @@ ImageCompressionControlSample::ImageCompressionControlSample() config.insert(2, static_cast(gui_target_compression), 2); } -void ImageCompressionControlSample::request_gpu_features(vkb::PhysicalDevice &gpu) +void ImageCompressionControlSample::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.is_extension_supported(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) { - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceImageCompressionControlFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, - imageCompressionControl); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDeviceImageCompressionControlFeaturesEXT, imageCompressionControl); } if (gpu.is_extension_supported(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) { - REQUEST_REQUIRED_FEATURE(gpu, - VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, - imageCompressionControlSwapchain); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT, imageCompressionControlSwapchain); } } @@ -73,8 +67,8 @@ bool ImageCompressionControlSample::prepare(const vkb::ApplicationOptions &optio auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = dynamic_cast(&camera_node.get_component()); - vkb::ShaderSource scene_vs("base.vert"); - vkb::ShaderSource scene_fs("base.frag"); + vkb::ShaderSource scene_vs("base.vert.spv"); + vkb::ShaderSource scene_fs("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(scene_vs), std::move(scene_fs), get_scene(), *camera); scene_subpass->set_output_attachments({static_cast(Attachments::Color)}); @@ -85,9 +79,9 @@ bool ImageCompressionControlSample::prepare(const vkb::ApplicationOptions &optio set_render_pipeline(std::move(render_pipeline)); // Post-processing pass (chromatic aberration) - vkb::ShaderSource postprocessing_vs("postprocessing/postprocessing.vert"); + vkb::ShaderSource postprocessing_vs("postprocessing/postprocessing.vert.spv"); postprocessing_pipeline = std::make_unique(get_render_context(), std::move(postprocessing_vs)); - postprocessing_pipeline->add_pass().add_subpass(vkb::ShaderSource("postprocessing/chromatic_aberration.frag")); + postprocessing_pipeline->add_pass().add_subpass(vkb::ShaderSource("postprocessing/chromatic_aberration.frag.spv")); // Trigger recreation of Swapchain and render targets, with initial compression parameters update_render_targets(); @@ -98,7 +92,7 @@ bool ImageCompressionControlSample::prepare(const vkb::ApplicationOptions &optio create_gui(*window, &get_stats()); // Hide GUI compression options other than default if the required extension is not supported - if (!get_device().is_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) + if (!get_device().is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) { for (int i = 0; i < static_cast(TargetCompression::Count); i++) { @@ -157,9 +151,9 @@ void ImageCompressionControlSample::create_render_context() std::vector new_surface_priority_list; for (auto const &surface_priority : get_surface_priority_list()) { - auto it = std::find_if(surface_formats_that_support_compression.begin(), surface_formats_that_support_compression.end(), - [&](VkSurfaceFormatKHR &sf) { return surface_priority.format == sf.format && - surface_priority.colorSpace == sf.colorSpace; }); + auto it = std::ranges::find_if(surface_formats_that_support_compression, + [&](VkSurfaceFormatKHR &sf) { return surface_priority.format == sf.format && + surface_priority.colorSpace == sf.colorSpace; }); if (it != surface_formats_that_support_compression.end()) { new_surface_priority_list.push_back(*it); @@ -221,7 +215,7 @@ std::unique_ptr ImageCompressionControlSample::create_render_ VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_SRGB}; VkFormat chosen_format{VK_FORMAT_UNDEFINED}; - if (get_device().is_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) + if (get_device().is_extension_enabled(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) { for (auto &candidate_format : format_list) { @@ -440,7 +434,7 @@ VkImageCompressionFixedRateFlagBitsEXT ImageCompressionControlSample::select_fix return VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT; } -void ImageCompressionControlSample::render(vkb::CommandBuffer &command_buffer) +void ImageCompressionControlSample::render(vkb::core::CommandBufferC &command_buffer) { // Scene (forward rendering) pass VulkanSample::render(command_buffer); @@ -484,7 +478,7 @@ inline T generate_combo(T current_value, const char *combo_label, const std::uno { for (const auto &it : enum_to_string) { - if (skip_values && std::find(skip_values->begin(), skip_values->end(), it.first) != skip_values->end()) + if (skip_values && std::ranges::find(*skip_values, it.first) != skip_values->end()) { continue; } diff --git a/samples/performance/image_compression_control/image_compression_control.h b/samples/performance/image_compression_control/image_compression_control.h index f9b4c8b17d..14477fabd8 100644 --- a/samples/performance/image_compression_control/image_compression_control.h +++ b/samples/performance/image_compression_control/image_compression_control.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -40,13 +40,13 @@ class ImageCompressionControlSample : public vkb::VulkanSampleC virtual bool prepare(const vkb::ApplicationOptions &options) override; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual ~ImageCompressionControlSample() = default; virtual void update(float delta_time) override; - virtual void render(vkb::CommandBuffer &command_buffer) override; + virtual void render(vkb::core::CommandBufferC &command_buffer) override; void draw_gui() override; diff --git a/samples/performance/layout_transitions/layout_transitions.cpp b/samples/performance/layout_transitions/layout_transitions.cpp index 505f05f40b..7667f48091 100644 --- a/samples/performance/layout_transitions/layout_transitions.cpp +++ b/samples/performance/layout_transitions/layout_transitions.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -36,6 +36,23 @@ LayoutTransitions::LayoutTransitions() config.insert(0, reinterpret_cast(layout_transition_type), LayoutTransitionType::UNDEFINED); config.insert(1, reinterpret_cast(layout_transition_type), LayoutTransitionType::LAST_LAYOUT); + +#if defined(PLATFORM__MACOS) && TARGET_OS_IOS && TARGET_OS_SIMULATOR + // On iOS Simulator use layer setting to disable MoltenVK's Metal argument buffers - otherwise blank display + add_instance_extension(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, /*optional*/ true); + + VkLayerSettingEXT layerSetting; + layerSetting.pLayerName = "MoltenVK"; + layerSetting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + layerSetting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + layerSetting.valueCount = 1; + + // Make this static so layer setting reference remains valid after leaving constructor scope + static const int32_t useMetalArgumentBuffers = 0; + layerSetting.pValues = &useMetalArgumentBuffers; + + add_layer_setting(layerSetting); +#endif } bool LayoutTransitions::prepare(const vkb::ApplicationOptions &options) @@ -50,8 +67,8 @@ bool LayoutTransitions::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert"}; - auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag"}; + auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert.spv"}; + auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag.spv"}; std::unique_ptr gbuffer_pass = std::make_unique(get_render_context(), std::move(geometry_vs), std::move(geometry_fs), get_scene(), *camera); @@ -59,8 +76,8 @@ bool LayoutTransitions::prepare(const vkb::ApplicationOptions &options) gbuffer_pipeline.add_subpass(std::move(gbuffer_pass)); gbuffer_pipeline.set_load_store(vkb::gbuffer::get_clear_store_all()); - auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert"}; - auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag"}; + auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert.spv"}; + auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag.spv"}; std::unique_ptr lighting_subpass = std::make_unique(get_render_context(), std::move(lighting_vs), std::move(lighting_fs), *camera, get_scene()); @@ -128,7 +145,7 @@ VkImageLayout LayoutTransitions::pick_old_layout(VkImageLayout last_layout) last_layout; } -void LayoutTransitions::draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void LayoutTransitions::draw(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { // POI // diff --git a/samples/performance/layout_transitions/layout_transitions.h b/samples/performance/layout_transitions/layout_transitions.h index d082678fc1..04072b479d 100644 --- a/samples/performance/layout_transitions/layout_transitions.h +++ b/samples/performance/layout_transitions/layout_transitions.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -47,7 +47,7 @@ class LayoutTransitions : public vkb::VulkanSampleC virtual void prepare_render_context() override; - void draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) override; + void draw(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) override; virtual void draw_gui() override; diff --git a/samples/performance/msaa/msaa.cpp b/samples/performance/msaa/msaa.cpp index 78809320e3..324760432d 100644 --- a/samples/performance/msaa/msaa.cpp +++ b/samples/performance/msaa/msaa.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -100,7 +100,7 @@ bool MSAASample::prepare(const vkb::ApplicationOptions &options) prepare_supported_sample_count_list(); - depth_writeback_resolve_supported = get_device().is_enabled(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME); + depth_writeback_resolve_supported = get_device().is_extension_enabled(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME); if (depth_writeback_resolve_supported) { prepare_depth_resolve_mode_list(); @@ -111,16 +111,19 @@ bool MSAASample::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = dynamic_cast(&camera_node.get_component()); - vkb::ShaderSource scene_vs("base.vert"); - vkb::ShaderSource scene_fs("base.frag"); + vkb::ShaderSource scene_vs{"base.vert.spv"}; + vkb::ShaderSource scene_fs{"base.frag.spv"}; auto scene_subpass = std::make_unique(get_render_context(), std::move(scene_vs), std::move(scene_fs), get_scene(), *camera); scene_pipeline = std::make_unique(); scene_pipeline->add_subpass(std::move(scene_subpass)); - vkb::ShaderSource postprocessing_vs("postprocessing/postprocessing.vert"); - postprocessing_pipeline = std::make_unique(get_render_context(), std::move(postprocessing_vs)); + postprocessing_pipeline = std::make_unique(get_render_context(), vkb::ShaderSource{"postprocessing/postprocessing.vert.spv"}); postprocessing_pipeline->add_pass() - .add_subpass(vkb::ShaderSource("postprocessing/outline.frag")); + .add_subpass(vkb::ShaderSource{"postprocessing/outline.frag.spv"}); + + ms_depth_postprocessing_pipeline = std::make_unique(get_render_context(), vkb::ShaderSource{"postprocessing/postprocessing.vert.spv"}); + ms_depth_postprocessing_pipeline->add_pass() + .add_subpass(vkb::ShaderSource{"postprocessing/outline_ms_depth.frag.spv"}); update_pipelines(); @@ -471,7 +474,7 @@ void MSAASample::disable_depth_writeback_resolve(std::unique_ptrset_depth_stencil_resolve_mode(VK_RESOLVE_MODE_NONE); } -void MSAASample::draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void MSAASample::draw(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { auto &views = render_target.get_views(); @@ -578,8 +581,10 @@ void MSAASample::draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &ren } } -void MSAASample::postprocessing(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target, - VkImageLayout &swapchain_layout, bool msaa_enabled) +void MSAASample::postprocessing(vkb::core::CommandBufferC &command_buffer, + vkb::RenderTarget &render_target, + VkImageLayout &swapchain_layout, + bool msaa_enabled) { auto depth_attachment = (msaa_enabled && depth_writeback_resolve_supported && resolve_depth_on_writeback) ? i_depth_resolve : i_depth; bool multisampled_depth = msaa_enabled && !(depth_writeback_resolve_supported && resolve_depth_on_writeback); @@ -587,7 +592,10 @@ void MSAASample::postprocessing(vkb::CommandBuffer &command_buffer, vkb::RenderT glm::vec4 near_far = {camera->get_far_plane(), camera->get_near_plane(), -1.0f, -1.0f}; - auto &postprocessing_pass = postprocessing_pipeline->get_pass(0); + // Select the currently active pipeline + auto &pipeline = multisampled_depth ? ms_depth_postprocessing_pipeline : postprocessing_pipeline; + + auto &postprocessing_pass = pipeline->get_pass(0); postprocessing_pass.set_uniform_data(near_far); auto &postprocessing_subpass = postprocessing_pass.get_subpass(0); @@ -596,17 +604,14 @@ void MSAASample::postprocessing(vkb::CommandBuffer &command_buffer, vkb::RenderT postprocessing_subpass.unbind_sampled_image("ms_depth_sampler"); postprocessing_subpass.get_fs_variant().clear(); - if (multisampled_depth) - { - postprocessing_subpass.get_fs_variant().add_define("MS_DEPTH"); - } + postprocessing_subpass .bind_sampled_image(depth_sampler_name, {depth_attachment, nullptr, nullptr, depth_writeback_resolve_supported && resolve_depth_on_writeback}) .bind_sampled_image("color_sampler", i_color_resolve); // Second render pass // NOTE: Color and depth attachments are automatically transitioned to be bound as textures - postprocessing_pipeline->draw(command_buffer, render_target); + pipeline->draw(command_buffer, render_target); if (has_gui()) { @@ -616,8 +621,10 @@ void MSAASample::postprocessing(vkb::CommandBuffer &command_buffer, vkb::RenderT command_buffer.end_render_pass(); } -void MSAASample::resolve_color_separate_pass(vkb::CommandBuffer &command_buffer, const std::vector &views, - uint32_t color_destination, VkImageLayout &color_layout) +void MSAASample::resolve_color_separate_pass(vkb::core::CommandBufferC &command_buffer, + const std::vector &views, + uint32_t color_destination, + VkImageLayout &color_layout) { { // The multisampled color is the source of the resolve operation diff --git a/samples/performance/msaa/msaa.h b/samples/performance/msaa/msaa.h index 86e37fbede..62b9835754 100644 --- a/samples/performance/msaa/msaa.h +++ b/samples/performance/msaa/msaa.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Arm Limited and Contributors +/* Copyright (c) 2023-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -71,7 +71,7 @@ class MSAASample : public vkb::VulkanSampleC virtual void update(float delta_time) override; - virtual void draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) override; void draw_gui() override; @@ -95,6 +95,13 @@ class MSAASample : public vkb::VulkanSampleC */ std::unique_ptr postprocessing_pipeline{}; + /** + * @brief Postprocessing pipeline using multi-sampled depth + * Read in the output color and depth attachments from the + * scene subpass and use them to apply a screen-based effect + */ + std::unique_ptr ms_depth_postprocessing_pipeline{}; + /** * @brief Update MSAA options and accordingly set the load/store * attachment operations for the renderpasses @@ -126,8 +133,7 @@ class MSAASample : public vkb::VulkanSampleC * and depth attachments and uses them to apply a screen-based effect * It also draws the GUI */ - void postprocessing(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target, - VkImageLayout &swapchain_layout, bool msaa_enabled); + void postprocessing(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target, VkImageLayout &swapchain_layout, bool msaa_enabled); /** * @brief Enables MSAA if set to more than 1 sample per pixel @@ -185,8 +191,10 @@ class MSAASample : public vkb::VulkanSampleC * color_layout is an in-out parameter that holds the last known layout * of the resolve attachment, and may be used for any further transitions */ - void resolve_color_separate_pass(vkb::CommandBuffer &command_buffer, const std::vector &views, - uint32_t color_destination, VkImageLayout &color_layout); + void resolve_color_separate_pass(vkb::core::CommandBufferC &command_buffer, + const std::vector &views, + uint32_t color_destination, + VkImageLayout &color_layout); /** * @brief If true, the platform supports the VK_KHR_depth_stencil_resolve extension diff --git a/samples/performance/multi_draw_indirect/README.adoc b/samples/performance/multi_draw_indirect/README.adoc index 7793ebbb4c..9bce06e802 100644 --- a/samples/performance/multi_draw_indirect/README.adoc +++ b/samples/performance/multi_draw_indirect/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2023, Holochip Corporation +- Copyright (c) 2021-2025, Holochip Corporation - - SPDX-License-Identifier: Apache-2.0 - @@ -49,7 +49,7 @@ Each command contains the vertex offset, index offset, and index count. To control whether a sub-mesh is drawn, the instance count is set to either 0 or 1. Alternatively, the draw command could be completely removed from the array. -If = device supports multi-draw indirect (`VkPhysicalDeviceFeatures2::bufferDeviceAddress`), then the entire array of draw commands can be executed through a single call to `VkDrawIndexedIndirectCommand`. +If the device supports multi-draw indirect (`VkPhysicalDeviceFeatures2::multiDrawIndirect`), then the entire array of draw commands can be executed through a single call to `VkDrawIndexedIndirectCommand`. Otherwise, each draw call must be executed through a separate call to `VkDrawIndexIndirectCommand`: [,cpp] diff --git a/samples/performance/multi_draw_indirect/multi_draw_indirect.cpp b/samples/performance/multi_draw_indirect/multi_draw_indirect.cpp index 6d3f6c8d8b..77989aa420 100644 --- a/samples/performance/multi_draw_indirect/multi_draw_indirect.cpp +++ b/samples/performance/multi_draw_indirect/multi_draw_indirect.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Holochip Corporation +/* Copyright (c) 2021-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -93,7 +93,7 @@ MultiDrawIndirect::~MultiDrawIndirect() } } -void MultiDrawIndirect::request_gpu_features(vkb::PhysicalDevice &gpu) +void MultiDrawIndirect::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().multiDrawIndirect) { @@ -109,7 +109,7 @@ void MultiDrawIndirect::request_gpu_features(vkb::PhysicalDevice &gpu) // Query whether the device supports buffer device addresses m_supports_buffer_device = - REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, bufferDeviceAddress); + REQUEST_OPTIONAL_FEATURE(gpu, VkPhysicalDeviceVulkan12Features, bufferDeviceAddress); // This sample references 128 objects. We need to check whether this is supported by the device VkPhysicalDeviceProperties physical_device_properties; @@ -198,13 +198,13 @@ void MultiDrawIndirect::on_update_ui_overlay(vkb::Drawer &drawer) assert(!!indirect_call_buffer && !!cpu_staging_buffer && indirect_call_buffer->get_size() == cpu_staging_buffer->get_size()); assert(cpu_commands.size() * sizeof(cpu_commands[0]) == cpu_staging_buffer->get_size()); - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - cmd.copy_buffer(*indirect_call_buffer, *cpu_staging_buffer, cpu_staging_buffer->get_size()); - cmd.end(); + ui_overlay_command_buffer->reset(vkb::CommandBufferResetMode::ResetIndividually); + ui_overlay_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + ui_overlay_command_buffer->copy_buffer(*indirect_call_buffer, *cpu_staging_buffer, cpu_staging_buffer->get_size()); + ui_overlay_command_buffer->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_COMPUTE_BIT, 0); - queue.submit(cmd, get_device().request_fence()); + queue.submit(*ui_overlay_command_buffer, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); memcpy(cpu_commands.data(), cpu_staging_buffer->get_data(), cpu_staging_buffer->get_size()); @@ -278,6 +278,8 @@ bool MultiDrawIndirect::prepare(const vkb::ApplicationOptions &options) } } + ui_overlay_command_buffer = get_device().get_command_pool().request_command_buffer(); + create_samplers(); load_scene(); initialize_resources(); @@ -324,15 +326,15 @@ void MultiDrawIndirect::load_scene() auto data_buffer = vkb::core::BufferC::create_staging_buffer(get_device(), image->get_data()); - auto &texture_cmd = get_device().get_command_pool().request_command_buffer(); - texture_cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + auto texture_cmd = get_device().get_command_pool().request_command_buffer(); + texture_cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; subresource_range.baseMipLevel = 0; subresource_range.levelCount = texture.n_mip_maps; vkb::image_layout_transition( - texture_cmd.get_handle(), texture.image->get_handle(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, subresource_range); + texture_cmd->get_handle(), texture.image->get_handle(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, subresource_range); auto offsets = image->get_offsets(); VkBufferImageCopy region = {}; @@ -343,11 +345,11 @@ void MultiDrawIndirect::load_scene() region.imageExtent = image->get_extent(); region.bufferOffset = offsets[0][0]; - texture_cmd.copy_buffer_to_image(data_buffer, *texture.image, {region}); - texture_cmd.end(); + texture_cmd->copy_buffer_to_image(data_buffer, *texture.image, {region}); + texture_cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(texture_cmd, get_device().request_fence()); + queue.submit(*texture_cmd, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); get_device().get_fence_pool().reset(); @@ -414,12 +416,12 @@ void MultiDrawIndirect::load_scene() std::make_pair(texture.image->get_handle(), VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, texture.n_mip_maps, 0, 1})); } - auto &cmd = get_device().get_command_pool().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); - vkb::image_layout_transition(cmd.get_handle(), imagesAndRanges, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - cmd.end(); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + vkb::image_layout_transition(cmd->get_handle(), imagesAndRanges, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(cmd, get_device().request_fence()); + queue.submit(*cmd, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); } @@ -484,18 +486,18 @@ void MultiDrawIndirect::initialize_resources() staging_index_buffer.flush(); staging_model_buffer.flush(); - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); auto copy = [this, &cmd](vkb::core::BufferC &staging_buffer, VkBufferUsageFlags buffer_usage_flags) { auto output_buffer = std::make_unique(get_device(), staging_buffer.get_size(), buffer_usage_flags | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_ONLY, VMA_ALLOCATION_CREATE_MAPPED_BIT, queue_families); - cmd.copy_buffer(staging_buffer, *output_buffer, staging_buffer.get_size()); + cmd->copy_buffer(staging_buffer, *output_buffer, staging_buffer.get_size()); vkb::BufferMemoryBarrier barrier; barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; barrier.dst_stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; barrier.src_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; - cmd.buffer_memory_barrier(*output_buffer, 0, VK_WHOLE_SIZE, barrier); + cmd->buffer_memory_barrier(*output_buffer, 0, VK_WHOLE_SIZE, barrier); return output_buffer; }; vertex_buffer = copy(staging_vertex_buffer, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); @@ -509,9 +511,9 @@ void MultiDrawIndirect::initialize_resources() device_address_buffer = copy(*staging_address_buffer, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); } - cmd.end(); + cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(cmd, get_device().request_fence()); + queue.submit(*cmd, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); } @@ -642,8 +644,8 @@ void MultiDrawIndirect::create_pipeline() pipeline_create_info.pDynamicState = &dynamic_state; const std::array shader_stages = { - load_shader("multi_draw_indirect/multi_draw_indirect.vert", VK_SHADER_STAGE_VERTEX_BIT), - load_shader("multi_draw_indirect/multi_draw_indirect.frag", VK_SHADER_STAGE_FRAGMENT_BIT)}; + load_shader("multi_draw_indirect/multi_draw_indirect.vert.spv", VK_SHADER_STAGE_VERTEX_BIT), + load_shader("multi_draw_indirect/multi_draw_indirect.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT)}; pipeline_create_info.stageCount = static_cast(shader_stages.size()); pipeline_create_info.pStages = shader_stages.data(); @@ -660,11 +662,11 @@ void MultiDrawIndirect::create_compute_pipeline() VK_CHECK(vkCreateComputePipelines(get_device().get_handle(), pipeline_cache, 1, &compute_create_info, nullptr, &_pipeline)); }; - create(gpu_cull_pipeline_layout, gpu_cull_pipeline, "multi_draw_indirect/cull.comp"); + create(gpu_cull_pipeline_layout, gpu_cull_pipeline, "multi_draw_indirect/cull.comp.spv"); if (m_supports_buffer_device) { - create(device_address_pipeline_layout, device_address_pipeline, "multi_draw_indirect/cull_address.comp"); + create(device_address_pipeline_layout, device_address_pipeline, "multi_draw_indirect/cull_address.comp.spv"); } } @@ -838,7 +840,7 @@ void MultiDrawIndirect::run_gpu_cull() submit.commandBufferCount = 1; submit.pCommandBuffers = &cmd; - vkQueueSubmit(compute_queue->get_handle(), 1, &submit, get_device().request_fence()); + vkQueueSubmit(compute_queue->get_handle(), 1, &submit, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); get_device().get_fence_pool().reset(); // we're done so dealloc it from the pool. @@ -886,7 +888,7 @@ struct VisibilityTester { using namespace glm; std::array V{0, 1, 4, 5}; - return std::all_of(V.begin(), V.end(), [this, origin, radius](size_t i) { + return std::ranges::all_of(V, [this, origin, radius](size_t i) { const auto &plane = planes[i]; return dot(origin, vec3(plane.xyz)) + plane.w + radius >= 0; }); @@ -924,13 +926,13 @@ void MultiDrawIndirect::cpu_cull() cpu_staging_buffer->update(cpu_commands.data(), call_buffer_size, 0); cpu_staging_buffer->flush(); - auto &transfer_cmd = get_device().get_command_pool().request_command_buffer(); - transfer_cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); - transfer_cmd.copy_buffer(*cpu_staging_buffer, *indirect_call_buffer, call_buffer_size); - transfer_cmd.end(); + auto transfer_cmd = get_device().get_command_pool().request_command_buffer(); + transfer_cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE); + transfer_cmd->copy_buffer(*cpu_staging_buffer, *indirect_call_buffer, call_buffer_size); + transfer_cmd->end(); auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - queue.submit(transfer_cmd, get_device().request_fence()); + queue.submit(*transfer_cmd, get_device().get_fence_pool().request_fence()); get_device().get_fence_pool().wait(); } diff --git a/samples/performance/multi_draw_indirect/multi_draw_indirect.h b/samples/performance/multi_draw_indirect/multi_draw_indirect.h index 345cfb2bb1..4ed143167a 100644 --- a/samples/performance/multi_draw_indirect/multi_draw_indirect.h +++ b/samples/performance/multi_draw_indirect/multi_draw_indirect.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Holochip Corporation +/* Copyright (c) 2021-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -124,9 +124,11 @@ class MultiDrawIndirect : public ApiVulkanSample VkDescriptorSet device_address_descriptor_set{VK_NULL_HANDLE}; std::unique_ptr device_address_buffer{nullptr}; - std::vector compute_command_buffers{}; - const vkb::Queue *compute_queue{nullptr}; - std::vector queue_families; + std::vector compute_command_buffers{}; + const vkb::Queue *compute_queue{nullptr}; + std::vector queue_families; + + std::shared_ptr ui_overlay_command_buffer; // CPU Draw Calls void cpu_cull(); @@ -134,7 +136,7 @@ class MultiDrawIndirect : public ApiVulkanSample std::unique_ptr cpu_staging_buffer; std::unique_ptr indirect_call_buffer; - void request_gpu_features(vkb::PhysicalDevice &gpu) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; void build_command_buffers() override; void on_update_ui_overlay(vkb::Drawer &drawer) override; void create_samplers(); diff --git a/samples/performance/multithreading_render_passes/multithreading_render_passes.cpp b/samples/performance/multithreading_render_passes/multithreading_render_passes.cpp index 083dfe4c9c..ce7704b6fe 100644 --- a/samples/performance/multithreading_render_passes/multithreading_render_passes.cpp +++ b/samples/performance/multithreading_render_passes/multithreading_render_passes.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2020-2024, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -39,12 +39,11 @@ MultithreadingRenderPasses::MultithreadingRenderPasses() config.insert(2, multithreading_mode, 2); } -void MultithreadingRenderPasses::request_gpu_features(vkb::PhysicalDevice &gpu) +void MultithreadingRenderPasses::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { #ifdef VKB_ENABLE_PORTABILITY // Since shadowmap_sampler_create_info.compareEnable = VK_TRUE, must enable the mutableComparisonSamplers feature of VK_KHR_portability_subset - REQUEST_REQUIRED_FEATURE( - gpu, VkPhysicalDevicePortabilitySubsetFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, mutableComparisonSamplers); + REQUEST_REQUIRED_FEATURE(gpu, VkPhysicalDevicePortabilitySubsetFeaturesKHR, mutableComparisonSamplers); #endif } @@ -114,8 +113,8 @@ std::unique_ptr MultithreadingRenderPasses::create_shadow_ren std::unique_ptr MultithreadingRenderPasses::create_shadow_renderpass() { // Shadowmap subpass - auto shadowmap_vs = vkb::ShaderSource{"shadows/shadowmap.vert"}; - auto shadowmap_fs = vkb::ShaderSource{"shadows/shadowmap.frag"}; + auto shadowmap_vs = vkb::ShaderSource{"shadows/shadowmap.vert.spv"}; + auto shadowmap_fs = vkb::ShaderSource{"shadows/shadowmap.frag.spv"}; auto scene_subpass = std::make_unique(get_render_context(), std::move(shadowmap_vs), std::move(shadowmap_fs), get_scene(), *shadowmap_camera); shadow_subpass = scene_subpass.get(); @@ -130,8 +129,8 @@ std::unique_ptr MultithreadingRenderPasses::create_shadow_r std::unique_ptr MultithreadingRenderPasses::create_main_renderpass() { // Main subpass - auto main_vs = vkb::ShaderSource{"shadows/main.vert"}; - auto main_fs = vkb::ShaderSource{"shadows/main.frag"}; + auto main_vs = vkb::ShaderSource{"shadows/main.vert.spv"}; + auto main_fs = vkb::ShaderSource{"shadows/main.frag.spv"}; auto scene_subpass = std::make_unique( get_render_context(), std::move(main_vs), std::move(main_fs), get_scene(), *camera, *shadowmap_camera, shadow_render_targets); @@ -153,7 +152,7 @@ void MultithreadingRenderPasses::update(float delta_time) update_gui(delta_time); - auto &main_command_buffer = get_render_context().begin(); + auto main_command_buffer = get_render_context().begin(); auto command_buffers = record_command_buffers(main_command_buffer); @@ -186,22 +185,18 @@ void MultithreadingRenderPasses::draw_gui() lines); } -std::vector MultithreadingRenderPasses::record_command_buffers(vkb::CommandBuffer &main_command_buffer) +std::vector> + MultithreadingRenderPasses::record_command_buffers(std::shared_ptr main_command_buffer) { - auto reset_mode = vkb::CommandBuffer::ResetMode::ResetPool; + auto reset_mode = vkb::CommandBufferResetMode::ResetPool; const auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); - std::vector command_buffers; + std::vector> command_buffers; // Resources are requested from pools for thread #1 in shadow pass if multithreading is used auto use_multithreading = multithreading_mode != static_cast(MultithreadingMode::None); shadow_subpass->set_thread_index(use_multithreading ? 1 : 0); - if (use_multithreading && thread_pool.size() < 1) - { - thread_pool.resize(1); - } - switch (multithreading_mode) { case static_cast(MultithreadingMode::PrimaryCommandBuffers): @@ -211,118 +206,115 @@ std::vector MultithreadingRenderPasses::record_command_buf record_separate_secondary_command_buffers(command_buffers, main_command_buffer); break; default: - main_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - draw_shadow_pass(main_command_buffer); - draw_main_pass(main_command_buffer); - main_command_buffer.end(); - command_buffers.push_back(&main_command_buffer); + main_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + draw_shadow_pass(*main_command_buffer); + draw_main_pass(*main_command_buffer); + main_command_buffer->end(); + command_buffers.push_back(main_command_buffer); break; } return command_buffers; } -void MultithreadingRenderPasses::record_separate_primary_command_buffers(std::vector &command_buffers, vkb::CommandBuffer &main_command_buffer) +void MultithreadingRenderPasses::record_separate_primary_command_buffers(std::vector> &command_buffers, + std::shared_ptr main_command_buffer) { - auto reset_mode = vkb::CommandBuffer::ResetMode::ResetPool; + auto reset_mode = vkb::CommandBufferResetMode::ResetPool; const auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); // Shadow pass will be recorded in thread with id 1 - auto &shadow_command_buffer = get_render_context().get_active_frame().request_command_buffer(queue, - reset_mode, - VK_COMMAND_BUFFER_LEVEL_PRIMARY, - 1); + auto shadow_command_buffer = + get_render_context().get_active_frame().get_command_pool(queue, reset_mode, 1).request_command_buffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY); // Recording shadow command buffer - auto shadow_buffer_future = thread_pool.push( - [this, &shadow_command_buffer](size_t thread_id) { - shadow_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - draw_shadow_pass(shadow_command_buffer); - shadow_command_buffer.end(); + auto shadow_buffer_future = std::async( + [this, shadow_command_buffer]() { + shadow_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + draw_shadow_pass(*shadow_command_buffer); + shadow_command_buffer->end(); }); // Recording scene command buffer - main_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - draw_main_pass(main_command_buffer); - main_command_buffer.end(); + main_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + draw_main_pass(*main_command_buffer); + main_command_buffer->end(); - command_buffers.push_back(&shadow_command_buffer); - command_buffers.push_back(&main_command_buffer); + command_buffers.push_back(shadow_command_buffer); + command_buffers.push_back(main_command_buffer); // Wait for recording shadow_buffer_future.get(); } -void MultithreadingRenderPasses::record_separate_secondary_command_buffers(std::vector &command_buffers, vkb::CommandBuffer &main_command_buffer) +void MultithreadingRenderPasses::record_separate_secondary_command_buffers(std::vector> &command_buffers, + std::shared_ptr main_command_buffer) { - auto reset_mode = vkb::CommandBuffer::ResetMode::ResetPool; + auto reset_mode = vkb::CommandBufferResetMode::ResetPool; const auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); // Main pass will be recorded in thread with id 0 - auto &scene_command_buffer = get_render_context().get_active_frame().request_command_buffer(queue, - reset_mode, - VK_COMMAND_BUFFER_LEVEL_SECONDARY, - 0); + auto scene_command_buffer = + get_render_context().get_active_frame().get_command_pool(queue, reset_mode, 0).request_command_buffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY); // Shadow pass will be recorded in thread with id 1 - auto &shadow_command_buffer = get_render_context().get_active_frame().request_command_buffer(queue, - reset_mode, - VK_COMMAND_BUFFER_LEVEL_SECONDARY, - 1); + auto shadow_command_buffer = + get_render_context().get_active_frame().get_command_pool(queue, reset_mode, 1).request_command_buffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY); // Same framebuffer and render pass should be specified in the inheritance info for secondary command buffers // and vkCmdBeginRenderPass for primary command buffers auto &shadow_render_target = *shadow_render_targets[get_render_context().get_active_frame_index()]; - auto &shadow_render_pass = main_command_buffer.get_render_pass(shadow_render_target, shadow_render_pipeline->get_load_store(), shadow_render_pipeline->get_subpasses()); + auto &shadow_render_pass = main_command_buffer->get_render_pass(shadow_render_target, shadow_render_pipeline->get_load_store(), shadow_render_pipeline->get_subpasses()); auto &shadow_framebuffer = get_device().get_resource_cache().request_framebuffer(shadow_render_target, shadow_render_pass); auto &scene_render_target = get_render_context().get_active_frame().get_render_target(); - auto &scene_render_pass = main_command_buffer.get_render_pass(scene_render_target, main_render_pipeline->get_load_store(), main_render_pipeline->get_subpasses()); + auto &scene_render_pass = main_command_buffer->get_render_pass(scene_render_target, main_render_pipeline->get_load_store(), main_render_pipeline->get_subpasses()); auto &scene_framebuffer = get_device().get_resource_cache().request_framebuffer(scene_render_target, scene_render_pass); // Recording shadow command buffer - auto shadow_buffer_future = thread_pool.push( - [this, &shadow_command_buffer, &shadow_render_pass, &shadow_framebuffer](size_t thread_id) { - shadow_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &shadow_render_pass, &shadow_framebuffer, 0); - draw_shadow_pass(shadow_command_buffer); - shadow_command_buffer.end(); + auto shadow_buffer_future = std::async( + [this, shadow_command_buffer, &shadow_render_pass, &shadow_framebuffer]() { + shadow_command_buffer->begin( + VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &shadow_render_pass, &shadow_framebuffer, 0); + draw_shadow_pass(*shadow_command_buffer); + shadow_command_buffer->end(); }); // Recording scene command buffer vkb::ColorBlendState scene_color_blend_state; scene_color_blend_state.attachments.resize(scene_render_pass.get_color_output_count(0)); - scene_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &scene_render_pass, &scene_framebuffer, 0); - scene_command_buffer.set_color_blend_state(scene_color_blend_state); - draw_main_pass(scene_command_buffer); - scene_command_buffer.end(); + scene_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &scene_render_pass, &scene_framebuffer, 0); + scene_command_buffer->set_color_blend_state(scene_color_blend_state); + draw_main_pass(*scene_command_buffer); + scene_command_buffer->end(); // Wait for recording shadow_buffer_future.get(); // Recording main command buffer - main_command_buffer.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + main_command_buffer->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - record_shadow_pass_image_memory_barrier(main_command_buffer); + record_shadow_pass_image_memory_barrier(*main_command_buffer); - main_command_buffer.begin_render_pass(shadow_render_target, shadow_render_pass, shadow_framebuffer, shadow_render_pipeline->get_clear_value(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); - main_command_buffer.execute_commands(shadow_command_buffer); - main_command_buffer.end_render_pass(); + main_command_buffer->begin_render_pass(shadow_render_target, shadow_render_pass, shadow_framebuffer, shadow_render_pipeline->get_clear_value(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); + main_command_buffer->execute_commands(*shadow_command_buffer); + main_command_buffer->end_render_pass(); - record_main_pass_image_memory_barriers(main_command_buffer); + record_main_pass_image_memory_barriers(*main_command_buffer); - main_command_buffer.begin_render_pass(scene_render_target, scene_render_pass, scene_framebuffer, main_render_pipeline->get_clear_value(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); - main_command_buffer.execute_commands(scene_command_buffer); - main_command_buffer.end_render_pass(); + main_command_buffer->begin_render_pass(scene_render_target, scene_render_pass, scene_framebuffer, main_render_pipeline->get_clear_value(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); + main_command_buffer->execute_commands(*scene_command_buffer); + main_command_buffer->end_render_pass(); - record_present_image_memory_barrier(main_command_buffer); + record_present_image_memory_barrier(*main_command_buffer); - main_command_buffer.end(); + main_command_buffer->end(); - command_buffers.push_back(&main_command_buffer); + command_buffers.push_back(main_command_buffer); } -void MultithreadingRenderPasses::record_main_pass_image_memory_barriers(vkb::CommandBuffer &command_buffer) +void MultithreadingRenderPasses::record_main_pass_image_memory_barriers(vkb::core::CommandBufferC &command_buffer) { auto &views = get_render_context().get_active_frame().get_render_target().get_views(); @@ -368,7 +360,7 @@ void MultithreadingRenderPasses::record_main_pass_image_memory_barriers(vkb::Com } } -void MultithreadingRenderPasses::record_shadow_pass_image_memory_barrier(vkb::CommandBuffer &command_buffer) +void MultithreadingRenderPasses::record_shadow_pass_image_memory_barrier(vkb::core::CommandBufferC &command_buffer) { assert(shadowmap_attachment_index < shadow_render_targets[get_render_context().get_active_frame_index()]->get_views().size()); auto &shadowmap = shadow_render_targets[get_render_context().get_active_frame_index()]->get_views()[shadowmap_attachment_index]; @@ -384,7 +376,7 @@ void MultithreadingRenderPasses::record_shadow_pass_image_memory_barrier(vkb::Co command_buffer.image_memory_barrier(shadowmap, memory_barrier); } -void MultithreadingRenderPasses::record_present_image_memory_barrier(vkb::CommandBuffer &command_buffer) +void MultithreadingRenderPasses::record_present_image_memory_barrier(vkb::core::CommandBufferC &command_buffer) { auto &views = get_render_context().get_active_frame().get_render_target().get_views(); @@ -399,14 +391,14 @@ void MultithreadingRenderPasses::record_present_image_memory_barrier(vkb::Comman command_buffer.image_memory_barrier(views[swapchain_attachment_index], memory_barrier); } -void MultithreadingRenderPasses::draw_shadow_pass(vkb::CommandBuffer &command_buffer) +void MultithreadingRenderPasses::draw_shadow_pass(vkb::core::CommandBufferC &command_buffer) { auto &shadow_render_target = *shadow_render_targets[get_render_context().get_active_frame_index()]; auto &shadowmap_extent = shadow_render_target.get_extent(); set_viewport_and_scissor(command_buffer, shadowmap_extent); - if (command_buffer.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) + if (command_buffer.get_level() == VK_COMMAND_BUFFER_LEVEL_SECONDARY) { shadow_render_pipeline->get_active_subpass()->draw(command_buffer); } @@ -418,14 +410,14 @@ void MultithreadingRenderPasses::draw_shadow_pass(vkb::CommandBuffer &command_bu } } -void MultithreadingRenderPasses::draw_main_pass(vkb::CommandBuffer &command_buffer) +void MultithreadingRenderPasses::draw_main_pass(vkb::core::CommandBufferC &command_buffer) { auto &render_target = get_render_context().get_active_frame().get_render_target(); auto &extent = render_target.get_extent(); set_viewport_and_scissor(command_buffer, extent); - bool is_secondary_command_buffer = command_buffer.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY; + bool is_secondary_command_buffer = command_buffer.get_level() == VK_COMMAND_BUFFER_LEVEL_SECONDARY; if (is_secondary_command_buffer) { @@ -449,7 +441,7 @@ void MultithreadingRenderPasses::draw_main_pass(vkb::CommandBuffer &command_buff } } -MultithreadingRenderPasses::MainSubpass::MainSubpass(vkb::RenderContext &render_context, +MultithreadingRenderPasses::MainSubpass::MainSubpass(vkb::rendering::RenderContextC &render_context, vkb::ShaderSource &&vertex_source, vkb::ShaderSource &&fragment_source, vkb::sg::Scene &scene, @@ -487,7 +479,7 @@ void MultithreadingRenderPasses::MainSubpass::prepare() shadowmap_sampler = std::make_unique(get_render_context().get_device(), shadowmap_sampler_create_info); } -void MultithreadingRenderPasses::MainSubpass::draw(vkb::CommandBuffer &command_buffer) +void MultithreadingRenderPasses::MainSubpass::draw(vkb::core::CommandBufferC &command_buffer) { ShadowUniform shadow_uniform; shadow_uniform.shadowmap_projection_matrix = vkb::rendering::vulkan_style_projection(shadowmap_camera.get_projection()) * shadowmap_camera.get_view(); @@ -506,16 +498,18 @@ void MultithreadingRenderPasses::MainSubpass::draw(vkb::CommandBuffer &command_b ForwardSubpass::draw(command_buffer); } -MultithreadingRenderPasses::ShadowSubpass::ShadowSubpass(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_source, - vkb::ShaderSource &&fragment_source, - vkb::sg::Scene &scene, - vkb::sg::Camera &camera) : +MultithreadingRenderPasses::ShadowSubpass::ShadowSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_source, + vkb::ShaderSource &&fragment_source, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera) : vkb::GeometrySubpass{render_context, std::move(vertex_source), std::move(fragment_source), scene, camera} { } -void MultithreadingRenderPasses::ShadowSubpass::prepare_pipeline_state(vkb::CommandBuffer &command_buffer, VkFrontFace front_face, bool double_sided_material) +void MultithreadingRenderPasses::ShadowSubpass::prepare_pipeline_state(vkb::core::CommandBufferC &command_buffer, + VkFrontFace front_face, + bool double_sided_material) { // Enabling depth bias to get rid of self-shadowing artifacts // Depth bias literally "pushes" slightly all the primitives further away from the camera taking their slope into account @@ -537,7 +531,8 @@ void MultithreadingRenderPasses::ShadowSubpass::prepare_pipeline_state(vkb::Comm command_buffer.set_multisample_state(multisample_state); } -vkb::PipelineLayout &MultithreadingRenderPasses::ShadowSubpass::prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) +vkb::PipelineLayout &MultithreadingRenderPasses::ShadowSubpass::prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) { // Only vertex shader is needed in the shadow subpass assert(!shader_modules.empty()); @@ -548,7 +543,8 @@ vkb::PipelineLayout &MultithreadingRenderPasses::ShadowSubpass::prepare_pipeline return command_buffer.get_device().get_resource_cache().request_pipeline_layout({vertex_shader_module}); } -void MultithreadingRenderPasses::ShadowSubpass::prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) +void MultithreadingRenderPasses::ShadowSubpass::prepare_push_constants(vkb::core::CommandBufferC &command_buffer, + vkb::sg::SubMesh &sub_mesh) { // No push constants are used the in shadow pass return; diff --git a/samples/performance/multithreading_render_passes/multithreading_render_passes.h b/samples/performance/multithreading_render_passes/multithreading_render_passes.h index f30ca623f4..06b34db4f8 100644 --- a/samples/performance/multithreading_render_passes/multithreading_render_passes.h +++ b/samples/performance/multithreading_render_passes/multithreading_render_passes.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Arm Limited and Contributors +/* Copyright (c) 2023-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,8 +17,6 @@ #pragma once -#include - #include "core/command_buffer.h" #include "rendering/render_pipeline.h" #include "rendering/subpasses/forward_subpass.h" @@ -49,7 +47,7 @@ class MultithreadingRenderPasses : public vkb::VulkanSampleC virtual ~MultithreadingRenderPasses() = default; - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; virtual bool prepare(const vkb::ApplicationOptions &options) override; @@ -63,18 +61,20 @@ class MultithreadingRenderPasses : public vkb::VulkanSampleC class ShadowSubpass : public vkb::GeometrySubpass { public: - ShadowSubpass(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_source, - vkb::ShaderSource &&fragment_source, - vkb::sg::Scene &scene, - vkb::sg::Camera &camera); + ShadowSubpass(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_source, + vkb::ShaderSource &&fragment_source, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera); protected: - virtual void prepare_pipeline_state(vkb::CommandBuffer &command_buffer, VkFrontFace front_face, bool double_sided_material) override; + virtual void prepare_pipeline_state(vkb::core::CommandBufferC &command_buffer, VkFrontFace front_face, bool double_sided_material) + override; - virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::CommandBuffer &command_buffer, const std::vector &shader_modules) override; + virtual vkb::PipelineLayout &prepare_pipeline_layout(vkb::core::CommandBufferC &command_buffer, + const std::vector &shader_modules) override; - virtual void prepare_push_constants(vkb::CommandBuffer &command_buffer, vkb::sg::SubMesh &sub_mesh) override; + virtual void prepare_push_constants(vkb::core::CommandBufferC &command_buffer, vkb::sg::SubMesh &sub_mesh) override; }; /** @@ -84,7 +84,7 @@ class MultithreadingRenderPasses : public vkb::VulkanSampleC class MainSubpass : public vkb::ForwardSubpass { public: - MainSubpass(vkb::RenderContext &render_context, + MainSubpass(vkb::rendering::RenderContextC &render_context, vkb::ShaderSource &&vertex_source, vkb::ShaderSource &&fragment_source, vkb::sg::Scene &scene, @@ -94,7 +94,7 @@ class MultithreadingRenderPasses : public vkb::VulkanSampleC virtual void prepare() override; - virtual void draw(vkb::CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; private: std::unique_ptr shadowmap_sampler{}; @@ -148,8 +148,6 @@ class MultithreadingRenderPasses : public vkb::VulkanSampleC */ vkb::sg::Camera *camera{}; - ctpl::thread_pool thread_pool; - uint32_t swapchain_attachment_index{0}; uint32_t depth_attachment_index{1}; @@ -163,21 +161,23 @@ class MultithreadingRenderPasses : public vkb::VulkanSampleC * @param main_command_buffer Already allocated command buffer for the main pass * @return Single or multiple recorded command buffers */ - std::vector record_command_buffers(vkb::CommandBuffer &main_command_buffer); + std::vector> record_command_buffers(std::shared_ptr main_command_buffer); - void record_separate_primary_command_buffers(std::vector &command_buffers, vkb::CommandBuffer &main_command_buffer); + void record_separate_primary_command_buffers(std::vector> &command_buffers, + std::shared_ptr main_command_buffer); - void record_separate_secondary_command_buffers(std::vector &command_buffers, vkb::CommandBuffer &main_command_buffer); + void record_separate_secondary_command_buffers(std::vector> &command_buffers, + std::shared_ptr main_command_buffer); - void record_main_pass_image_memory_barriers(vkb::CommandBuffer &command_buffer); + void record_main_pass_image_memory_barriers(vkb::core::CommandBufferC &command_buffer); - void record_shadow_pass_image_memory_barrier(vkb::CommandBuffer &command_buffer); + void record_shadow_pass_image_memory_barrier(vkb::core::CommandBufferC &command_buffer); - void record_present_image_memory_barrier(vkb::CommandBuffer &command_buffer); + void record_present_image_memory_barrier(vkb::core::CommandBufferC &command_buffer); - void draw_shadow_pass(vkb::CommandBuffer &command_buffer); + void draw_shadow_pass(vkb::core::CommandBufferC &command_buffer); - void draw_main_pass(vkb::CommandBuffer &command_buffer); + void draw_main_pass(vkb::core::CommandBufferC &command_buffer); }; std::unique_ptr create_multithreading_render_passes(); diff --git a/samples/performance/pipeline_barriers/pipeline_barriers.cpp b/samples/performance/pipeline_barriers/pipeline_barriers.cpp index a7859c2c80..1f8272427a 100644 --- a/samples/performance/pipeline_barriers/pipeline_barriers.cpp +++ b/samples/performance/pipeline_barriers/pipeline_barriers.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -38,6 +38,23 @@ PipelineBarriers::PipelineBarriers() config.insert(0, reinterpret_cast(dependency_type), DependencyType::BOTTOM_TO_TOP); config.insert(1, reinterpret_cast(dependency_type), DependencyType::FRAG_TO_VERT); config.insert(2, reinterpret_cast(dependency_type), DependencyType::FRAG_TO_FRAG); + +#if defined(PLATFORM__MACOS) && TARGET_OS_IOS && TARGET_OS_SIMULATOR + // On iOS Simulator use layer setting to disable MoltenVK's Metal argument buffers - otherwise blank display + add_instance_extension(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, /*optional*/ true); + + VkLayerSettingEXT layerSetting; + layerSetting.pLayerName = "MoltenVK"; + layerSetting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + layerSetting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + layerSetting.valueCount = 1; + + // Make this static so layer setting reference remains valid after leaving constructor scope + static const int32_t useMetalArgumentBuffers = 0; + layerSetting.pValues = &useMetalArgumentBuffers; + + add_layer_setting(layerSetting); +#endif } bool PipelineBarriers::prepare(const vkb::ApplicationOptions &options) @@ -84,16 +101,16 @@ bool PipelineBarriers::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert"}; - auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag"}; + auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert.spv"}; + auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag.spv"}; auto gbuffer_pass = std::make_unique(get_render_context(), std::move(geometry_vs), std::move(geometry_fs), get_scene(), *camera); gbuffer_pass->set_output_attachments({1, 2, 3}); gbuffer_pipeline.add_subpass(std::move(gbuffer_pass)); gbuffer_pipeline.set_load_store(vkb::gbuffer::get_clear_store_all()); - auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert"}; - auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag"}; + auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert.spv"}; + auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag.spv"}; auto lighting_subpass = std::make_unique(get_render_context(), std::move(lighting_vs), std::move(lighting_fs), *camera, get_scene()); lighting_subpass->set_input_attachments({1, 2, 3}); @@ -155,7 +172,7 @@ std::unique_ptr PipelineBarriers::create_render_target(vkb::c return std::make_unique(std::move(images)); } -void PipelineBarriers::draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void PipelineBarriers::draw(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { // POI // diff --git a/samples/performance/pipeline_barriers/pipeline_barriers.h b/samples/performance/pipeline_barriers/pipeline_barriers.h index 4e95924ff1..c6e6b6a693 100644 --- a/samples/performance/pipeline_barriers/pipeline_barriers.h +++ b/samples/performance/pipeline_barriers/pipeline_barriers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -48,7 +48,7 @@ class PipelineBarriers : public vkb::VulkanSampleC virtual void prepare_render_context() override; - void draw(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) override; + void draw(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) override; virtual void draw_gui() override; diff --git a/samples/performance/pipeline_cache/pipeline_cache.cpp b/samples/performance/pipeline_cache/pipeline_cache.cpp index 8e623d0a9d..2d9583b5c6 100644 --- a/samples/performance/pipeline_cache/pipeline_cache.cpp +++ b/samples/performance/pipeline_cache/pipeline_cache.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -133,8 +133,8 @@ bool PipelineCache::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); diff --git a/samples/performance/render_passes/README.adoc b/samples/performance/render_passes/README.adoc index c8408e9dd6..270de7eb9e 100644 --- a/samples/performance/render_passes/README.adoc +++ b/samples/performance/render_passes/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -29,7 +29,7 @@ Vulkan render-passes use attachments to describe input and output render targets This sample shows how loading and storing attachments might affect performance on mobile. During the creation of a render-pass, you can specify various color attachments and a depth-stencil attachment. -Each of those is described by a https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentDescription.html[`VkAttachmentDescription`] struct, which contains attributes to specify the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentLoadOp.html[load operation] (`loadOp`) and the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentStoreOp.html[store operation] (`storeOp`). +Each of those is described by a https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentDescription.html[`VkAttachmentDescription`] struct, which contains attributes to specify the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentLoadOp.html[load operation] (`loadOp`) and the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentStoreOp.html[store operation] (`storeOp`). This sample lets you choose between different combinations of these operations at runtime. [,c] @@ -139,7 +139,7 @@ A render area is optimal when it satisfies all of the following conditions: * Either the `extent.height` member in `renderArea` is a multiple of the vertical granularity or `offset.y` + `extent.height` is equal to the height of the framebuffer in the `VkRenderPassBeginInfo`. A non optimal render area may cause a negative impact to performance. -More information on this is available https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetRenderAreaGranularity.html[here] and https://vulkan.lunarg.com/doc/view/1.0.33.0/linux/vkspec.chunked/ch07s04.html[here]. +More information on this is available https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetRenderAreaGranularity.html[here] and https://vulkan.lunarg.com/doc/view/1.0.33.0/linux/vkspec.chunked/ch07s04.html[here]. == Best-practice summary @@ -171,5 +171,5 @@ failing to follow this advice can result in significantly lower fragment shading *Debugging* -* Review API usage of https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentDescription.html[attachments description]. -* Review API usage of https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCreateRenderPass.html[render pass creation], and any use of https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdClearColorImage.html[`vkCmdClearColorImage()`], https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdClearDepthStencilImage.html[`vkCmdClearDepthStencilImage()`] and https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdClearAttachments.html[`vkCmdClearAttachments()`]. +* Review API usage of https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkAttachmentDescription.html[attachments description]. +* Review API usage of https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCreateRenderPass.html[render pass creation], and any use of https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdClearColorImage.html[`vkCmdClearColorImage()`], https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdClearDepthStencilImage.html[`vkCmdClearDepthStencilImage()`] and https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdClearAttachments.html[`vkCmdClearAttachments()`]. diff --git a/samples/performance/render_passes/render_passes.cpp b/samples/performance/render_passes/render_passes.cpp index 26c4170bb5..f6362a4ee3 100644 --- a/samples/performance/render_passes/render_passes.cpp +++ b/samples/performance/render_passes/render_passes.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -114,8 +114,8 @@ bool RenderPassesSample::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = dynamic_cast(&camera_node.get_component()); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); @@ -128,7 +128,7 @@ bool RenderPassesSample::prepare(const vkb::ApplicationOptions &options) return true; } -void RenderPassesSample::draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void RenderPassesSample::draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { std::vector load_store{2}; diff --git a/samples/performance/render_passes/render_passes.h b/samples/performance/render_passes/render_passes.h index df7c0ce6a5..52dbef5a60 100644 --- a/samples/performance/render_passes/render_passes.h +++ b/samples/performance/render_passes/render_passes.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2024, Arm Limited and Contributors +/* Copyright (c) 2018-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -58,7 +58,7 @@ class RenderPassesSample : public vkb::VulkanSampleC private: void reset_stats_view() override; - void draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) override; + void draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) override; vkb::sg::PerspectiveCamera *camera{nullptr}; diff --git a/samples/performance/specialization_constants/CMakeLists.txt b/samples/performance/specialization_constants/CMakeLists.txt index 13c21372b9..bdeffd0009 100644 --- a/samples/performance/specialization_constants/CMakeLists.txt +++ b/samples/performance/specialization_constants/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2021, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -27,4 +27,7 @@ add_sample( DESCRIPTION "Using specialization constants to enable the compiler to produce more optimised shaders." SHADER_FILES_GLSL "base.vert" - "base.vert") + "base.vert" + "specialization_constants/specialization_constants.frag" + "specialization_constants/UBOs.frag" + ) diff --git a/samples/performance/specialization_constants/specialization_constants.cpp b/samples/performance/specialization_constants/specialization_constants.cpp index 9992aa2b9f..4f510163dc 100644 --- a/samples/performance/specialization_constants/specialization_constants.cpp +++ b/samples/performance/specialization_constants/specialization_constants.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -34,8 +34,11 @@ SpecializationConstants::SpecializationConstants() config.insert(1, specialization_constants_enabled, 1); } -SpecializationConstants::ForwardSubpassCustomLights::ForwardSubpassCustomLights(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_shader, vkb::ShaderSource &&fragment_shader, vkb::sg::Scene &scene_, vkb::sg::Camera &camera) : +SpecializationConstants::ForwardSubpassCustomLights::ForwardSubpassCustomLights(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_shader, + vkb::ShaderSource &&fragment_shader, + vkb::sg::Scene &scene_, + vkb::sg::Camera &camera) : vkb::ForwardSubpass{render_context, std::move(vertex_shader), std::move(fragment_shader), scene_, camera} { } @@ -69,19 +72,14 @@ void SpecializationConstants::ForwardSubpassCustomLights::prepare() { for (auto &sub_mesh : mesh->get_submeshes()) { - auto &variant = sub_mesh->get_mut_shader_variant(); - - // Same as Geometry except adds lighting definitions to sub mesh variants. - variant.add_definitions({"MAX_LIGHT_COUNT " + std::to_string(LIGHT_COUNT)}); - variant.add_definitions(vkb::rendering::light_type_definitions); - + auto &variant = sub_mesh->get_mut_shader_variant(); auto &vert_module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_VERTEX_BIT, get_vertex_shader(), variant); auto &frag_module = device.get_resource_cache().request_shader_module(VK_SHADER_STAGE_FRAGMENT_BIT, get_fragment_shader(), variant); } } } -void SpecializationConstants::render(vkb::CommandBuffer &command_buffer) +void SpecializationConstants::render(vkb::core::CommandBufferC &command_buffer) { // POI // @@ -105,8 +103,8 @@ void SpecializationConstants::render(vkb::CommandBuffer &command_buffer) std::unique_ptr SpecializationConstants::create_specialization_renderpass() { // Scene subpass - vkb::ShaderSource vert_shader{"base.vert"}; - vkb::ShaderSource frag_shader{"specialization_constants/specialization_constants.frag"}; + vkb::ShaderSource vert_shader{"base.vert.spv"}; + vkb::ShaderSource frag_shader{"specialization_constants/specialization_constants.frag.spv"}; auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); @@ -122,8 +120,8 @@ std::unique_ptr SpecializationConstants::create_specializat std::unique_ptr SpecializationConstants::create_standard_renderpass() { // Scene subpass - vkb::ShaderSource vert_shader{"base.vert"}; - vkb::ShaderSource frag_shader{"specialization_constants/UBOs.frag"}; + vkb::ShaderSource vert_shader{"base.vert.spv"}; + vkb::ShaderSource frag_shader{"specialization_constants/UBOs.frag.spv"}; auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); @@ -136,7 +134,7 @@ std::unique_ptr SpecializationConstants::create_standard_re return standard_pipeline; } -void SpecializationConstants::ForwardSubpassCustomLights::draw(vkb::CommandBuffer &command_buffer) +void SpecializationConstants::ForwardSubpassCustomLights::draw(vkb::core::CommandBufferC &command_buffer) { // Override forward light subpass draw function to provide a custom number of lights auto lights_buffer = allocate_custom_lights(command_buffer, scene.get_components(), LIGHT_COUNT); diff --git a/samples/performance/specialization_constants/specialization_constants.h b/samples/performance/specialization_constants/specialization_constants.h index 8c7e11d523..d302ef301b 100644 --- a/samples/performance/specialization_constants/specialization_constants.h +++ b/samples/performance/specialization_constants/specialization_constants.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -52,13 +52,15 @@ class SpecializationConstants : public vkb::VulkanSampleC class ForwardSubpassCustomLights : public vkb::ForwardSubpass { public: - ForwardSubpassCustomLights(vkb::RenderContext &render_context, - vkb::ShaderSource &&vertex_source, vkb::ShaderSource &&fragment_source, - vkb::sg::Scene &scene, vkb::sg::Camera &camera); + ForwardSubpassCustomLights(vkb::rendering::RenderContextC &render_context, + vkb::ShaderSource &&vertex_source, + vkb::ShaderSource &&fragment_source, + vkb::sg::Scene &scene, + vkb::sg::Camera &camera); virtual void prepare() override; - virtual void draw(vkb::CommandBuffer &command_buffer) override; + virtual void draw(vkb::core::CommandBufferC &command_buffer) override; /** * @brief Create a buffer allocation from scene graph lights for the specialization constants sample @@ -71,7 +73,7 @@ class SpecializationConstants : public vkb::VulkanSampleC * @return BufferAllocation A buffer allocation created for use in shaders */ template - vkb::BufferAllocationC allocate_custom_lights(vkb::CommandBuffer &command_buffer, const std::vector &scene_lights, size_t light_count) + vkb::BufferAllocationC allocate_custom_lights(vkb::core::CommandBufferC &command_buffer, const std::vector &scene_lights, size_t light_count) { T light_info; light_info.count = vkb::to_u32(light_count); @@ -93,7 +95,7 @@ class SpecializationConstants : public vkb::VulkanSampleC } } - std::copy(lights.begin(), lights.end(), light_info.lights); + std::copy_n(lights.begin(), light_count, light_info.lights); auto &render_frame = get_render_context().get_active_frame(); vkb::BufferAllocationC light_buffer = render_frame.allocate_buffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(T)); @@ -108,7 +110,7 @@ class SpecializationConstants : public vkb::VulkanSampleC virtual void draw_gui() override; - virtual void render(vkb::CommandBuffer &command_buffer) override; + virtual void render(vkb::core::CommandBufferC &command_buffer) override; std::unique_ptr create_specialization_renderpass(); diff --git a/samples/performance/subpasses/README.adoc b/samples/performance/subpasses/README.adoc index e6ee3cf9ce..f678090ac0 100644 --- a/samples/performance/subpasses/README.adoc +++ b/samples/performance/subpasses/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -90,7 +90,7 @@ image::./images/subpasses-renderpasses-trace.jpg[Subpasses vs render passes trac As stated by the Vulkan reference, _Subpasses with simple framebuffer-space dependencies may be merged into a single tile rendering pass, keeping the attachment data on-chip for the duration of a renderpass._ [<>]. Since subpass information is known ahead of time, the driver is able to detect if two or more subpasses can be merged together. -The consequence of this is that https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdNextSubpass.html[vkCmdNextSubpass] becomes a `NOP`. +The consequence of this is that https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCmdNextSubpass.html[vkCmdNextSubpass] becomes a `NOP`. In other words, a GPU driver can optimize even more by merging two or more subpasses together as long as certain requirements are met. Such requirements may vary between vendors, the following are the ones for Arm GPUs: @@ -128,7 +128,7 @@ Actually, there is not even a need to allocate them at all. image::./images/transient-attachments.jpg[Non-transient attachments] -In practice, their https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkImageUsageFlagBits.html[image usage] needs to be specified as `TRANSIENT` and their https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkMemoryPropertyFlagBits.html[memory] needs to be `LAZILY_ALLOCATED`. +In practice, their https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkImageUsageFlagBits.html[image usage] needs to be specified as `TRANSIENT` and their https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkMemoryPropertyFlagBits.html[memory] needs to be `LAZILY_ALLOCATED`. Failing to set these flags properly will lead to an increase of https://community.arm.com/developer/tools-software/graphics/b/blog/posts/mali-bifrost-family-performance-counters[fragment jobs] as the GPU will need to write them back to external memory. As you can see in the above screenshot, we see roughly a double in fragment jobs per second (from `56/s` to `113/s`). diff --git a/samples/performance/subpasses/subpasses.cpp b/samples/performance/subpasses/subpasses.cpp index 0d5444d36f..42a66f78cb 100644 --- a/samples/performance/subpasses/subpasses.cpp +++ b/samples/performance/subpasses/subpasses.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -50,6 +50,23 @@ Subpasses::Subpasses() config.insert(3, configs[Config::RenderTechnique].value, 0); config.insert(3, configs[Config::TransientAttachments].value, 0); config.insert(3, configs[Config::GBufferSize].value, 1); + +#if defined(PLATFORM__MACOS) && TARGET_OS_IOS && TARGET_OS_SIMULATOR + // On iOS Simulator use layer setting to disable MoltenVK's Metal argument buffers - otherwise blank display + add_instance_extension(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, /*optional*/ true); + + VkLayerSettingEXT layerSetting; + layerSetting.pLayerName = "MoltenVK"; + layerSetting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + layerSetting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + layerSetting.valueCount = 1; + + // Make this static so layer setting reference remains valid after leaving constructor scope + static const int32_t useMetalArgumentBuffers = 0; + layerSetting.pValues = &useMetalArgumentBuffers; + + add_layer_setting(layerSetting); +#endif } std::unique_ptr Subpasses::create_render_target(vkb::core::Image &&swapchain_image) @@ -284,16 +301,16 @@ void Subpasses::draw_gui() std::unique_ptr Subpasses::create_one_renderpass_two_subpasses() { // Geometry subpass - auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert"}; - auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag"}; + auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert.spv"}; + auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag.spv"}; auto scene_subpass = std::make_unique(get_render_context(), std::move(geometry_vs), std::move(geometry_fs), get_scene(), *camera); // Outputs are depth, albedo, and normal scene_subpass->set_output_attachments({1, 2, 3}); // Lighting subpass - auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert"}; - auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag"}; + auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert.spv"}; + auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag.spv"}; auto lighting_subpass = std::make_unique(get_render_context(), std::move(lighting_vs), std::move(lighting_fs), *camera, get_scene()); // Inputs are depth, albedo, and normal from the geometry subpass @@ -316,8 +333,8 @@ std::unique_ptr Subpasses::create_one_renderpass_two_subpas std::unique_ptr Subpasses::create_geometry_renderpass() { // Geometry subpass - auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert"}; - auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag"}; + auto geometry_vs = vkb::ShaderSource{"deferred/geometry.vert.spv"}; + auto geometry_fs = vkb::ShaderSource{"deferred/geometry.frag.spv"}; auto scene_subpass = std::make_unique(get_render_context(), std::move(geometry_vs), std::move(geometry_fs), get_scene(), *camera); // Outputs are depth, albedo, and normal @@ -339,8 +356,8 @@ std::unique_ptr Subpasses::create_geometry_renderpass() std::unique_ptr Subpasses::create_lighting_renderpass() { // Lighting subpass - auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert"}; - auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag"}; + auto lighting_vs = vkb::ShaderSource{"deferred/lighting.vert.spv"}; + auto lighting_fs = vkb::ShaderSource{"deferred/lighting.frag.spv"}; auto lighting_subpass = std::make_unique(get_render_context(), std::move(lighting_vs), std::move(lighting_fs), *camera, get_scene()); // Inputs are depth, albedo, and normal from the geometry subpass @@ -358,7 +375,10 @@ std::unique_ptr Subpasses::create_lighting_renderpass() return lighting_render_pipeline; } -void draw_pipeline(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target, vkb::RenderPipeline &render_pipeline, vkb::Gui *gui = nullptr) +void draw_pipeline(vkb::core::CommandBufferC &command_buffer, + vkb::RenderTarget &render_target, + vkb::RenderPipeline &render_pipeline, + vkb::GuiC *gui = nullptr) { auto &extent = render_target.get_extent(); @@ -383,12 +403,12 @@ void draw_pipeline(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render command_buffer.end_render_pass(); } -void Subpasses::draw_subpasses(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void Subpasses::draw_subpasses(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { draw_pipeline(command_buffer, render_target, *render_pipeline, &get_gui()); } -void Subpasses::draw_renderpasses(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void Subpasses::draw_renderpasses(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { // First render pass (no gui) draw_pipeline(command_buffer, render_target, *geometry_render_pipeline); @@ -400,13 +420,15 @@ void Subpasses::draw_renderpasses(vkb::CommandBuffer &command_buffer, vkb::Rende vkb::ImageMemoryBarrier barrier; - if (i == 1) + if (vkb::is_depth_format(view.get_format())) { barrier.old_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; barrier.new_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; barrier.src_stage_mask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + barrier.dst_stage_mask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; barrier.src_access_mask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + barrier.dst_access_mask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; } else { @@ -414,20 +436,19 @@ void Subpasses::draw_renderpasses(vkb::CommandBuffer &command_buffer, vkb::Rende barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; barrier.src_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + barrier.dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; barrier.src_access_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + barrier.dst_access_mask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; } - barrier.dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - barrier.dst_access_mask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; - - command_buffer.image_memory_barrier(view, barrier); + command_buffer.image_memory_barrier(render_target, i, barrier); } // Second render pass draw_pipeline(command_buffer, render_target, *lighting_render_pipeline, &get_gui()); } -void Subpasses::draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) +void Subpasses::draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) { if (configs[Config::RenderTechnique].value == 0) { diff --git a/samples/performance/subpasses/subpasses.h b/samples/performance/subpasses/subpasses.h index e7b55a2704..4b51da39a0 100644 --- a/samples/performance/subpasses/subpasses.h +++ b/samples/performance/subpasses/subpasses.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -48,7 +48,7 @@ class Subpasses : public vkb::VulkanSampleC * @brief Draws to a render target using the right pipeline based on the sample selection * Not to be confused with `draw_renderpasses` which uses the bad practice */ - virtual void draw_renderpass(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target) override; + virtual void draw_renderpass(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target) override; /** * @return A good pipeline @@ -68,12 +68,12 @@ class Subpasses : public vkb::VulkanSampleC /** * @brief Draws using the good pipeline: one render pass with two subpasses */ - void draw_subpasses(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target); + void draw_subpasses(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target); /** * @brief Draws using the bad practice: two separate render passes */ - void draw_renderpasses(vkb::CommandBuffer &command_buffer, vkb::RenderTarget &render_target); + void draw_renderpasses(vkb::core::CommandBufferC &command_buffer, vkb::RenderTarget &render_target); std::unique_ptr create_render_target(vkb::core::Image &&swapchain_image); diff --git a/samples/performance/surface_rotation/README.adoc b/samples/performance/surface_rotation/README.adoc index 810a67166c..5236a588c0 100644 --- a/samples/performance/surface_rotation/README.adoc +++ b/samples/performance/surface_rotation/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -68,11 +68,11 @@ In a nutshell, below are the steps required to handle pre-rotation: | Re-create the swapchain using the new surface dimensions i.e. the swapchain dimensions match the surface's. -Ignore the `preTransform` field in https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSwapchainCreateInfoKHR.html[`VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR`]. -This will not match the value returned by https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[`vkGetPhysicalDeviceSurfaceCapabilitiesKHR`] and therefore the Android Compositor will rotate the scene before presenting it to the display +Ignore the `preTransform` field in https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSwapchainCreateInfoKHR.html[`VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR`]. +This will not match the value returned by https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[`vkGetPhysicalDeviceSurfaceCapabilitiesKHR`] and therefore the Android Compositor will rotate the scene before presenting it to the display | Re-create the swapchain using the old swapchain dimensions, i.e. the swapchain dimensions do not change. -Update the `preTransform` field in https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSwapchainCreateInfoKHR.html[`VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR`] so that it matches the `currentTransform` field of the https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSurfaceCapabilitiesKHR.html[`VkSurfaceCapabilitiesKHR`] returned by the new surface. +Update the `preTransform` field in https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSwapchainCreateInfoKHR.html[`VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR`] so that it matches the `currentTransform` field of the https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html[`VkSurfaceCapabilitiesKHR`] returned by the new surface. This communicates to Android that it does not need to rotate the scene. | Re-create the framebuffers @@ -163,8 +163,8 @@ VK_CHECK(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(get_device().get_physical_dev pre_transform = surface_properties.currentTransform; ---- -`currentTransform` is a https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/chap32.html#VkSurfaceTransformFlagBitsKHR[`VkSurfaceTransformFlagBitsKHR`] value. -When we re-create the swapchain, we must set the swapchain's https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSwapchainCreateInfoKHR.html[`preTransform`] to match this value. +`currentTransform` is a https://www.khronos.org/registry/vulkan/specs/latest/html/chap32.html#VkSurfaceTransformFlagBitsKHR[`VkSurfaceTransformFlagBitsKHR`] value. +When we re-create the swapchain, we must set the swapchain's https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSwapchainCreateInfoKHR.html[`preTransform`] to match this value. This informs the compositor that the application has handled the required transform so it does not have to. To re-create the swapchain, the sample uses the helper function `update_swapchain` provided by the framework: @@ -288,8 +288,8 @@ In order to save battery life in those devices without a rotation-capable DPU, a *Do* -* To avoid presentation engine transformation passes ensure that swapchain https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSwapchainCreateInfoKHR.html[`preTransform`] matches the `currentTransform` value returned by https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[`vkGetPhysicalDeviceSurfaceCapabilitiesKHR`]. -* If a swapchain image acquisition returns https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkResult.html[`VK_SUBOPTIMAL_KHR`] or https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkResult.html[`VK_ERROR_OUT_OF_DATE_KHR`] then recreate the swapchain taking into account any updated surface properties including potential orientation updates reported via `currentTransform`. +* To avoid presentation engine transformation passes ensure that swapchain https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSwapchainCreateInfoKHR.html[`preTransform`] matches the `currentTransform` value returned by https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[`vkGetPhysicalDeviceSurfaceCapabilitiesKHR`]. +* If a swapchain image acquisition returns https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkResult.html[`VK_SUBOPTIMAL_KHR`] or https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkResult.html[`VK_ERROR_OUT_OF_DATE_KHR`] then recreate the swapchain taking into account any updated surface properties including potential orientation updates reported via `currentTransform`. *Don't* diff --git a/samples/performance/surface_rotation/surface_rotation.cpp b/samples/performance/surface_rotation/surface_rotation.cpp index c9b71bd671..a2aff87a1a 100644 --- a/samples/performance/surface_rotation/surface_rotation.cpp +++ b/samples/performance/surface_rotation/surface_rotation.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -62,8 +62,8 @@ bool SurfaceRotation::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = dynamic_cast(&camera_node.get_component()); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); diff --git a/samples/performance/swapchain_images/CMakeLists.txt b/samples/performance/swapchain_images/CMakeLists.txt index 15d5a69bd5..2d70a86abd 100644 --- a/samples/performance/swapchain_images/CMakeLists.txt +++ b/samples/performance/swapchain_images/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2021, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # @@ -27,4 +27,7 @@ add_sample( DESCRIPTION "Using triple buffering over double buffering." SHADER_FILES_GLSL "base.vert" - "base.frag") + "base.frag" + GLSLC_ADDITIONAL_ARGUMENTS + "-I .." + ) diff --git a/samples/performance/swapchain_images/README.adoc b/samples/performance/swapchain_images/README.adoc index caef1b8e08..2f3db785c1 100644 --- a/samples/performance/swapchain_images/README.adoc +++ b/samples/performance/swapchain_images/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2023, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -31,11 +31,11 @@ This sample analyzes the available options and their performance implications. == Choosing a number of images The control over the number of swapchain images is shared between the application and the platform. -The application can ask for a minimum number of images by setting the `minImageCount` parameter in https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCreateSwapchainKHR.html[vkCreateSwapchainKHR]. -The exact number of images created can then be polled via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetSwapchainImagesKHR.html[vkGetSwapchainImagesKHR]. +The application can ask for a minimum number of images by setting the `minImageCount` parameter in https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkCreateSwapchainKHR.html[vkCreateSwapchainKHR]. +The exact number of images created can then be polled via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetSwapchainImagesKHR.html[vkGetSwapchainImagesKHR]. -In order to properly set the `minImageCount` parameter, the application should get the surface capabilities of the physical device via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vkGetPhysicalDeviceSurfaceCapabilitiesKHR]. -The https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSurfaceCapabilitiesKHR.html[VkSurfaceCapabilitiesKHR] structure has the `minImageCount` and `maxImageCount` parameters, which set the boundaries for the image count that can be safely requested. +In order to properly set the `minImageCount` parameter, the application should get the surface capabilities of the physical device via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vkGetPhysicalDeviceSurfaceCapabilitiesKHR]. +The https://www.khronos.org/registry/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html[VkSurfaceCapabilitiesKHR] structure has the `minImageCount` and `maxImageCount` parameters, which set the boundaries for the image count that can be safely requested. As a rule of thumb on mobile, `+pSurfaceCapabilities->minImageCount+` is usually 2, while `+pSurfaceCapabilities->maxImageCount+` is large enough to not pose any problem with common applications (though it is still good practice to check its value). @@ -49,7 +49,7 @@ We will discuss present modes in the next section. == Choosing a present mode -The available present modes can be queried via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfacePresentModesKHR.html[vkGetPhysicalDeviceSurfacePresentModesKHR]. +The available present modes can be queried via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfacePresentModesKHR.html[vkGetPhysicalDeviceSurfacePresentModesKHR]. There are several presentation modes in Vulkan, but mobile GPUs do not support the ones in which the image is directly presented to the screen (immediate mode). The only ones which satisfy Android's VSync requirement are `VK_PRESENT_MODE_FIFO_KHR` and `VK_PRESENT_MODE_MAILBOX_KHR`. @@ -125,7 +125,7 @@ After the marker we switch to double buffering and we confirm what we predicted *Do* -* Ensure that the value of `minImageCount` is within the valid range from https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vkGetPhysicalDeviceSurfaceCapabilitiesKHR] (between `minImageCount` and `maxImageCount`). +* Ensure that the value of `minImageCount` is within the valid range from https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html[vkGetPhysicalDeviceSurfaceCapabilitiesKHR] (between `minImageCount` and `maxImageCount`). * Use `VK_PRESENT_MODE_FIFO_KHR` to avoid unnecessary CPU and GPU load. * Use triple buffering to maximize performance. @@ -142,5 +142,5 @@ If you want to cap framerate to 30 FPS to save power, this can be achieved on th *Debugging* -* It is possible to check how many images are created via https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkGetSwapchainImagesKHR.html[vkGetSwapchainImagesKHR]. +* It is possible to check how many images are created via https://www.khronos.org/registry/vulkan/specs/latest/man/html/vkGetSwapchainImagesKHR.html[vkGetSwapchainImagesKHR]. If only 2 images are being created, `minImageCount` should be increased to 3, if the physical device allows for it (it normally does). diff --git a/samples/performance/swapchain_images/swapchain_images.cpp b/samples/performance/swapchain_images/swapchain_images.cpp index 1d6328ecb0..913a8d3779 100644 --- a/samples/performance/swapchain_images/swapchain_images.cpp +++ b/samples/performance/swapchain_images/swapchain_images.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -49,8 +49,8 @@ bool SwapchainImages::prepare(const vkb::ApplicationOptions &options) auto &camera_node = vkb::add_free_camera(get_scene(), "main_camera", get_render_context().get_surface_extent()); camera = &camera_node.get_component(); - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); diff --git a/samples/performance/texture_compression_basisu/CMakeLists.txt b/samples/performance/texture_compression_basisu/CMakeLists.txt index 9dae12e039..ce24220f99 100644 --- a/samples/performance/texture_compression_basisu/CMakeLists.txt +++ b/samples/performance/texture_compression_basisu/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024, Sascha Willems +# Copyright (c) 2021-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -30,4 +30,7 @@ add_sample_with_tags( "texture_compression_basisu/glsl/texture.frag" SHADER_FILES_HLSL "texture_compression_basisu/hlsl/texture.vert.hlsl" - "texture_compression_basisu/hlsl/texture.frag.hlsl") + "texture_compression_basisu/hlsl/texture.frag.hlsl" + SHADER_FILES_SLANG + "texture_compression_basisu/slang/texture.vert.slang" + "texture_compression_basisu/slang/texture.frag.slang") diff --git a/samples/performance/texture_compression_basisu/README.adoc b/samples/performance/texture_compression_basisu/README.adoc index 419b51445a..c890c52b26 100644 --- a/samples/performance/texture_compression_basisu/README.adoc +++ b/samples/performance/texture_compression_basisu/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2021-2024, Sascha Willems +- Copyright (c) 2021-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -35,7 +35,7 @@ Version 2.0 added support for Basis Universal supercompressed textures. == Basis Universal https://github.com/BinomialLLC/basis_universal[Basis Universal] is a supercompressed GPU texture data interchange system that implements the UASTC and ETC1S compressed formats that serve as *transmission formats*. -Both can be quickly transcoded to a wide variety of GPU native compressed and uncompressed formats like RGB/RGBA, PVRTC1, BCn, ETC1, ETC2, etc. +Both can be quickly transcoded to a wide variety of GPU native compressed and uncompressed formats like RGB/RGBA, BCn, ETC1, ETC2, etc. This means that unlike a KTX 2.0 file storing a BC3 textures, the data needs to be transcoded at runtime. image::./images/2021-ktx-universal-gpu-compressed-textures.png[KTX and BasisU] @@ -119,12 +119,6 @@ void TextureCompressionBasisu::get_available_target_formats() ... } - // PowerVR texture compression support needs to be checked via an extension - if (get_device().is_extension_supported(VK_IMG_FORMAT_PVRTC_EXTENSION_NAME)) - { - ... - } - // Always add uncompressed RGBA as a valid target available_target_formats.push_back(KTX_TTF_RGBA32); available_target_formats_names.push_back("KTX_TTF_RGBA32"); diff --git a/samples/performance/texture_compression_basisu/texture_compression_basisu.cpp b/samples/performance/texture_compression_basisu/texture_compression_basisu.cpp index a2386320c3..628ee72eb3 100644 --- a/samples/performance/texture_compression_basisu/texture_compression_basisu.cpp +++ b/samples/performance/texture_compression_basisu/texture_compression_basisu.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -42,7 +42,7 @@ TextureCompressionBasisu::~TextureCompressionBasisu() } } -void TextureCompressionBasisu::request_gpu_features(vkb::PhysicalDevice &gpu) +void TextureCompressionBasisu::request_gpu_features(vkb::core::PhysicalDeviceC &gpu) { if (gpu.get_features().samplerAnisotropy) { @@ -104,16 +104,6 @@ void TextureCompressionBasisu::get_available_target_formats() } } - // PowerVR texture compression support needs to be checked via an extension - if (get_device().is_extension_supported(VK_IMG_FORMAT_PVRTC_EXTENSION_NAME)) - { - if (format_supported(VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG)) - { - available_target_formats.push_back(KTX_TTF_PVRTC1_4_RGBA); - available_target_formats_names.push_back("KTX_TTF_PVRTC1_4_RGBA"); - } - } - // Always add uncompressed RGBA as a valid target available_target_formats.push_back(KTX_TTF_RGBA32); available_target_formats_names.push_back("KTX_TTF_RGBA32"); @@ -173,7 +163,8 @@ void TextureCompressionBasisu::transcode_texture(const std::string &input_file, VkMemoryRequirements memory_requirements = {}; vkGetBufferMemoryRequirements(get_device().get_handle(), staging_buffer, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + memory_allocate_info.memoryTypeIndex = + get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &staging_memory)); VK_CHECK(vkBindBufferMemory(get_device().get_handle(), staging_buffer, staging_memory, 0)); @@ -217,7 +208,7 @@ void TextureCompressionBasisu::transcode_texture(const std::string &input_file, vkGetImageMemoryRequirements(get_device().get_handle(), texture.image, &memory_requirements); memory_allocate_info.allocationSize = memory_requirements.size; - memory_allocate_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocate_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocate_info, nullptr, &texture.device_memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), texture.image, texture.device_memory, 0)); @@ -542,8 +533,8 @@ void TextureCompressionBasisu::prepare_pipelines() // Load shaders std::array shader_stages; - shader_stages[0] = load_shader("texture_compression_basisu", "texture.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("texture_compression_basisu", "texture.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("texture_compression_basisu", "texture.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("texture_compression_basisu", "texture.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/performance/texture_compression_basisu/texture_compression_basisu.h b/samples/performance/texture_compression_basisu/texture_compression_basisu.h index 31d41677ca..45d0ec2508 100644 --- a/samples/performance/texture_compression_basisu/texture_compression_basisu.h +++ b/samples/performance/texture_compression_basisu/texture_compression_basisu.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Sascha Willems +/* Copyright (c) 2021-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -76,7 +76,7 @@ class TextureCompressionBasisu : public ApiVulkanSample TextureCompressionBasisu(); ~TextureCompressionBasisu(); - virtual void request_gpu_features(vkb::PhysicalDevice &gpu) override; + virtual void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; bool format_supported(VkFormat format); void get_available_target_formats(); void transcode_texture(const std::string &input_file, ktx_transcode_fmt_e target_format); diff --git a/samples/performance/texture_compression_comparison/texture_compression_comparison.cpp b/samples/performance/texture_compression_comparison/texture_compression_comparison.cpp index 1c01d1517c..b0b21fd344 100644 --- a/samples/performance/texture_compression_comparison/texture_compression_comparison.cpp +++ b/samples/performance/texture_compression_comparison/texture_compression_comparison.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021-2024, Holochip +/* Copyright (c) 2021-2025, Holochip * * SPDX-License-Identifier: Apache-2.0 * @@ -169,13 +169,7 @@ const std::vector &TextureCom VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, KTX_TTF_ETC2_RGBA, "KTX_TTF_ETC2_RGBA", - "ETC2"}, - CompressedTexture_t{nullptr, - VK_IMG_FORMAT_PVRTC_EXTENSION_NAME, - VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, - KTX_TTF_PVRTC1_4_RGBA, - "KTX_TTF_PVRTC1_4_RGBA", - "PVRTC1 4"}}; + "ETC2"}}; return formats; } @@ -184,7 +178,7 @@ bool TextureCompressionComparison::is_texture_format_supported(const TextureComp const auto device_features = get_device().get_gpu().get_features(); const bool supported_by_feature = format.feature_ptr && device_features.*format.feature_ptr; - const bool supported_by_extension = strlen(format.extension_name) && get_device().is_extension_supported(format.extension_name); + const bool supported_by_extension = strlen(format.extension_name) && get_device().get_gpu().is_extension_supported(format.extension_name); const bool supported_by_default = format.always_supported; return supported_by_default || supported_by_feature || supported_by_extension; @@ -215,8 +209,8 @@ void TextureCompressionComparison::load_assets() void TextureCompressionComparison::create_subpass() { - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_sub_pass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); @@ -260,7 +254,7 @@ namespace class CompressedImage : public vkb::sg::Image { public: - CompressedImage(vkb::Device &device, const std::string &name, std::vector &&mipmaps, VkFormat format) : + CompressedImage(vkb::core::DeviceC &device, const std::string &name, std::vector &&mipmaps, VkFormat format) : vkb::sg::Image(name, std::vector{}, std::move(mipmaps)) { vkb::sg::Image::set_format(format); diff --git a/samples/performance/wait_idle/wait_idle.cpp b/samples/performance/wait_idle/wait_idle.cpp index 4986cf66c6..e4215724a3 100644 --- a/samples/performance/wait_idle/wait_idle.cpp +++ b/samples/performance/wait_idle/wait_idle.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -48,8 +48,8 @@ bool WaitIdle::prepare(const vkb::ApplicationOptions &options) camera = dynamic_cast(&camera_node.get_component()); // Example Scene Render Pipeline - vkb::ShaderSource vert_shader("base.vert"); - vkb::ShaderSource frag_shader("base.frag"); + vkb::ShaderSource vert_shader("base.vert.spv"); + vkb::ShaderSource frag_shader("base.frag.spv"); auto scene_subpass = std::make_unique(get_render_context(), std::move(vert_shader), std::move(frag_shader), get_scene(), *camera); auto render_pipeline = std::make_unique(); render_pipeline->add_subpass(std::move(scene_subpass)); @@ -67,9 +67,8 @@ void WaitIdle::create_render_context() set_render_context(std::make_unique(get_device(), get_surface(), *window, wait_idle_enabled)); } -WaitIdle::CustomRenderContext::CustomRenderContext(vkb::Device &device, VkSurfaceKHR surface, const vkb::Window &window, int &wait_idle_enabled) : - RenderContext(device, surface, window), - wait_idle_enabled(wait_idle_enabled) +WaitIdle::CustomRenderContext::CustomRenderContext(vkb::core::DeviceC &device, VkSurfaceKHR surface, const vkb::Window &window, int &wait_idle_enabled) : + RenderContext(device, surface, window), wait_idle_enabled(wait_idle_enabled) {} void WaitIdle::CustomRenderContext::wait_frame() @@ -78,7 +77,7 @@ void WaitIdle::CustomRenderContext::wait_frame() // // If wait idle is enabled, wait using vkDeviceWaitIdle - vkb::RenderFrame &frame = get_active_frame(); + vkb::rendering::RenderFrameC &frame = get_active_frame(); if (wait_idle_enabled) { diff --git a/samples/performance/wait_idle/wait_idle.h b/samples/performance/wait_idle/wait_idle.h index 74dda25899..97105047d8 100644 --- a/samples/performance/wait_idle/wait_idle.h +++ b/samples/performance/wait_idle/wait_idle.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2024, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -35,10 +35,10 @@ class WaitIdle : public vkb::VulkanSampleC * @brief This RenderContext is responsible containing the scene's RenderFrames * It implements a custom wait_frame function which alternates between waiting with WaitIdle or Fences */ - class CustomRenderContext : public vkb::RenderContext + class CustomRenderContext : public vkb::rendering::RenderContextC { public: - CustomRenderContext(vkb::Device &device, VkSurfaceKHR surface, const vkb::Window &window, int &wait_idle_enabled); + CustomRenderContext(vkb::core::DeviceC &device, VkSurfaceKHR surface, const vkb::Window &window, int &wait_idle_enabled); virtual void wait_frame() override; diff --git a/samples/tooling/profiles/CMakeLists.txt b/samples/tooling/profiles/CMakeLists.txt index b2f233b21f..c0bcbba51c 100644 --- a/samples/tooling/profiles/CMakeLists.txt +++ b/samples/tooling/profiles/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024, Sascha Willems +# Copyright (c) 2022-2025, Sascha Willems # # SPDX-License-Identifier: Apache-2.0 # @@ -31,4 +31,7 @@ add_sample_with_tags( SHADER_FILES_HLSL "profiles/hlsl/profiles.vert.hlsl" "profiles/hlsl/profiles.frag.hlsl" - DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_descriptor_indexing") \ No newline at end of file + DXC_ADDITIONAL_ARGUMENTS "-fspv-extension=SPV_EXT_descriptor_indexing" + SHADER_FILES_SLANG + "profiles/slang/profiles.vert.slang" + "profiles/slang/profiles.frag.slang") \ No newline at end of file diff --git a/samples/tooling/profiles/profiles.cpp b/samples/tooling/profiles/profiles.cpp index c583ff94f2..39a38941e6 100644 --- a/samples/tooling/profiles/profiles.cpp +++ b/samples/tooling/profiles/profiles.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2022-2024, Sascha Willems - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2022-2025, Sascha Willems + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -59,7 +59,7 @@ Profiles::~Profiles() // This sample overrides the device creation part of the framework // Instead of manually setting up all extensions, features, etc. we use the Vulkan Profiles library to simplify device setup -std::unique_ptr Profiles::create_device(vkb::PhysicalDevice &gpu) +std::unique_ptr Profiles::create_device(vkb::core::PhysicalDeviceC &gpu) { // Check if the profile is supported at device level VkBool32 profile_supported; @@ -74,7 +74,7 @@ std::unique_ptr Profiles::create_device(vkb::PhysicalDevice &gpu) // Simplified queue setup (only graphics) uint32_t selected_queue_family = 0; const auto &queue_family_properties = gpu.get_queue_family_properties(); - const float default_queue_priority{0.0f}; + const float default_queue_priority{0.5f}; VkDeviceQueueCreateInfo queue_create_info{}; queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queue_create_info.queueCount = 1; @@ -113,9 +113,9 @@ std::unique_ptr Profiles::create_device(vkb::PhysicalDevice &gpu) } // Post device setup required for the framework - auto device = std::make_unique(gpu, vulkan_device, get_surface()); + auto device = std::make_unique(gpu, vulkan_device, get_surface()); device->add_queue(0, queue_create_info.queueFamilyIndex, queue_family_properties[selected_queue_family], true); - device->prepare_memory_allocator(); + vkb::allocated::init(*device); // prepare the memory allocator device->create_internal_command_pool(); device->create_internal_fence_pool(); @@ -124,7 +124,7 @@ std::unique_ptr Profiles::create_device(vkb::PhysicalDevice &gpu) // This sample overrides the instance creation part of the framework // Instead of manually setting up all properties we use the Vulkan Profiles library to simplify instance setup -std::unique_ptr Profiles::create_instance() +std::unique_ptr Profiles::create_instance() { // Initialize Volk Vulkan Loader VkResult result = volkInitialize(); @@ -159,45 +159,33 @@ std::unique_ptr Profiles::create_instance() VK_CHECK(vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, available_instance_extensions.data())); // If VK_KHR_portability_enumeration is available at runtime, enable the extension and flag for instance creation - if (std::any_of(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) + if (std::ranges::any_of(available_instance_extensions, + [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0; })) { enabled_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); create_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; } +#endif -# if defined(PLATFORM__MACOS) && TARGET_OS_OSX - // On macOS use layer setting to configure MoltenVK for using Metal argument buffers (needed for descriptor indexing/scaling) - VkLayerSettingEXT layerSetting{}; - const int32_t useMetalArgumentBuffers = 1; - VkLayerSettingsCreateInfoEXT layerSettingsCreateInfo{}; +#if defined(PLATFORM__MACOS) + // On Apple use layer setting to enable MoltenVK's Metal argument buffers - needed for descriptor indexing/scaling + enabled_extensions.push_back(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME); - if (std::any_of(available_instance_extensions.begin(), - available_instance_extensions.end(), - [](VkExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_EXT_LAYER_SETTINGS_EXTENSION_NAME) == 0; })) - { - enabled_extensions.push_back(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME); + VkLayerSettingEXT layerSetting{}; + layerSetting.pLayerName = "MoltenVK"; + layerSetting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + layerSetting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + layerSetting.valueCount = 1; - layerSetting.pLayerName = "MoltenVK"; - layerSetting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; - layerSetting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; - layerSetting.valueCount = 1; - layerSetting.pValues = &useMetalArgumentBuffers; + const int32_t useMetalArgumentBuffers = 1; + layerSetting.pValues = &useMetalArgumentBuffers; - layerSettingsCreateInfo.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT; - layerSettingsCreateInfo.settingCount = 1; - layerSettingsCreateInfo.pSettings = &layerSetting; + VkLayerSettingsCreateInfoEXT layerSettingsCreateInfo{}; + layerSettingsCreateInfo.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT; + layerSettingsCreateInfo.settingCount = 1; + layerSettingsCreateInfo.pSettings = &layerSetting; - create_info.pNext = &layerSettingsCreateInfo; - } - else - { - // If layer settings is not available at runtime, set macOS environment variable for support of older Vulkan SDKs - // Will not work in batch mode, but is the best we can do short of using the deprecated MoltenVK private config API - setenv("MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", "1", 1); - } -# endif + create_info.pNext = &layerSettingsCreateInfo; #endif create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; @@ -222,7 +210,7 @@ std::unique_ptr Profiles::create_instance() volkLoadInstance(vulkan_instance); - return std::make_unique(vulkan_instance); + return std::make_unique(vulkan_instance); } void Profiles::generate_textures() @@ -253,7 +241,7 @@ void Profiles::generate_textures() image_view.subresourceRange.baseArrayLayer = 0; image_view.subresourceRange.layerCount = 1; - auto staging_buffer = vkb::core::BufferC::create_staging_buffer(get_device(), image_info.extent.width * image_info.extent.height * sizeof(uint32_t)); + auto staging_buffer = vkb::core::BufferC::create_staging_buffer(get_device(), image_info.extent.width * image_info.extent.height * sizeof(uint32_t), nullptr); textures.resize(32); for (size_t i = 0; i < textures.size(); i++) @@ -263,7 +251,7 @@ void Profiles::generate_textures() VkMemoryRequirements memory_requirements; vkGetImageMemoryRequirements(get_device().get_handle(), textures[i].image, &memory_requirements); memory_allocation_info.allocationSize = memory_requirements.size; - memory_allocation_info.memoryTypeIndex = get_device().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + memory_allocation_info.memoryTypeIndex = get_device().get_gpu().get_memory_type(memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_CHECK(vkAllocateMemory(get_device().get_handle(), &memory_allocation_info, nullptr, &textures[i].memory)); VK_CHECK(vkBindImageMemory(get_device().get_handle(), textures[i].image, textures[i].memory, 0)); image_view.image = textures[i].image; @@ -286,22 +274,23 @@ void Profiles::generate_textures() staging_buffer.unmap(); staging_buffer.flush(); - auto &cmd = get_device().request_command_buffer(); - cmd.begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + auto cmd = get_device().get_command_pool().request_command_buffer(); + cmd->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - vkb::image_layout_transition(cmd.get_handle(), textures[i].image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + vkb::image_layout_transition(cmd->get_handle(), textures[i].image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkBufferImageCopy copy_info{}; copy_info.imageSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; copy_info.imageExtent = image_info.extent; - vkCmdCopyBufferToImage(cmd.get_handle(), staging_buffer.get_handle(), textures[i].image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_info); + vkCmdCopyBufferToImage(cmd->get_handle(), staging_buffer.get_handle(), textures[i].image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_info); - vkb::image_layout_transition(cmd.get_handle(), textures[i].image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + vkb::image_layout_transition(cmd->get_handle(), textures[i].image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - VK_CHECK(cmd.end()); + cmd->end(); - get_device().get_suitable_graphics_queue().submit(cmd, VK_NULL_HANDLE); - get_device().get_suitable_graphics_queue().wait_idle(); + auto const &graphicsQueue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0); + graphicsQueue.submit(*cmd, VK_NULL_HANDLE); + graphicsQueue.wait_idle(); } // Create immutable sampler for the textures @@ -481,9 +470,11 @@ void Profiles::setup_descriptor_pool() void Profiles::setup_descriptor_set_layout() { // We separate the descriptor sets for the uniform buffer + image and samplers, so we don't need to duplicate the descriptors for the former - VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info{}; std::vector set_layout_bindings{}; + VkDescriptorSetLayoutCreateInfo descriptor_layout_create_info{}; + descriptor_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + // Mark second slot as variable for descriptor indexing VkDescriptorSetLayoutBindingFlagsCreateInfoEXT descriptor_set_layout_binding_flags{}; descriptor_set_layout_binding_flags.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT; @@ -508,10 +499,8 @@ void Profiles::setup_descriptor_set_layout() VK_SHADER_STAGE_FRAGMENT_BIT, 1, static_cast(textures.size()))}; - descriptor_layout_create_info = - vkb::initializers::descriptor_set_layout_create_info( - set_layout_bindings.data(), - static_cast(set_layout_bindings.size())); + descriptor_layout_create_info.bindingCount = static_cast(set_layout_bindings.size()); + descriptor_layout_create_info.pBindings = set_layout_bindings.data(); VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout_create_info, nullptr, &base_descriptor_set_layout)); // Set layout for the samplers @@ -522,10 +511,8 @@ void Profiles::setup_descriptor_set_layout() VK_SHADER_STAGE_FRAGMENT_BIT, 0, static_cast(textures.size()))}; - descriptor_layout_create_info = - vkb::initializers::descriptor_set_layout_create_info( - set_layout_bindings.data(), - static_cast(set_layout_bindings.size())); + descriptor_layout_create_info.bindingCount = static_cast(set_layout_bindings.size()); + descriptor_layout_create_info.pBindings = set_layout_bindings.data(); VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout_create_info, nullptr, &sampler_descriptor_set_layout)); // Pipeline layout @@ -651,8 +638,8 @@ void Profiles::prepare_pipelines() // Load shaders std::array shader_stages{}; - shader_stages[0] = load_shader("profiles", "profiles.vert", VK_SHADER_STAGE_VERTEX_BIT); - shader_stages[1] = load_shader("profiles", "profiles.frag", VK_SHADER_STAGE_FRAGMENT_BIT); + shader_stages[0] = load_shader("profiles", "profiles.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shader_stages[1] = load_shader("profiles", "profiles.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Vertex bindings and attributes const std::vector vertex_input_bindings = { diff --git a/samples/tooling/profiles/profiles.h b/samples/tooling/profiles/profiles.h index 9f623ee287..3700fb21d2 100644 --- a/samples/tooling/profiles/profiles.h +++ b/samples/tooling/profiles/profiles.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2022-2024, Sascha Willems - * Copyright (c) 2024, Arm Limited and Contributors +/* Copyright (c) 2022-2025, Sascha Willems + * Copyright (c) 2024-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -67,22 +67,22 @@ class Profiles : public ApiVulkanSample Profiles(); ~Profiles() override; - void generate_textures(); - void generate_cubes(); - void build_command_buffers() override; - void draw(); - void setup_descriptor_pool(); - void setup_descriptor_set_layout(); - void setup_descriptor_set(); - void prepare_pipelines(); - void prepare_uniform_buffers(); - void update_uniform_buffers(); - bool prepare(const vkb::ApplicationOptions &options) override; - void render(float delta_time) override; - void view_changed() override; - std::unique_ptr create_device(vkb::PhysicalDevice &gpu) override; - std::unique_ptr create_instance() override; - virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; + void generate_textures(); + void generate_cubes(); + void build_command_buffers() override; + void draw(); + void setup_descriptor_pool(); + void setup_descriptor_set_layout(); + void setup_descriptor_set(); + void prepare_pipelines(); + void prepare_uniform_buffers(); + void update_uniform_buffers(); + bool prepare(const vkb::ApplicationOptions &options) override; + void render(float delta_time) override; + void view_changed() override; + std::unique_ptr create_device(vkb::core::PhysicalDeviceC &gpu) override; + std::unique_ptr create_instance() override; + virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; }; std::unique_ptr create_profiles(); diff --git a/samples/tooling/profiles/vulkan_profiles.hpp b/samples/tooling/profiles/vulkan_profiles.hpp index b8658164e0..aab81bcfe2 100644 --- a/samples/tooling/profiles/vulkan_profiles.hpp +++ b/samples/tooling/profiles/vulkan_profiles.hpp @@ -1,7 +1,7 @@ /* - * Copyright (C) 2021-2024 Valve Corporation - * Copyright (C) 2021-2024 LunarG, Inc. + * Copyright (C) 2021-2025 Valve Corporation + * Copyright (C) 2021-2025 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ * This file is ***GENERATED***. Do Not Edit. * See scripts/gen_profiles_solution.py for modifications. */ -/* clang-format off */ #pragma once @@ -26,250 +25,423 @@ #include -#include +#include +#include +#include #include +#include +#include #include #include -#include -#include -#include +#include +#include #include #include -#include -#include -#include -#if defined(VK_VERSION_1_1) && \ +#if defined(VK_VERSION_1_1) && \ defined(VK_ANDROID_external_memory_android_hardware_buffer) && \ - defined(VK_EXT_queue_family_foreign) && \ - defined(VK_EXT_swapchain_colorspace) && \ - defined(VK_GOOGLE_display_timing) && \ - defined(VK_KHR_android_surface) && \ - defined(VK_KHR_create_renderpass2) && \ - defined(VK_KHR_dedicated_allocation) && \ - defined(VK_KHR_descriptor_update_template) && \ - defined(VK_KHR_driver_properties) && \ - defined(VK_KHR_external_fence) && \ - defined(VK_KHR_external_fence_capabilities) && \ - defined(VK_KHR_external_fence_fd) && \ - defined(VK_KHR_external_memory) && \ - defined(VK_KHR_external_memory_capabilities) && \ - defined(VK_KHR_external_semaphore) && \ - defined(VK_KHR_external_semaphore_capabilities) && \ - defined(VK_KHR_external_semaphore_fd) && \ - defined(VK_KHR_get_memory_requirements2) && \ - defined(VK_KHR_get_physical_device_properties2) && \ - defined(VK_KHR_get_surface_capabilities2) && \ - defined(VK_KHR_incremental_present) && \ - defined(VK_KHR_maintenance1) && \ - defined(VK_KHR_sampler_mirror_clamp_to_edge) && \ - defined(VK_KHR_storage_buffer_storage_class) && \ - defined(VK_KHR_surface) && \ - defined(VK_KHR_swapchain) && \ + defined(VK_EXT_queue_family_foreign) && \ + defined(VK_EXT_swapchain_colorspace) && \ + defined(VK_GOOGLE_display_timing) && \ + defined(VK_KHR_android_surface) && \ + defined(VK_KHR_create_renderpass2) && \ + defined(VK_KHR_dedicated_allocation) && \ + defined(VK_KHR_descriptor_update_template) && \ + defined(VK_KHR_driver_properties) && \ + defined(VK_KHR_external_fence) && \ + defined(VK_KHR_external_fence_capabilities) && \ + defined(VK_KHR_external_fence_fd) && \ + defined(VK_KHR_external_memory) && \ + defined(VK_KHR_external_memory_capabilities) && \ + defined(VK_KHR_external_semaphore) && \ + defined(VK_KHR_external_semaphore_capabilities) && \ + defined(VK_KHR_external_semaphore_fd) && \ + defined(VK_KHR_get_memory_requirements2) && \ + defined(VK_KHR_get_physical_device_properties2) && \ + defined(VK_KHR_get_surface_capabilities2) && \ + defined(VK_KHR_incremental_present) && \ + defined(VK_KHR_maintenance1) && \ + defined(VK_KHR_sampler_mirror_clamp_to_edge) && \ + defined(VK_KHR_storage_buffer_storage_class) && \ + defined(VK_KHR_surface) && \ + defined(VK_KHR_swapchain) && \ defined(VK_KHR_variable_pointers) -#define VP_ANDROID_baseline_2022 1 -#define VP_ANDROID_BASELINE_2022_NAME "VP_ANDROID_baseline_2022" -#define VP_ANDROID_BASELINE_2022_SPEC_VERSION 2 -#define VP_ANDROID_BASELINE_2022_MIN_API_VERSION VK_MAKE_VERSION(1, 1, 106) +# define VP_ANDROID_baseline_2022 1 +# define VP_ANDROID_BASELINE_2022_NAME "VP_ANDROID_baseline_2022" +# define VP_ANDROID_BASELINE_2022_SPEC_VERSION 2 +# define VP_ANDROID_BASELINE_2022_MIN_API_VERSION VK_MAKE_VERSION(1, 1, 106) #endif -#if defined(VK_VERSION_1_3) && \ - defined(VP_ANDROID_baseline_2022) && \ - defined(VK_ANDROID_external_format_resolve) && \ - defined(VK_EXT_4444_formats) && \ - defined(VK_EXT_custom_border_color) && \ - defined(VK_EXT_device_memory_report) && \ +#if defined(VK_VERSION_1_3) && \ + defined(VP_ANDROID_baseline_2022) && \ + defined(VK_ANDROID_external_format_resolve) && \ + defined(VK_EXT_4444_formats) && \ + defined(VK_EXT_custom_border_color) && \ + defined(VK_EXT_device_memory_report) && \ defined(VK_EXT_external_memory_acquire_unmodified) && \ - defined(VK_EXT_index_type_uint8) && \ - defined(VK_EXT_line_rasterization) && \ - defined(VK_EXT_load_store_op_none) && \ - defined(VK_EXT_primitive_topology_list_restart) && \ - defined(VK_EXT_primitives_generated_query) && \ - defined(VK_EXT_provoking_vertex) && \ - defined(VK_EXT_scalar_block_layout) && \ - defined(VK_EXT_surface_maintenance1) && \ - defined(VK_EXT_swapchain_maintenance1) && \ - defined(VK_GOOGLE_surfaceless_query) && \ - defined(VK_IMG_relaxed_line_rasterization) && \ - defined(VK_KHR_16bit_storage) && \ - defined(VK_KHR_maintenance5) && \ - defined(VK_KHR_shader_float16_int8) && \ + defined(VK_EXT_index_type_uint8) && \ + defined(VK_EXT_line_rasterization) && \ + defined(VK_EXT_load_store_op_none) && \ + defined(VK_EXT_primitive_topology_list_restart) && \ + defined(VK_EXT_primitives_generated_query) && \ + defined(VK_EXT_provoking_vertex) && \ + defined(VK_EXT_scalar_block_layout) && \ + defined(VK_EXT_surface_maintenance1) && \ + defined(VK_EXT_swapchain_maintenance1) && \ + defined(VK_GOOGLE_surfaceless_query) && \ + defined(VK_IMG_relaxed_line_rasterization) && \ + defined(VK_KHR_16bit_storage) && \ + defined(VK_KHR_maintenance5) && \ + defined(VK_KHR_shader_float16_int8) && \ defined(VK_KHR_vertex_attribute_divisor) -#define VP_ANDROID_15_minimums 1 -#define VP_ANDROID_15_MINIMUMS_NAME "VP_ANDROID_15_minimums" -#define VP_ANDROID_15_MINIMUMS_SPEC_VERSION 1 -#define VP_ANDROID_15_MINIMUMS_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 273) +# define VP_ANDROID_15_minimums 1 +# define VP_ANDROID_15_MINIMUMS_NAME "VP_ANDROID_15_minimums" +# define VP_ANDROID_15_MINIMUMS_SPEC_VERSION 1 +# define VP_ANDROID_15_MINIMUMS_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 273) #endif -#if defined(VK_VERSION_1_3) && \ - defined(VP_ANDROID_15_minimums) && \ - defined(VP_ANDROID_baseline_2022) && \ - defined(VK_EXT_host_image_copy) && \ - defined(VK_EXT_image_2d_view_of_3d) && \ +#if defined(VK_VERSION_1_3) && \ + defined(VP_ANDROID_15_minimums) && \ + defined(VP_ANDROID_baseline_2022) && \ + defined(VK_EXT_host_image_copy) && \ + defined(VK_EXT_image_2d_view_of_3d) && \ defined(VK_EXT_multisampled_render_to_single_sampled) && \ - defined(VK_EXT_pipeline_protected_access) && \ - defined(VK_EXT_pipeline_robustness) && \ - defined(VK_EXT_shader_stencil_export) && \ - defined(VK_EXT_transform_feedback) && \ - defined(VK_KHR_8bit_storage) && \ - defined(VK_KHR_global_priority) && \ - defined(VK_KHR_load_store_op_none) && \ - defined(VK_KHR_maintenance6) && \ - defined(VK_KHR_map_memory2) && \ - defined(VK_KHR_push_descriptor) && \ - defined(VK_KHR_shader_expect_assume) && \ - defined(VK_KHR_shader_float_controls2) && \ - defined(VK_KHR_shader_maximal_reconvergence) && \ - defined(VK_KHR_shader_subgroup_rotate) && \ - defined(VK_KHR_shader_subgroup_uniform_control_flow) && \ + defined(VK_EXT_pipeline_protected_access) && \ + defined(VK_EXT_pipeline_robustness) && \ + defined(VK_EXT_shader_stencil_export) && \ + defined(VK_EXT_transform_feedback) && \ + defined(VK_KHR_8bit_storage) && \ + defined(VK_KHR_load_store_op_none) && \ + defined(VK_KHR_maintenance6) && \ + defined(VK_KHR_map_memory2) && \ + defined(VK_KHR_shader_expect_assume) && \ + defined(VK_KHR_shader_float_controls2) && \ + defined(VK_KHR_shader_maximal_reconvergence) && \ + defined(VK_KHR_shader_subgroup_rotate) && \ + defined(VK_KHR_shader_subgroup_uniform_control_flow) && \ defined(VK_KHR_swapchain_mutable_format) -#define VP_ANDROID_16_minimums 1 -#define VP_ANDROID_16_MINIMUMS_NAME "VP_ANDROID_16_minimums" -#define VP_ANDROID_16_MINIMUMS_SPEC_VERSION 1 -#define VP_ANDROID_16_MINIMUMS_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 276) +# define VP_ANDROID_16_minimums 1 +# define VP_ANDROID_16_MINIMUMS_NAME "VP_ANDROID_16_minimums" +# define VP_ANDROID_16_MINIMUMS_SPEC_VERSION 1 +# define VP_ANDROID_16_MINIMUMS_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 276) #endif -#if defined(VK_VERSION_1_0) && \ - defined(VK_EXT_swapchain_colorspace) && \ - defined(VK_GOOGLE_display_timing) && \ - defined(VK_KHR_android_surface) && \ - defined(VK_KHR_dedicated_allocation) && \ - defined(VK_KHR_descriptor_update_template) && \ - defined(VK_KHR_external_fence) && \ - defined(VK_KHR_external_fence_capabilities) && \ - defined(VK_KHR_external_fence_fd) && \ - defined(VK_KHR_external_memory) && \ - defined(VK_KHR_external_memory_capabilities) && \ - defined(VK_KHR_external_semaphore) && \ +#if defined(VK_VERSION_1_0) && \ + defined(VK_EXT_swapchain_colorspace) && \ + defined(VK_GOOGLE_display_timing) && \ + defined(VK_KHR_android_surface) && \ + defined(VK_KHR_dedicated_allocation) && \ + defined(VK_KHR_descriptor_update_template) && \ + defined(VK_KHR_external_fence) && \ + defined(VK_KHR_external_fence_capabilities) && \ + defined(VK_KHR_external_fence_fd) && \ + defined(VK_KHR_external_memory) && \ + defined(VK_KHR_external_memory_capabilities) && \ + defined(VK_KHR_external_semaphore) && \ defined(VK_KHR_external_semaphore_capabilities) && \ - defined(VK_KHR_external_semaphore_fd) && \ - defined(VK_KHR_get_memory_requirements2) && \ + defined(VK_KHR_external_semaphore_fd) && \ + defined(VK_KHR_get_memory_requirements2) && \ defined(VK_KHR_get_physical_device_properties2) && \ - defined(VK_KHR_get_surface_capabilities2) && \ - defined(VK_KHR_incremental_present) && \ - defined(VK_KHR_maintenance1) && \ - defined(VK_KHR_storage_buffer_storage_class) && \ - defined(VK_KHR_surface) && \ - defined(VK_KHR_swapchain) && \ + defined(VK_KHR_get_surface_capabilities2) && \ + defined(VK_KHR_incremental_present) && \ + defined(VK_KHR_maintenance1) && \ + defined(VK_KHR_storage_buffer_storage_class) && \ + defined(VK_KHR_surface) && \ + defined(VK_KHR_swapchain) && \ defined(VK_KHR_variable_pointers) -#define VP_ANDROID_baseline_2021 1 -#define VP_ANDROID_BASELINE_2021_NAME "VP_ANDROID_baseline_2021" -#define VP_ANDROID_BASELINE_2021_SPEC_VERSION 3 -#define VP_ANDROID_BASELINE_2021_MIN_API_VERSION VK_MAKE_VERSION(1, 0, 68) +# define VP_ANDROID_baseline_2021 1 +# define VP_ANDROID_BASELINE_2021_NAME "VP_ANDROID_baseline_2021" +# define VP_ANDROID_BASELINE_2021_SPEC_VERSION 3 +# define VP_ANDROID_BASELINE_2021_MIN_API_VERSION VK_MAKE_VERSION(1, 0, 68) #endif #if defined(VK_VERSION_1_3) && \ defined(VK_KHR_global_priority) -#define VP_KHR_roadmap_2022 1 -#define VP_KHR_ROADMAP_2022_NAME "VP_KHR_roadmap_2022" -#define VP_KHR_ROADMAP_2022_SPEC_VERSION 1 -#define VP_KHR_ROADMAP_2022_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 204) +# define VP_KHR_roadmap_2022 1 +# define VP_KHR_ROADMAP_2022_NAME "VP_KHR_roadmap_2022" +# define VP_KHR_ROADMAP_2022_SPEC_VERSION 1 +# define VP_KHR_ROADMAP_2022_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 204) #endif -#if defined(VK_VERSION_1_3) && \ - defined(VP_KHR_roadmap_2022) && \ - defined(VK_KHR_dynamic_rendering_local_read) && \ - defined(VK_KHR_index_type_uint8) && \ - defined(VK_KHR_line_rasterization) && \ - defined(VK_KHR_load_store_op_none) && \ - defined(VK_KHR_maintenance5) && \ - defined(VK_KHR_map_memory2) && \ - defined(VK_KHR_push_descriptor) && \ - defined(VK_KHR_shader_expect_assume) && \ - defined(VK_KHR_shader_float_controls2) && \ - defined(VK_KHR_shader_maximal_reconvergence) && \ - defined(VK_KHR_shader_quad_control) && \ - defined(VK_KHR_shader_subgroup_rotate) && \ +#if defined(VK_VERSION_1_3) && \ + defined(VP_KHR_roadmap_2022) && \ + defined(VK_KHR_dynamic_rendering_local_read) && \ + defined(VK_KHR_index_type_uint8) && \ + defined(VK_KHR_line_rasterization) && \ + defined(VK_KHR_load_store_op_none) && \ + defined(VK_KHR_maintenance5) && \ + defined(VK_KHR_map_memory2) && \ + defined(VK_KHR_push_descriptor) && \ + defined(VK_KHR_shader_expect_assume) && \ + defined(VK_KHR_shader_float_controls2) && \ + defined(VK_KHR_shader_maximal_reconvergence) && \ + defined(VK_KHR_shader_quad_control) && \ + defined(VK_KHR_shader_subgroup_rotate) && \ defined(VK_KHR_shader_subgroup_uniform_control_flow) && \ defined(VK_KHR_vertex_attribute_divisor) -#define VP_KHR_roadmap_2024 1 -#define VP_KHR_ROADMAP_2024_NAME "VP_KHR_roadmap_2024" -#define VP_KHR_ROADMAP_2024_SPEC_VERSION 1 -#define VP_KHR_ROADMAP_2024_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 276) +# define VP_KHR_roadmap_2024 1 +# define VP_KHR_ROADMAP_2024_NAME "VP_KHR_roadmap_2024" +# define VP_KHR_ROADMAP_2024_SPEC_VERSION 1 +# define VP_KHR_ROADMAP_2024_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 276) +#endif + +#if defined(VK_VERSION_1_1) && \ + defined(VK_EXT_descriptor_indexing) && \ + defined(VK_EXT_host_query_reset) && \ + defined(VK_EXT_inline_uniform_block) && \ + defined(VK_EXT_memory_budget) && \ + defined(VK_EXT_robustness2) && \ + defined(VK_EXT_scalar_block_layout) && \ + defined(VK_EXT_subgroup_size_control) && \ + defined(VK_EXT_texel_buffer_alignment) && \ + defined(VK_EXT_vertex_attribute_divisor) && \ + defined(VK_KHR_16bit_storage) && \ + defined(VK_KHR_8bit_storage) && \ + defined(VK_KHR_bind_memory2) && \ + defined(VK_KHR_create_renderpass2) && \ + defined(VK_KHR_dedicated_allocation) && \ + defined(VK_KHR_depth_stencil_resolve) && \ + defined(VK_KHR_descriptor_update_template) && \ + defined(VK_KHR_device_group) && \ + defined(VK_KHR_driver_properties) && \ + defined(VK_KHR_external_fence) && \ + defined(VK_KHR_external_memory) && \ + defined(VK_KHR_external_semaphore) && \ + defined(VK_KHR_get_memory_requirements2) && \ + defined(VK_KHR_image_format_list) && \ + defined(VK_KHR_maintenance1) && \ + defined(VK_KHR_maintenance2) && \ + defined(VK_KHR_maintenance3) && \ + defined(VK_KHR_multiview) && \ + defined(VK_KHR_relaxed_block_layout) && \ + defined(VK_KHR_sampler_mirror_clamp_to_edge) && \ + defined(VK_KHR_shader_draw_parameters) && \ + defined(VK_KHR_shader_float16_int8) && \ + defined(VK_KHR_storage_buffer_storage_class) && \ + defined(VK_KHR_swapchain) && \ + defined(VK_KHR_swapchain_mutable_format) && \ + defined(VK_KHR_timeline_semaphore) && \ + defined(VK_KHR_uniform_buffer_standard_layout) && \ + defined(VK_KHR_variable_pointers) +# define VP_LUNARG_desktop_baseline_2022 1 +# define VP_LUNARG_DESKTOP_BASELINE_2022_NAME "VP_LUNARG_desktop_baseline_2022" +# define VP_LUNARG_DESKTOP_BASELINE_2022_SPEC_VERSION 2 +# define VP_LUNARG_DESKTOP_BASELINE_2022_MIN_API_VERSION VK_MAKE_VERSION(1, 1, 139) +#endif + +#if defined(VK_VERSION_1_2) && \ + defined(VK_EXT_descriptor_indexing) && \ + defined(VK_EXT_host_query_reset) && \ + defined(VK_EXT_image_robustness) && \ + defined(VK_EXT_inline_uniform_block) && \ + defined(VK_EXT_memory_budget) && \ + defined(VK_EXT_robustness2) && \ + defined(VK_EXT_subgroup_size_control) && \ + defined(VK_EXT_texel_buffer_alignment) && \ + defined(VK_EXT_vertex_attribute_divisor) && \ + defined(VK_KHR_16bit_storage) && \ + defined(VK_KHR_8bit_storage) && \ + defined(VK_KHR_bind_memory2) && \ + defined(VK_KHR_create_renderpass2) && \ + defined(VK_KHR_dedicated_allocation) && \ + defined(VK_KHR_depth_stencil_resolve) && \ + defined(VK_KHR_descriptor_update_template) && \ + defined(VK_KHR_device_group) && \ + defined(VK_KHR_driver_properties) && \ + defined(VK_KHR_external_fence) && \ + defined(VK_KHR_external_memory) && \ + defined(VK_KHR_external_semaphore) && \ + defined(VK_KHR_get_memory_requirements2) && \ + defined(VK_KHR_image_format_list) && \ + defined(VK_KHR_imageless_framebuffer) && \ + defined(VK_KHR_maintenance1) && \ + defined(VK_KHR_maintenance2) && \ + defined(VK_KHR_maintenance3) && \ + defined(VK_KHR_multiview) && \ + defined(VK_KHR_relaxed_block_layout) && \ + defined(VK_KHR_sampler_mirror_clamp_to_edge) && \ + defined(VK_KHR_separate_depth_stencil_layouts) && \ + defined(VK_KHR_shader_draw_parameters) && \ + defined(VK_KHR_shader_float16_int8) && \ + defined(VK_KHR_shader_float_controls) && \ + defined(VK_KHR_spirv_1_4) && \ + defined(VK_KHR_storage_buffer_storage_class) && \ + defined(VK_KHR_swapchain) && \ + defined(VK_KHR_swapchain_mutable_format) && \ + defined(VK_KHR_timeline_semaphore) && \ + defined(VK_KHR_uniform_buffer_standard_layout) && \ + defined(VK_KHR_variable_pointers) +# define VP_LUNARG_desktop_baseline_2023 1 +# define VP_LUNARG_DESKTOP_BASELINE_2023_NAME "VP_LUNARG_desktop_baseline_2023" +# define VP_LUNARG_DESKTOP_BASELINE_2023_SPEC_VERSION 2 +# define VP_LUNARG_DESKTOP_BASELINE_2023_MIN_API_VERSION VK_MAKE_VERSION(1, 2, 148) +#endif + +#if defined(VK_VERSION_1_2) && \ + defined(VK_EXT_4444_formats) && \ + defined(VK_EXT_calibrated_timestamps) && \ + defined(VK_EXT_descriptor_indexing) && \ + defined(VK_EXT_extended_dynamic_state) && \ + defined(VK_EXT_extended_dynamic_state2) && \ + defined(VK_EXT_external_memory_host) && \ + defined(VK_EXT_host_query_reset) && \ + defined(VK_EXT_image_robustness) && \ + defined(VK_EXT_inline_uniform_block) && \ + defined(VK_EXT_memory_budget) && \ + defined(VK_EXT_pipeline_creation_cache_control) && \ + defined(VK_EXT_pipeline_creation_feedback) && \ + defined(VK_EXT_private_data) && \ + defined(VK_EXT_robustness2) && \ + defined(VK_EXT_scalar_block_layout) && \ + defined(VK_EXT_separate_stencil_usage) && \ + defined(VK_EXT_shader_atomic_float) && \ + defined(VK_EXT_shader_demote_to_helper_invocation) && \ + defined(VK_EXT_shader_subgroup_ballot) && \ + defined(VK_EXT_shader_subgroup_vote) && \ + defined(VK_EXT_shader_viewport_index_layer) && \ + defined(VK_EXT_subgroup_size_control) && \ + defined(VK_EXT_texel_buffer_alignment) && \ + defined(VK_EXT_vertex_attribute_divisor) && \ + defined(VK_KHR_16bit_storage) && \ + defined(VK_KHR_8bit_storage) && \ + defined(VK_KHR_bind_memory2) && \ + defined(VK_KHR_buffer_device_address) && \ + defined(VK_KHR_copy_commands2) && \ + defined(VK_KHR_create_renderpass2) && \ + defined(VK_KHR_dedicated_allocation) && \ + defined(VK_KHR_depth_stencil_resolve) && \ + defined(VK_KHR_descriptor_update_template) && \ + defined(VK_KHR_device_group) && \ + defined(VK_KHR_driver_properties) && \ + defined(VK_KHR_dynamic_rendering) && \ + defined(VK_KHR_external_fence) && \ + defined(VK_KHR_external_memory) && \ + defined(VK_KHR_external_semaphore) && \ + defined(VK_KHR_format_feature_flags2) && \ + defined(VK_KHR_get_memory_requirements2) && \ + defined(VK_KHR_image_format_list) && \ + defined(VK_KHR_imageless_framebuffer) && \ + defined(VK_KHR_maintenance1) && \ + defined(VK_KHR_maintenance2) && \ + defined(VK_KHR_maintenance3) && \ + defined(VK_KHR_multiview) && \ + defined(VK_KHR_push_descriptor) && \ + defined(VK_KHR_relaxed_block_layout) && \ + defined(VK_KHR_sampler_mirror_clamp_to_edge) && \ + defined(VK_KHR_separate_depth_stencil_layouts) && \ + defined(VK_KHR_shader_draw_parameters) && \ + defined(VK_KHR_shader_float16_int8) && \ + defined(VK_KHR_shader_float_controls) && \ + defined(VK_KHR_shader_non_semantic_info) && \ + defined(VK_KHR_shader_subgroup_extended_types) && \ + defined(VK_KHR_spirv_1_4) && \ + defined(VK_KHR_storage_buffer_storage_class) && \ + defined(VK_KHR_swapchain) && \ + defined(VK_KHR_swapchain_mutable_format) && \ + defined(VK_KHR_synchronization2) && \ + defined(VK_KHR_timeline_semaphore) && \ + defined(VK_KHR_uniform_buffer_standard_layout) && \ + defined(VK_KHR_variable_pointers) +# define VP_LUNARG_desktop_baseline_2024 1 +# define VP_LUNARG_DESKTOP_BASELINE_2024_NAME "VP_LUNARG_desktop_baseline_2024" +# define VP_LUNARG_DESKTOP_BASELINE_2024_SPEC_VERSION 1 +# define VP_LUNARG_DESKTOP_BASELINE_2024_MIN_API_VERSION VK_MAKE_VERSION(1, 2, 197) #endif #if defined(VK_VERSION_1_0) -#define VP_LUNARG_minimum_requirements_1_0 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_NAME "VP_LUNARG_minimum_requirements_1_0" -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_SPEC_VERSION 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_MIN_API_VERSION VK_MAKE_VERSION(1, 0, 68) +# define VP_LUNARG_minimum_requirements_1_0 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_NAME "VP_LUNARG_minimum_requirements_1_0" +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_SPEC_VERSION 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_MIN_API_VERSION VK_MAKE_VERSION(1, 0, 68) #endif #if defined(VK_VERSION_1_1) -#define VP_LUNARG_minimum_requirements_1_1 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_NAME "VP_LUNARG_minimum_requirements_1_1" -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_SPEC_VERSION 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_MIN_API_VERSION VK_MAKE_VERSION(1, 1, 108) +# define VP_LUNARG_minimum_requirements_1_1 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_NAME "VP_LUNARG_minimum_requirements_1_1" +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_SPEC_VERSION 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_MIN_API_VERSION VK_MAKE_VERSION(1, 1, 108) #endif #if defined(VK_VERSION_1_2) -#define VP_LUNARG_minimum_requirements_1_2 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_NAME "VP_LUNARG_minimum_requirements_1_2" -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_SPEC_VERSION 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_MIN_API_VERSION VK_MAKE_VERSION(1, 2, 131) +# define VP_LUNARG_minimum_requirements_1_2 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_NAME "VP_LUNARG_minimum_requirements_1_2" +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_SPEC_VERSION 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_MIN_API_VERSION VK_MAKE_VERSION(1, 2, 131) #endif #if defined(VK_VERSION_1_3) -#define VP_LUNARG_minimum_requirements_1_3 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_NAME "VP_LUNARG_minimum_requirements_1_3" -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_SPEC_VERSION 1 -#define VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 204) +# define VP_LUNARG_minimum_requirements_1_3 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_NAME "VP_LUNARG_minimum_requirements_1_3" +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_SPEC_VERSION 1 +# define VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_MIN_API_VERSION VK_MAKE_VERSION(1, 3, 204) #endif #define VP_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 2, 0, VK_HEADER_VERSION) #define VP_MAX_PROFILE_NAME_SIZE 256U -typedef struct VpProfileProperties { - char profileName[VP_MAX_PROFILE_NAME_SIZE]; - uint32_t specVersion; +typedef struct VpProfileProperties +{ + char profileName[VP_MAX_PROFILE_NAME_SIZE]; + uint32_t specVersion; } VpProfileProperties; -typedef struct VpBlockProperties { - VpProfileProperties profiles; - uint32_t apiVersion; - char blockName[VP_MAX_PROFILE_NAME_SIZE]; +typedef struct VpBlockProperties +{ + VpProfileProperties profiles; + uint32_t apiVersion; + char blockName[VP_MAX_PROFILE_NAME_SIZE]; } VpBlockProperties; -typedef enum VpInstanceCreateFlagBits { - VP_INSTANCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +typedef struct VpVideoProfileProperties +{ + char name[VP_MAX_PROFILE_NAME_SIZE]; +} VpVideoProfileProperties; + +typedef enum VpInstanceCreateFlagBits +{ + VP_INSTANCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VpInstanceCreateFlagBits; typedef VkFlags VpInstanceCreateFlags; -typedef struct VpInstanceCreateInfo { - const VkInstanceCreateInfo* pCreateInfo; - VpInstanceCreateFlags flags; - uint32_t enabledFullProfileCount; - const VpProfileProperties* pEnabledFullProfiles; - uint32_t enabledProfileBlockCount; - const VpBlockProperties* pEnabledProfileBlocks; +typedef struct VpInstanceCreateInfo +{ + const VkInstanceCreateInfo *pCreateInfo; + VpInstanceCreateFlags flags; + uint32_t enabledFullProfileCount; + const VpProfileProperties *pEnabledFullProfiles; + uint32_t enabledProfileBlockCount; + const VpBlockProperties *pEnabledProfileBlocks; } VpInstanceCreateInfo; -typedef enum VpDeviceCreateFlagBits { - VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT = 0x0000001, - VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT = 0x0000002, - VP_DEVICE_CREATE_DISABLE_ROBUST_ACCESS = - VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT | VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT, +typedef enum VpDeviceCreateFlagBits +{ + VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT = 0x0000001, + VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT = 0x0000002, + VP_DEVICE_CREATE_DISABLE_ROBUST_ACCESS = + VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT | VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT, - VP_DEVICE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF + VP_DEVICE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VpDeviceCreateFlagBits; typedef VkFlags VpDeviceCreateFlags; -typedef struct VpDeviceCreateInfo { - const VkDeviceCreateInfo* pCreateInfo; - VpDeviceCreateFlags flags; - uint32_t enabledFullProfileCount; - const VpProfileProperties* pEnabledFullProfiles; - uint32_t enabledProfileBlockCount; - const VpBlockProperties* pEnabledProfileBlocks; +typedef struct VpDeviceCreateInfo +{ + const VkDeviceCreateInfo *pCreateInfo; + VpDeviceCreateFlags flags; + uint32_t enabledFullProfileCount; + const VpProfileProperties *pEnabledFullProfiles; + uint32_t enabledProfileBlockCount; + const VpBlockProperties *pEnabledProfileBlocks; } VpDeviceCreateInfo; VK_DEFINE_HANDLE(VpCapabilities) -typedef enum VpCapabilitiesCreateFlagBits { - VP_PROFILE_CREATE_STATIC_BIT = (1 << 0), - //VP_PROFILE_CREATE_DYNAMIC_BIT = (1 << 1), - VP_PROFILE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +typedef enum VpCapabilitiesCreateFlagBits +{ + VP_PROFILE_CREATE_STATIC_BIT = (1 << 0), + // VP_PROFILE_CREATE_DYNAMIC_BIT = (1 << 1), + VP_PROFILE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VpCapabilitiesCreateFlagBits; typedef VkFlags VpCapabilitiesCreateFlags; @@ -277,411 +449,785 @@ typedef VkFlags VpCapabilitiesCreateFlags; // Pointers to some Vulkan functions - a subset used by the library. // Used in VpCapabilitiesCreateInfo::pVulkanFunctions. -typedef struct VpVulkanFunctions { - /// Required when using VP_DYNAMIC_VULKAN_FUNCTIONS. - PFN_vkGetInstanceProcAddr GetInstanceProcAddr; - /// Required when using VP_DYNAMIC_VULKAN_FUNCTIONS. - PFN_vkGetDeviceProcAddr GetDeviceProcAddr; - PFN_vkEnumerateInstanceVersion EnumerateInstanceVersion; - PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties; - PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties; - PFN_vkGetPhysicalDeviceFeatures2 GetPhysicalDeviceFeatures2; - PFN_vkGetPhysicalDeviceProperties2 GetPhysicalDeviceProperties2; - PFN_vkGetPhysicalDeviceFormatProperties2 GetPhysicalDeviceFormatProperties2; - PFN_vkGetPhysicalDeviceQueueFamilyProperties2 GetPhysicalDeviceQueueFamilyProperties2; - PFN_vkCreateInstance CreateInstance; - PFN_vkCreateDevice CreateDevice; +typedef struct VpVulkanFunctions +{ + /// Required when using VP_DYNAMIC_VULKAN_FUNCTIONS. + PFN_vkGetInstanceProcAddr GetInstanceProcAddr; + /// Required when using VP_DYNAMIC_VULKAN_FUNCTIONS. + PFN_vkGetDeviceProcAddr GetDeviceProcAddr; + PFN_vkEnumerateInstanceVersion EnumerateInstanceVersion; + PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties; + PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties; + PFN_vkGetPhysicalDeviceFeatures2 GetPhysicalDeviceFeatures2; + PFN_vkGetPhysicalDeviceProperties2 GetPhysicalDeviceProperties2; + PFN_vkGetPhysicalDeviceFormatProperties2 GetPhysicalDeviceFormatProperties2; + PFN_vkGetPhysicalDeviceQueueFamilyProperties2 GetPhysicalDeviceQueueFamilyProperties2; + PFN_vkCreateInstance CreateInstance; + PFN_vkCreateDevice CreateDevice; } VpVulkanFunctions; /// Description of a Allocator to be created. typedef struct VpCapabilitiesCreateInfo { - /// Flags for created allocator. Use #VpInstanceCreateFlagBits enum. - VpCapabilitiesCreateFlags flags; - uint32_t apiVersion; - const VpVulkanFunctions* pVulkanFunctions; + /// Flags for created allocator. Use #VpInstanceCreateFlagBits enum. + VpCapabilitiesCreateFlags flags; + uint32_t apiVersion; + const VpVulkanFunctions *pVulkanFunctions; } VpCapabilitiesCreateInfo; VPAPI_ATTR VkResult vpCreateCapabilities( - const VpCapabilitiesCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VpCapabilities* pCapabilities); + const VpCapabilitiesCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VpCapabilities *pCapabilities); /// Destroys allocator object. VPAPI_ATTR void vpDestroyCapabilities( - VpCapabilities capabilities, - const VkAllocationCallbacks* pAllocator); + VpCapabilities capabilities, + const VkAllocationCallbacks *pAllocator); // Query the list of available profiles in the library VPAPI_ATTR VkResult vpGetProfiles( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - uint32_t* pPropertyCount, - VpProfileProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + uint32_t *pPropertyCount, + VpProfileProperties *pProperties); // List the required profiles of a profile VPAPI_ATTR VkResult vpGetProfileRequiredProfiles( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - uint32_t* pPropertyCount, - VpProfileProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + uint32_t *pPropertyCount, + VpProfileProperties *pProperties); // Query the profile required Vulkan API version VPAPI_ATTR uint32_t vpGetProfileAPIVersion( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile); // List the recommended fallback profiles of a profile VPAPI_ATTR VkResult vpGetProfileFallbacks( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - uint32_t* pPropertyCount, - VpProfileProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + uint32_t *pPropertyCount, + VpProfileProperties *pProperties); // Query whether the profile has multiple variants. Profiles with multiple variants can only use vpGetInstanceProfileSupport and vpGetPhysicalDeviceProfileSupport capabilities of the library. Other function will return a VK_ERROR_UNKNOWN error VPAPI_ATTR VkResult vpHasMultipleVariantsProfile( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - VkBool32* pHasMultipleVariants); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + VkBool32 *pHasMultipleVariants); // Check whether a profile is supported at the instance level VPAPI_ATTR VkResult vpGetInstanceProfileSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const char* pLayerName, - const VpProfileProperties* pProfile, - VkBool32* pSupported); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const char *pLayerName, + const VpProfileProperties *pProfile, + VkBool32 *pSupported); // Check whether a variant of a profile is supported at the instance level and report this list of blocks used to validate the profiles VPAPI_ATTR VkResult vpGetInstanceProfileVariantsSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const char* pLayerName, - const VpProfileProperties* pProfile, - VkBool32* pSupported, - uint32_t* pPropertyCount, - VpBlockProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const char *pLayerName, + const VpProfileProperties *pProfile, + VkBool32 *pSupported, + uint32_t *pPropertyCount, + VpBlockProperties *pProperties); // Create a VkInstance with the profile instance extensions enabled VPAPI_ATTR VkResult vpCreateInstance( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpInstanceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkInstance* pInstance); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpInstanceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkInstance *pInstance); // Check whether a profile is supported by the physical device VPAPI_ATTR VkResult vpGetPhysicalDeviceProfileSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - VkInstance instance, - VkPhysicalDevice physicalDevice, - const VpProfileProperties* pProfile, - VkBool32* pSupported); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + VkInstance instance, + VkPhysicalDevice physicalDevice, + const VpProfileProperties *pProfile, + VkBool32 *pSupported); // Check whether a variant of a profile is supported by the physical device and report this list of blocks used to validate the profiles VPAPI_ATTR VkResult vpGetPhysicalDeviceProfileVariantsSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - VkInstance instance, - VkPhysicalDevice physicalDevice, - const VpProfileProperties* pProfile, - VkBool32* pSupported, - uint32_t* pPropertyCount, - VpBlockProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + VkInstance instance, + VkPhysicalDevice physicalDevice, + const VpProfileProperties *pProfile, + VkBool32 *pSupported, + uint32_t *pPropertyCount, + VpBlockProperties *pProperties); // Create a VkDevice with the profile features and device extensions enabled VPAPI_ATTR VkResult vpCreateDevice( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - VkPhysicalDevice physicalDevice, - const VpDeviceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkDevice* pDevice); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + VkPhysicalDevice physicalDevice, + const VpDeviceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDevice *pDevice); // Query the list of instance extensions of a profile VPAPI_ATTR VkResult vpGetProfileInstanceExtensionProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties); // Query the list of device extensions of a profile VPAPI_ATTR VkResult vpGetProfileDeviceExtensionProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties); // Fill the feature structures with the requirements of a profile VPAPI_ATTR VkResult vpGetProfileFeatures( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - void* pNext); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + void *pNext); // Query the list of feature structure types specified by the profile VPAPI_ATTR VkResult vpGetProfileFeatureStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); // Fill the property structures with the requirements of a profile VPAPI_ATTR VkResult vpGetProfileProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - void* pNext); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + void *pNext); // Query the list of property structure types specified by the profile VPAPI_ATTR VkResult vpGetProfilePropertyStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); + +// Fill the queue family property structures with the requirements of a profile +VPAPI_ATTR VkResult vpGetProfileQueueFamilyProperties( +#ifdef VP_USE_OBJECT + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pPropertyCount, + VkQueueFamilyProperties2KHR *pProperties); + +// Query the list of queue family property structure types specified by the profile +VPAPI_ATTR VkResult vpGetProfileQueueFamilyStructureTypes( +#ifdef VP_USE_OBJECT + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); // Query the list of formats with specified requirements by a profile VPAPI_ATTR VkResult vpGetProfileFormats( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pFormatCount, - VkFormat* pFormats); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pFormatCount, + VkFormat *pFormats); // Query the requirements of a format for a profile VPAPI_ATTR VkResult vpGetProfileFormatProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - VkFormat format, - void* pNext); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + VkFormat format, + void *pNext); // Query the list of format structure types specified by the profile VPAPI_ATTR VkResult vpGetProfileFormatStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes); + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); + +#ifdef VK_KHR_video_queue +// Query the list of video profiles specified by the profile +VPAPI_ATTR VkResult vpGetProfileVideoProfiles( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pVideoProfileCount, + VpVideoProfileProperties *pVideoProfiles); + +// Query the video profile info structures for a video profile defined by a profile +VPAPI_ATTR VkResult vpGetProfileVideoProfileInfo( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + VkVideoProfileInfoKHR *pVideoProfileInfo); + +// Query the list of video profile info structure types specified by the profile for a video profile +VPAPI_ATTR VkResult vpGetProfileVideoProfileInfoStructureTypes( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); + +// Query the video capabilities requirements for a video profile defined by a profile +VPAPI_ATTR VkResult vpGetProfileVideoCapabilities( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + void *pNext); + +// Query the list of video capability structure types specified by the profile for a video profile +VPAPI_ATTR VkResult vpGetProfileVideoCapabilityStructureTypes( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); + +// Query the video format property requirements for a video profile defined by a profile +VPAPI_ATTR VkResult vpGetProfileVideoFormatProperties( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pPropertyCount, + VkVideoFormatPropertiesKHR *pProperties); + +// Query the list of video format property structure types specified by the profile for a video profile +VPAPI_ATTR VkResult vpGetProfileVideoFormatStructureTypes( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes); +#endif // VK_KHR_video_queue -namespace detail { +#include +#ifndef VP_DEBUG_MESSAGE_CALLBACK +# if defined(ANDROID) || defined(__ANDROID__) +# include +# define VP_DEBUG_MESSAGE_CALLBACK(MSG) \ + __android_log_print(ANDROID_LOG_ERROR, "Profiles ERROR", "%s", MSG) +# else +# define VP_DEBUG_MESSAGE_CALLBACK(MSG) fprintf(stderr, "%s\n", MSG) +# endif +#else +void VP_DEBUG_MESSAGE_CALLBACK(const char *); +#endif -VPAPI_ATTR std::string FormatString(const char* message, ...) { - std::size_t const STRING_BUFFER(4096); +#define VP_DEBUG_MSG(MSG) VP_DEBUG_MESSAGE_CALLBACK((MSG)) +#define VP_DEBUG_MSGF(MSGFMT, ...) \ + { \ + char msg[1024]; \ + snprintf(msg, sizeof(msg) - 1, (MSGFMT), __VA_ARGS__); \ + VP_DEBUG_MESSAGE_CALLBACK(msg); \ + } +#define VP_DEBUG_COND_MSG(COND, MSG) \ + if ((COND)) \ + { \ + VP_DEBUG_MSG((MSG)); \ + } +#define VP_DEBUG_COND_MSGF(COND, MSGFMT, ...) \ + if ((COND)) \ + { \ + VP_DEBUG_MSGF((MSGFMT), __VA_ARGS__); \ + } + +namespace detail +{ - assert(message != nullptr); - assert(strlen(message) >= 1 && strlen(message) < STRING_BUFFER); +VPAPI_ATTR std::string FormatString(const char *message, ...) +{ + std::size_t const STRING_BUFFER(4096); - char buffer[STRING_BUFFER]; - va_list list; + assert(message != nullptr); + assert(strlen(message) >= 1 && strlen(message) < STRING_BUFFER); - va_start(list, message); - vsnprintf(buffer, STRING_BUFFER, message, list); - va_end(list); + char buffer[STRING_BUFFER]; + va_list list; - return buffer; -} + va_start(list, message); + vsnprintf(buffer, STRING_BUFFER, message, list); + va_end(list); -VPAPI_ATTR const void* vpGetStructure(const void* pNext, VkStructureType type) { - const VkBaseOutStructure* p = static_cast(pNext); - while (p != nullptr) { - if (p->sType == type) return p; - p = p->pNext; - } - return nullptr; + return buffer; } -VPAPI_ATTR void* vpGetStructure(void* pNext, VkStructureType type) { - VkBaseOutStructure* p = static_cast(pNext); - while (p != nullptr) { - if (p->sType == type) return p; - p = p->pNext; - } - return nullptr; +VPAPI_ATTR const void *vpGetStructure(const void *pNext, VkStructureType type) +{ + const VkBaseOutStructure *p = static_cast(pNext); + while (p != nullptr) + { + if (p->sType == type) + return p; + p = p->pNext; + } + return nullptr; } -VPAPI_ATTR VkBaseOutStructure* vpExtractStructure(VkPhysicalDeviceFeatures2KHR* pFeatures, VkStructureType structureType) { - if (structureType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR) { - return nullptr; - } - - VkBaseOutStructure* current = reinterpret_cast(pFeatures); - VkBaseOutStructure* previous = nullptr; - VkBaseOutStructure* found = nullptr; - - while (current != nullptr) { - if (structureType == current->sType) { - found = current; - if (previous != nullptr) { - previous->pNext = current->pNext; - } - current = nullptr; - } else { - previous = current; - current = current->pNext; - } - } - - if (found != nullptr) { - found->pNext = nullptr; - return found; - } else { - return nullptr; - } +VPAPI_ATTR void *vpGetStructure(void *pNext, VkStructureType type) +{ + VkBaseOutStructure *p = static_cast(pNext); + while (p != nullptr) + { + if (p->sType == type) + return p; + p = p->pNext; + } + return nullptr; } -VPAPI_ATTR void GatherStructureTypes(std::vector& structureTypes, VkBaseOutStructure* pNext) { - while (pNext) { - if (std::find(structureTypes.begin(), structureTypes.end(), pNext->sType) == structureTypes.end()) { - structureTypes.push_back(pNext->sType); - } +VPAPI_ATTR VkBaseOutStructure *vpExtractStructure(VkPhysicalDeviceFeatures2KHR *pFeatures, VkStructureType structureType) +{ + if (structureType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR) + { + return nullptr; + } + + VkBaseOutStructure *current = reinterpret_cast(pFeatures); + VkBaseOutStructure *previous = nullptr; + VkBaseOutStructure *found = nullptr; + + while (current != nullptr) + { + if (structureType == current->sType) + { + found = current; + if (previous != nullptr) + { + previous->pNext = current->pNext; + } + current = nullptr; + } + else + { + previous = current; + current = current->pNext; + } + } + + if (found != nullptr) + { + found->pNext = nullptr; + return found; + } + else + { + return nullptr; + } +} - pNext = pNext->pNext; - } +VPAPI_ATTR void GatherStructureTypes(std::vector &structureTypes, VkBaseOutStructure *pNext) +{ + while (pNext) + { + if (std::find(structureTypes.begin(), structureTypes.end(), pNext->sType) == structureTypes.end()) + { + structureTypes.push_back(pNext->sType); + } + + pNext = pNext->pNext; + } } -VPAPI_ATTR bool isMultiple(double source, double multiple) { - double mod = std::fmod(source, multiple); - return std::abs(mod) < 0.0001; +VPAPI_ATTR bool isMultiple(double source, double multiple) +{ + double mod = std::fmod(source, multiple); + return std::abs(mod) < 0.0001; } -VPAPI_ATTR bool isPowerOfTwo(double source) { - double mod = std::fmod(source, 1.0); - if (std::abs(mod) >= 0.0001) return false; +VPAPI_ATTR bool isPowerOfTwo(double source) +{ + double mod = std::fmod(source, 1.0); + if (std::abs(mod) >= 0.0001) + return false; - std::uint64_t value = static_cast(std::abs(source)); - return !(value & (value - static_cast(1))); + std::uint64_t value = static_cast(std::abs(source)); + return !(value & (value - static_cast(1))); } -using PFN_vpStructFiller = void(*)(VkBaseOutStructure* p); -using PFN_vpStructComparator = bool(*)(VkBaseOutStructure* p); -using PFN_vpStructChainerCb = void(*)(VkBaseOutStructure* p, void* pUser); -using PFN_vpStructChainer = void(*)(VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb); +using PFN_vpStructFiller = void (*)(VkBaseOutStructure *p); +using PFN_vpStructComparator = bool (*)(VkBaseOutStructure *p); +using PFN_vpStructChainerCb = void (*)(VkBaseOutStructure *p, void *pUser); +using PFN_vpStructChainer = void (*)(VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb); +using PFN_vpStructArrayChainerCb = void (*)(uint32_t count, VkBaseOutStructure *p, void *pUser); +using PFN_vpStructArrayChainer = void (*)(uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb); + +struct VpFeatureDesc +{ + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; +}; + +struct VpPropertyDesc +{ + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; +}; + +struct VpQueueFamilyDesc +{ + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; +}; + +struct VpFormatDesc +{ + VkFormat format; + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; +}; + +struct VpStructChainerDesc +{ + PFN_vpStructChainer pfnFeature; + PFN_vpStructChainer pfnProperty; + PFN_vpStructArrayChainer pfnQueueFamily; + PFN_vpStructChainer pfnFormat; +}; -struct VpFeatureDesc { - PFN_vpStructFiller pfnFiller; - PFN_vpStructComparator pfnComparator; +struct VpVideoProfileInfoDesc +{ + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; }; -struct VpPropertyDesc { - PFN_vpStructFiller pfnFiller; - PFN_vpStructComparator pfnComparator; +struct VpVideoCapabilityDesc +{ + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; }; -struct VpQueueFamilyDesc { - PFN_vpStructFiller pfnFiller; - PFN_vpStructComparator pfnComparator; +struct VpVideoFormatDesc +{ + PFN_vpStructFiller pfnFiller; + PFN_vpStructComparator pfnComparator; }; -struct VpFormatDesc { - VkFormat format; - PFN_vpStructFiller pfnFiller; - PFN_vpStructComparator pfnComparator; +struct VpVideoProfileStructChainerDesc +{ + PFN_vpStructChainer pfnInfo; + PFN_vpStructChainer pfnCapability; + PFN_vpStructArrayChainer pfnFormat; }; -struct VpStructChainerDesc { - PFN_vpStructChainer pfnFeature; - PFN_vpStructChainer pfnProperty; - PFN_vpStructChainer pfnQueueFamily; - PFN_vpStructChainer pfnFormat; +struct VpVideoProfileDesc +{ + VpVideoProfileProperties properties; + + uint32_t infoStructTypeCount; + const VkStructureType *pInfoStructTypes; + VpVideoProfileInfoDesc info; + + uint32_t capabilityStructTypeCount; + const VkStructureType *pCapabilityStructTypes; + VpVideoCapabilityDesc capability; + + uint32_t formatStructTypeCount; + const VkStructureType *pFormatStructTypes; + uint32_t formatCount; + const VpVideoFormatDesc *pFormats; + + VpVideoProfileStructChainerDesc chainers; }; -struct VpVariantDesc { - char blockName[VP_MAX_PROFILE_NAME_SIZE]; +struct VpVariantDesc +{ + char blockName[VP_MAX_PROFILE_NAME_SIZE]; + + uint32_t instanceExtensionCount; + const VkExtensionProperties *pInstanceExtensions; - uint32_t instanceExtensionCount; - const VkExtensionProperties* pInstanceExtensions; + uint32_t deviceExtensionCount; + const VkExtensionProperties *pDeviceExtensions; - uint32_t deviceExtensionCount; - const VkExtensionProperties* pDeviceExtensions; + uint32_t featureStructTypeCount; + const VkStructureType *pFeatureStructTypes; + VpFeatureDesc feature; - uint32_t featureStructTypeCount; - const VkStructureType* pFeatureStructTypes; - VpFeatureDesc feature; + uint32_t propertyStructTypeCount; + const VkStructureType *pPropertyStructTypes; + VpPropertyDesc property; - uint32_t propertyStructTypeCount; - const VkStructureType* pPropertyStructTypes; - VpPropertyDesc property; + uint32_t queueFamilyStructTypeCount; + const VkStructureType *pQueueFamilyStructTypes; + uint32_t queueFamilyCount; + const VpQueueFamilyDesc *pQueueFamilies; - uint32_t queueFamilyStructTypeCount; - const VkStructureType* pQueueFamilyStructTypes; - uint32_t queueFamilyCount; - const VpQueueFamilyDesc* pQueueFamilies; + uint32_t formatStructTypeCount; + const VkStructureType *pFormatStructTypes; + uint32_t formatCount; + const VpFormatDesc *pFormats; - uint32_t formatStructTypeCount; - const VkStructureType* pFormatStructTypes; - uint32_t formatCount; - const VpFormatDesc* pFormats; + VpStructChainerDesc chainers; - VpStructChainerDesc chainers; + uint32_t videoProfileCount; + const VpVideoProfileDesc *pVideoProfiles; }; -struct VpCapabilitiesDesc { - uint32_t variantCount; - const VpVariantDesc* pVariants; +struct VpCapabilitiesDesc +{ + uint32_t variantCount; + const VpVariantDesc *pVariants; }; -struct VpProfileDesc { - VpProfileProperties props; - uint32_t minApiVersion; +struct VpProfileDesc +{ + VpProfileProperties props; + uint32_t minApiVersion; - const detail::VpVariantDesc* pMergedCapabilities; + const detail::VpVariantDesc *pMergedCapabilities; - uint32_t requiredProfileCount; - const VpProfileProperties* pRequiredProfiles; + uint32_t requiredProfileCount; + const VpProfileProperties *pRequiredProfiles; - uint32_t requiredCapabilityCount; - const VpCapabilitiesDesc* pRequiredCapabilities; + uint32_t requiredCapabilityCount; + const VpCapabilitiesDesc *pRequiredCapabilities; - uint32_t fallbackCount; - const VpProfileProperties* pFallbacks; + uint32_t fallbackCount; + const VpProfileProperties *pFallbacks; }; template -VPAPI_ATTR bool vpCheckFlags(const T& actual, const uint64_t expected) { - return (actual & expected) == expected; +VPAPI_ATTR bool vpCheckFlags(const T &actual, const uint64_t expected) +{ + return (actual & expected) == expected; +} + +#ifdef VK_KHR_video_queue +VPAPI_ATTR void vpForEachMatchingVideoProfiles( + VkVideoProfileInfoKHR *pVideoProfileInfo, + void *pUser, + PFN_vpStructChainerCb pfnCb) +{ + const VkVideoChromaSubsamplingFlagsKHR chroma_subsampling_list[] = { + VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, + VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR, + VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR, + VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR}; + const VkVideoComponentBitDepthFlagsKHR bit_depth_list[] = { + VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, + VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR, + VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR}; + for (size_t chromaSubsampling_idx = 0; chromaSubsampling_idx < std::size(chroma_subsampling_list); ++chromaSubsampling_idx) + { + pVideoProfileInfo->chromaSubsampling = chroma_subsampling_list[chromaSubsampling_idx]; + for (size_t lumaBitDepth_idx = 0; lumaBitDepth_idx < std::size(bit_depth_list); ++lumaBitDepth_idx) + { + pVideoProfileInfo->lumaBitDepth = bit_depth_list[lumaBitDepth_idx]; + for (size_t chromaBitDepth_idx = 0; chromaBitDepth_idx < std::size(bit_depth_list); ++chromaBitDepth_idx) + { + pVideoProfileInfo->chromaBitDepth = bit_depth_list[chromaBitDepth_idx]; + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR; + VkVideoDecodeH264ProfileInfoKHR var_VideoDecodeH264ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR}; + var_VideoDecodeH264ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoDecodeH264ProfileInfoKHR; + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE; + var_VideoDecodeH264ProfileInfoKHR.pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE; + var_VideoDecodeH264ProfileInfoKHR.pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE; + var_VideoDecodeH264ProfileInfoKHR.pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR; + VkVideoDecodeH265ProfileInfoKHR var_VideoDecodeH265ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR}; + var_VideoDecodeH265ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoDecodeH265ProfileInfoKHR; + var_VideoDecodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_10; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR; + VkVideoDecodeVP9ProfileInfoKHR var_VideoDecodeVP9ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR}; + var_VideoDecodeVP9ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoDecodeVP9ProfileInfoKHR; + var_VideoDecodeVP9ProfileInfoKHR.stdProfile = STD_VIDEO_VP9_PROFILE_0; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeVP9ProfileInfoKHR.stdProfile = STD_VIDEO_VP9_PROFILE_1; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeVP9ProfileInfoKHR.stdProfile = STD_VIDEO_VP9_PROFILE_2; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeVP9ProfileInfoKHR.stdProfile = STD_VIDEO_VP9_PROFILE_3; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR; + VkVideoDecodeAV1ProfileInfoKHR var_VideoDecodeAV1ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR}; + var_VideoDecodeAV1ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoDecodeAV1ProfileInfoKHR; + var_VideoDecodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_MAIN; + var_VideoDecodeAV1ProfileInfoKHR.filmGrainSupport = VK_TRUE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_PROFESSIONAL; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_MAIN; + var_VideoDecodeAV1ProfileInfoKHR.filmGrainSupport = VK_FALSE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoDecodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_PROFESSIONAL; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR; + VkVideoEncodeH264ProfileInfoKHR var_VideoEncodeH264ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR}; + var_VideoEncodeH264ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoEncodeH264ProfileInfoKHR; + var_VideoEncodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH264ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR; + VkVideoEncodeH265ProfileInfoKHR var_VideoEncodeH265ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR}; + var_VideoEncodeH265ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoEncodeH265ProfileInfoKHR; + var_VideoEncodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_10; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeH265ProfileInfoKHR.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + { + pVideoProfileInfo->pNext = nullptr; + pVideoProfileInfo->videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR; + VkVideoEncodeAV1ProfileInfoKHR var_VideoEncodeAV1ProfileInfoKHR = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR}; + var_VideoEncodeAV1ProfileInfoKHR.pNext = pVideoProfileInfo->pNext; + pVideoProfileInfo->pNext = &var_VideoEncodeAV1ProfileInfoKHR; + var_VideoEncodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_MAIN; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_HIGH; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + var_VideoEncodeAV1ProfileInfoKHR.stdProfile = STD_VIDEO_AV1_PROFILE_PROFESSIONAL; + pfnCb(reinterpret_cast(pVideoProfileInfo), pUser); + } + } + } + } } +#endif // VK_KHR_video_queue #ifdef VP_ANDROID_15_minimums -namespace VP_ANDROID_15_MINIMUMS { +namespace VP_ANDROID_15_MINIMUMS +{ static const VkStructureType featureStructTypes[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, @@ -711,566 +1257,735 @@ static const VkStructureType formatStructTypes[] = { VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, }; -namespace MUST { +namespace blocks +{ +namespace MUST +{ + static const VkExtensionProperties instanceExtensions[] = { - VkExtensionProperties{ VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME, 1}, }; static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_4444_FORMATS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_5_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_4444_FORMATS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_5_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.drawIndirectFirstInstance = VK_TRUE; - s->features.samplerAnisotropy = VK_TRUE; - s->features.shaderImageGatherExtended = VK_TRUE; - s->features.shaderStorageImageExtendedFormats = VK_TRUE; - s->features.shaderStorageImageReadWithoutFormat = VK_TRUE; - s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->shaderFloat16 = VK_TRUE; - s->shaderInt8 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { - VkPhysicalDeviceCustomBorderColorFeaturesEXT* s = static_cast(static_cast(p)); - s->customBorderColors = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: { - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* s = static_cast(static_cast(p)); - s->primitiveTopologyListRestart = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: { - VkPhysicalDeviceProvokingVertexFeaturesEXT* s = static_cast(static_cast(p)); - s->provokingVertexLast = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { - VkPhysicalDeviceIndexTypeUint8FeaturesEXT* s = static_cast(static_cast(p)); - s->indexTypeUint8 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR: { - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR* s = static_cast(static_cast(p)); - s->vertexAttributeInstanceRateDivisor = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { - VkPhysicalDeviceSamplerYcbcrConversionFeatures* s = static_cast(static_cast(p)); - s->samplerYcbcrConversion = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: { - VkPhysicalDeviceShaderFloat16Int8Features* s = static_cast(static_cast(p)); - s->shaderFloat16 = VK_TRUE; - s->shaderInt8 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: { - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* s = static_cast(static_cast(p)); - s->shaderSubgroupExtendedTypes = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: { - VkPhysicalDevice8BitStorageFeatures* s = static_cast(static_cast(p)); - s->storageBuffer8BitAccess = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: { - VkPhysicalDevice16BitStorageFeatures* s = static_cast(static_cast(p)); - s->storageBuffer16BitAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.drawIndirectFirstInstance == VK_TRUE); - ret = ret && (s->features.samplerAnisotropy == VK_TRUE); - ret = ret && (s->features.shaderImageGatherExtended == VK_TRUE); - ret = ret && (s->features.shaderStorageImageExtendedFormats == VK_TRUE); - ret = ret && (s->features.shaderStorageImageReadWithoutFormat == VK_TRUE); - ret = ret && (s->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->shaderFloat16 == VK_TRUE); - ret = ret && (s->shaderInt8 == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { - VkPhysicalDeviceCustomBorderColorFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->customBorderColors == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: { - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->primitiveTopologyListRestart == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: { - VkPhysicalDeviceProvokingVertexFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->provokingVertexLast == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { - VkPhysicalDeviceIndexTypeUint8FeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->indexTypeUint8 == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR: { - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR* s = static_cast(static_cast(p)); - ret = ret && (s->vertexAttributeInstanceRateDivisor == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { - VkPhysicalDeviceSamplerYcbcrConversionFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->samplerYcbcrConversion == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: { - VkPhysicalDeviceShaderFloat16Int8Features* s = static_cast(static_cast(p)); - ret = ret && (s->shaderFloat16 == VK_TRUE); - ret = ret && (s->shaderInt8 == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: { - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: { - VkPhysicalDevice8BitStorageFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->storageBuffer8BitAccess == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: { - VkPhysicalDevice16BitStorageFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->storageBuffer16BitAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageReadWithoutFormat = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->shaderFloat16 = VK_TRUE; + s->shaderInt8 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: + { + VkPhysicalDeviceCustomBorderColorFeaturesEXT *s = static_cast(static_cast(p)); + s->customBorderColors = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + { + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *s = static_cast(static_cast(p)); + s->primitiveTopologyListRestart = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: + { + VkPhysicalDeviceProvokingVertexFeaturesEXT *s = static_cast(static_cast(p)); + s->provokingVertexLast = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: + { + VkPhysicalDeviceIndexTypeUint8FeaturesEXT *s = static_cast(static_cast(p)); + s->indexTypeUint8 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + { + VkPhysicalDeviceSamplerYcbcrConversionFeatures *s = static_cast(static_cast(p)); + s->samplerYcbcrConversion = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: + { + VkPhysicalDeviceShaderFloat16Int8Features *s = static_cast(static_cast(p)); + s->shaderFloat16 = VK_TRUE; + s->shaderInt8 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: + { + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *s = static_cast(static_cast(p)); + s->shaderSubgroupExtendedTypes = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: + { + VkPhysicalDevice8BitStorageFeatures *s = static_cast(static_cast(p)); + s->storageBuffer8BitAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: + { + VkPhysicalDevice16BitStorageFeatures *s = static_cast(static_cast(p)); + s->storageBuffer16BitAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageReadWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageReadWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageReadWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderFloat16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderFloat16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderFloat16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: + { + VkPhysicalDeviceCustomBorderColorFeaturesEXT *prettify_VkPhysicalDeviceCustomBorderColorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceCustomBorderColorFeaturesEXT->customBorderColors == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceCustomBorderColorFeaturesEXT->customBorderColors == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceCustomBorderColorFeaturesEXT::customBorderColors == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + { + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *prettify_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT->primitiveTopologyListRestart == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT->primitiveTopologyListRestart == VK_TRUE), "Unsupported feature condition: VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::primitiveTopologyListRestart == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: + { + VkPhysicalDeviceProvokingVertexFeaturesEXT *prettify_VkPhysicalDeviceProvokingVertexFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProvokingVertexFeaturesEXT->provokingVertexLast == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProvokingVertexFeaturesEXT->provokingVertexLast == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceProvokingVertexFeaturesEXT::provokingVertexLast == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: + { + VkPhysicalDeviceIndexTypeUint8FeaturesEXT *prettify_VkPhysicalDeviceIndexTypeUint8FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceIndexTypeUint8FeaturesEXT->indexTypeUint8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceIndexTypeUint8FeaturesEXT->indexTypeUint8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceIndexTypeUint8FeaturesEXT::indexTypeUint8 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR::vertexAttributeInstanceRateDivisor == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + { + VkPhysicalDeviceSamplerYcbcrConversionFeatures *prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures->samplerYcbcrConversion == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures->samplerYcbcrConversion == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceSamplerYcbcrConversionFeatures::samplerYcbcrConversion == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: + { + VkPhysicalDeviceShaderFloat16Int8Features *prettify_VkPhysicalDeviceShaderFloat16Int8Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderFloat16Int8Features->shaderFloat16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderFloat16Int8Features->shaderFloat16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderFloat16Int8Features::shaderFloat16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceShaderFloat16Int8Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderFloat16Int8Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderFloat16Int8Features::shaderInt8 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: + { + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *prettify_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::shaderSubgroupExtendedTypes == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: + { + VkPhysicalDevice8BitStorageFeatures *prettify_VkPhysicalDevice8BitStorageFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice8BitStorageFeatures->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice8BitStorageFeatures->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice8BitStorageFeatures::storageBuffer8BitAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: + { + VkPhysicalDevice16BitStorageFeatures *prettify_VkPhysicalDevice16BitStorageFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice16BitStorageFeatures->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice16BitStorageFeatures->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.maxColorAttachments = 8; - s->properties.limits.maxPerStageDescriptorSampledImages = 128; - s->properties.limits.maxPerStageDescriptorSamplers = 128; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 12; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 13; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.maxColorAttachments >= 8); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 128); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 128); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 13); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.maxColorAttachments = 8; + s->properties.limits.maxPerStageDescriptorSampledImages = 128; + s->properties.limits.maxPerStageDescriptorSamplers = 128; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 12; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 13; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 13); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 13), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 13"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)"); + } + break; + default: + break; + } + return ret; + }}; static const VpFormatDesc formatDesc[] = { - { - VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, + {VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, }; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features }; - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT }; - VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT }; - VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT }; - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR }; - VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features }; - VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures }; - VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures }; - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures }; - VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT }; - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); - }, -}; -} //namespace MUST -namespace primitivesGeneratedQuery { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features}; + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT}; + VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT}; + VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR}; + VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features}; + VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures}; + VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures}; + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures}; + VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT}; + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); + }, +}; +} // namespace MUST +namespace primitivesGeneratedQuery +{ + static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: { - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* s = static_cast(static_cast(p)); - s->primitivesGeneratedQuery = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: { - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->primitivesGeneratedQuery == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + { + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *s = static_cast(static_cast(p)); + s->primitivesGeneratedQuery = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + { + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *prettify_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT->primitivesGeneratedQuery == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT->primitivesGeneratedQuery == VK_TRUE), "Unsupported feature condition: VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQuery == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features }; - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT }; - VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT }; - VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT }; - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR }; - VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features }; - VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures }; - VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures }; - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures }; - VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT }; - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); - }, -}; -} //namespace primitivesGeneratedQuery -namespace pipelineStatisticsQuery { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.pipelineStatisticsQuery = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.pipelineStatisticsQuery == VK_TRUE); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features}; + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT}; + VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT}; + VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR}; + VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features}; + VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures}; + VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures}; + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures}; + VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT}; + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); + }, }; +} // namespace primitivesGeneratedQuery +namespace pipelineStatisticsQuery +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.pipelineStatisticsQuery = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.pipelineStatisticsQuery == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.pipelineStatisticsQuery == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.pipelineStatisticsQuery == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features }; - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT }; - VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT }; - VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT }; - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR }; - VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features }; - VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures }; - VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures }; - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures }; - VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT }; - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); - }, -}; -} //namespace pipelineStatisticsQuery -namespace swBresenhamLines { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features}; + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT}; + VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT}; + VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR}; + VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features}; + VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures}; + VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures}; + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures}; + VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT}; + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); + }, +}; +} // namespace pipelineStatisticsQuery +namespace swBresenhamLines +{ + static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: { - VkPhysicalDeviceLineRasterizationFeaturesEXT* s = static_cast(static_cast(p)); - s->bresenhamLines = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: { - VkPhysicalDeviceLineRasterizationFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->bresenhamLines == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: + { + VkPhysicalDeviceLineRasterizationFeaturesEXT *s = static_cast(static_cast(p)); + s->bresenhamLines = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: + { + VkPhysicalDeviceLineRasterizationFeaturesEXT *prettify_VkPhysicalDeviceLineRasterizationFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceLineRasterizationFeaturesEXT->bresenhamLines == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceLineRasterizationFeaturesEXT->bresenhamLines == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceLineRasterizationFeaturesEXT::bresenhamLines == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features }; - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT }; - VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT }; - VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT }; - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR }; - VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features }; - VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures }; - VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures }; - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures }; - VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT }; - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); - }, -}; -} //namespace swBresenhamLines -namespace hwBresenhamLines { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features}; + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT}; + VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT}; + VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR}; + VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features}; + VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures}; + VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures}; + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures}; + VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT}; + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); + }, +}; +} // namespace swBresenhamLines +namespace hwBresenhamLines +{ + static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG: { - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG* s = static_cast(static_cast(p)); - s->relaxedLineRasterization = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG: { - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG* s = static_cast(static_cast(p)); - ret = ret && (s->relaxedLineRasterization == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG: + { + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *s = static_cast(static_cast(p)); + s->relaxedLineRasterization = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG: + { + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *prettify_VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG->relaxedLineRasterization == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG->relaxedLineRasterization == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG::relaxedLineRasterization == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features }; - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT }; - VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT }; - VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT }; - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR }; - VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features }; - VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures }; - VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures }; - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures }; - VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT }; - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); - }, -}; -} //namespace hwBresenhamLines -} // namespace VP_ANDROID_15_MINIMUMS -#endif // VP_ANDROID_15_minimums + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, &physicalDeviceVulkan12Features}; + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, &physicalDeviceCustomBorderColorFeaturesEXT}; + VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, &physicalDevicePrimitiveTopologyListRestartFeaturesEXT}; + VkPhysicalDeviceIndexTypeUint8FeaturesEXT physicalDeviceIndexTypeUint8FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, &physicalDeviceProvokingVertexFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, &physicalDeviceIndexTypeUint8FeaturesEXT}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesKHR}; + VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, &physicalDeviceShaderFloat16Int8Features}; + VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, &physicalDeviceShaderSubgroupExtendedTypesFeatures}; + VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, &physicalDevice8BitStorageFeatures}; + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, &physicalDevice16BitStorageFeatures}; + VkPhysicalDeviceLineRasterizationFeaturesEXT physicalDeviceLineRasterizationFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, &physicalDevicePrimitivesGeneratedQueryFeaturesEXT}; + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, &physicalDeviceLineRasterizationFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceRelaxedLineRasterizationFeaturesIMG)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); + }, +}; +} // namespace hwBresenhamLines +} // namespace blocks +} // namespace VP_ANDROID_15_MINIMUMS +#endif // VP_ANDROID_15_minimums #ifdef VP_ANDROID_16_minimums -namespace VP_ANDROID_16_MINIMUMS { +namespace VP_ANDROID_16_MINIMUMS +{ static const VkStructureType featureStructTypes[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, @@ -1288,336 +2003,419 @@ static const VkStructureType propertyStructTypes[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, }; -namespace MUST { +namespace blocks +{ +namespace MUST +{ + static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_6_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAP_MEMORY_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_6_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAP_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthClamp = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.shaderInt16 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->descriptorBindingPartiallyBound = VK_TRUE; - s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; - s->descriptorBindingVariableDescriptorCount = VK_TRUE; - s->descriptorIndexing = VK_TRUE; - s->runtimeDescriptorArray = VK_TRUE; - s->samplerMirrorClampToEdge = VK_TRUE; - s->scalarBlockLayout = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: { - VkPhysicalDeviceProtectedMemoryFeatures* s = static_cast(static_cast(p)); - s->protectedMemory = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES: { - VkPhysicalDeviceShaderIntegerDotProductFeatures* s = static_cast(static_cast(p)); - s->shaderIntegerDotProduct = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: { - VkPhysicalDeviceTransformFeedbackFeaturesEXT* s = static_cast(static_cast(p)); - s->transformFeedback = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: { - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* s = static_cast(static_cast(p)); - s->image2DViewOf3D = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: { - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* s = static_cast(static_cast(p)); - s->shaderSubgroupUniformControlFlow = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthClamp == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.shaderInt16 == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->descriptorBindingPartiallyBound == VK_TRUE); - ret = ret && (s->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); - ret = ret && (s->descriptorBindingVariableDescriptorCount == VK_TRUE); - ret = ret && (s->descriptorIndexing == VK_TRUE); - ret = ret && (s->runtimeDescriptorArray == VK_TRUE); - ret = ret && (s->samplerMirrorClampToEdge == VK_TRUE); - ret = ret && (s->scalarBlockLayout == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: { - VkPhysicalDeviceProtectedMemoryFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->protectedMemory == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES: { - VkPhysicalDeviceShaderIntegerDotProductFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->shaderIntegerDotProduct == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: { - VkPhysicalDeviceTransformFeedbackFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->transformFeedback == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: { - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* s = static_cast(static_cast(p)); - ret = ret && (s->image2DViewOf3D == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: { - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* s = static_cast(static_cast(p)); - ret = ret && (s->shaderSubgroupUniformControlFlow == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->samplerMirrorClampToEdge = VK_TRUE; + s->scalarBlockLayout = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: + { + VkPhysicalDeviceProtectedMemoryFeatures *s = static_cast(static_cast(p)); + s->protectedMemory = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES: + { + VkPhysicalDeviceShaderIntegerDotProductFeatures *s = static_cast(static_cast(p)); + s->shaderIntegerDotProduct = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: + { + VkPhysicalDeviceTransformFeedbackFeaturesEXT *s = static_cast(static_cast(p)); + s->transformFeedback = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: + { + VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *s = static_cast(static_cast(p)); + s->image2DViewOf3D = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: + { + VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *s = static_cast(static_cast(p)); + s->shaderSubgroupUniformControlFlow = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::scalarBlockLayout == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: + { + VkPhysicalDeviceProtectedMemoryFeatures *prettify_VkPhysicalDeviceProtectedMemoryFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProtectedMemoryFeatures->protectedMemory == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProtectedMemoryFeatures->protectedMemory == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceProtectedMemoryFeatures::protectedMemory == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES: + { + VkPhysicalDeviceShaderIntegerDotProductFeatures *prettify_VkPhysicalDeviceShaderIntegerDotProductFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderIntegerDotProductFeatures->shaderIntegerDotProduct == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderIntegerDotProductFeatures->shaderIntegerDotProduct == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderIntegerDotProductFeatures::shaderIntegerDotProduct == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: + { + VkPhysicalDeviceTransformFeedbackFeaturesEXT *prettify_VkPhysicalDeviceTransformFeedbackFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTransformFeedbackFeaturesEXT->transformFeedback == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTransformFeedbackFeaturesEXT->transformFeedback == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: + { + VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *prettify_VkPhysicalDeviceImage2DViewOf3DFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceImage2DViewOf3DFeaturesEXT->image2DViewOf3D == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceImage2DViewOf3DFeaturesEXT->image2DViewOf3D == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::image2DViewOf3D == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: + { + VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *prettify_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR->shaderSubgroupUniformControlFlow == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR->shaderSubgroupUniformControlFlow == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::shaderSubgroupUniformControlFlow == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.bufferImageGranularity = 4096; - s->properties.limits.lineWidthGranularity = 0.5f; - s->properties.limits.maxBoundDescriptorSets = 7; - s->properties.limits.maxColorAttachments = 8; - s->properties.limits.maxComputeWorkGroupInvocations = 256; - s->properties.limits.maxComputeWorkGroupSize[0] = 256; - s->properties.limits.maxComputeWorkGroupSize[1] = 256; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxDescriptorSetStorageBuffers = 96; - s->properties.limits.maxDescriptorSetStorageImages = 144; - s->properties.limits.maxDescriptorSetUniformBuffers = 90; - s->properties.limits.maxFragmentCombinedOutputResources = 16; - s->properties.limits.maxImageArrayLayers = 2048; - s->properties.limits.maxImageDimension1D = 8192; - s->properties.limits.maxImageDimension2D = 8192; - s->properties.limits.maxImageDimensionCube = 8192; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; - s->properties.limits.maxPerStageResources = 200; - s->properties.limits.maxPushConstantsSize = 256; - s->properties.limits.maxSamplerLodBias = 14; - s->properties.limits.maxUniformBufferRange = 65536; - s->properties.limits.maxVertexOutputComponents = 128; - s->properties.limits.mipmapPrecisionBits = 6; - s->properties.limits.pointSizeGranularity = 0.125f; - s->properties.limits.standardSampleLocations = VK_TRUE; - s->properties.limits.subTexelPrecisionBits = 8; - s->properties.limits.timestampComputeAndGraphics = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: { - VkPhysicalDeviceFloatControlsProperties* s = static_cast(static_cast(p)); - s->shaderSignedZeroInfNanPreserveFloat16 = VK_TRUE; - s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - s->subgroupSupportedStages |= (VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.bufferImageGranularity <= 4096); - ret = ret && ((4096 % s->properties.limits.bufferImageGranularity) == 0); - ret = ret && (s->properties.limits.lineWidthGranularity <= 0.5); - ret = ret && (isMultiple(0.5, s->properties.limits.lineWidthGranularity)); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 7); - ret = ret && (s->properties.limits.maxColorAttachments >= 8); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 256); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 256); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 256); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 144); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 90); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 16); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 2048); - ret = ret && (s->properties.limits.maxImageDimension1D >= 8192); - ret = ret && (s->properties.limits.maxImageDimension2D >= 8192); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 8192); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); - ret = ret && (s->properties.limits.maxPerStageResources >= 200); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 256); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 14); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 65536); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 128); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 6); - ret = ret && (s->properties.limits.pointSizeGranularity <= 0.125); - ret = ret && (isMultiple(0.125, s->properties.limits.pointSizeGranularity)); - ret = ret && (s->properties.limits.standardSampleLocations == VK_TRUE); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 8); - ret = ret && (vpCheckFlags(s->properties.limits.timestampComputeAndGraphics, VK_TRUE)); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: { - VkPhysicalDeviceFloatControlsProperties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat16, VK_TRUE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat32, VK_TRUE)); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->subgroupSupportedStages, (VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT))); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 4096; + s->properties.limits.lineWidthGranularity = 0.5f; + s->properties.limits.maxColorAttachments = 8; + s->properties.limits.maxComputeWorkGroupInvocations = 256; + s->properties.limits.maxComputeWorkGroupSize[0] = 256; + s->properties.limits.maxComputeWorkGroupSize[1] = 256; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxDescriptorSetStorageBuffers = 96; + s->properties.limits.maxDescriptorSetUniformBuffers = 90; + s->properties.limits.maxFragmentCombinedOutputResources = 16; + s->properties.limits.maxImageArrayLayers = 2048; + s->properties.limits.maxImageDimension1D = 8192; + s->properties.limits.maxImageDimension2D = 8192; + s->properties.limits.maxImageDimensionCube = 8192; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; + s->properties.limits.maxPerStageResources = 200; + s->properties.limits.maxSamplerLodBias = 14; + s->properties.limits.maxUniformBufferRange = 65536; + s->properties.limits.maxVertexOutputComponents = 72; + s->properties.limits.mipmapPrecisionBits = 6; + s->properties.limits.pointSizeGranularity = 0.125f; + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.subTexelPrecisionBits = 8; + s->properties.limits.timestampComputeAndGraphics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: + { + VkPhysicalDeviceFloatControlsProperties *s = static_cast(static_cast(p)); + s->shaderSignedZeroInfNanPreserveFloat16 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 4096"); + ret = ret && ((4096 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((4096 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (4096 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 0.5); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 0.5), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 0.5"); + ret = ret && (isMultiple(0.5, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(0.5, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(0.5, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 90"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 200); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 200), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 200"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 14); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 14), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 14"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 72); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 72), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 72"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 6), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 6"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 0.125); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 0.125), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 0.125"); + ret = ret && (isMultiple(0.125, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(0.125, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(0.125, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.timestampComputeAndGraphics >= VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: + { + VkPhysicalDeviceFloatControlsProperties *prettify_VkPhysicalDeviceFloatControlsProperties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsProperties->shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsProperties->shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsProperties::shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsProperties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsProperties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsProperties::shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedStages contains (VK_SHADER_STAGE_COMPUTE_BIT)"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, &physicalDeviceVulkan12Features }; - VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, &physicalDeviceProtectedMemoryFeatures }; - VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, &physicalDeviceShaderIntegerDotProductFeatures }; - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, &physicalDeviceTransformFeedbackFeaturesEXT }; - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, &physicalDeviceImage2DViewOf3DFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceFloatControlsProperties physicalDeviceFloatControlsProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceFloatControlsProperties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, -}; -} //namespace MUST -namespace multisampledToSingleSampled { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, &physicalDeviceVulkan12Features}; + VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, &physicalDeviceProtectedMemoryFeatures}; + VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, &physicalDeviceShaderIntegerDotProductFeatures}; + VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, &physicalDeviceTransformFeedbackFeaturesEXT}; + VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, &physicalDeviceImage2DViewOf3DFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceFloatControlsProperties physicalDeviceFloatControlsProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceFloatControlsProperties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); + }, +}; +} // namespace MUST +namespace multisampledToSingleSampled +{ + static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, &physicalDeviceVulkan12Features }; - VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, &physicalDeviceProtectedMemoryFeatures }; - VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, &physicalDeviceShaderIntegerDotProductFeatures }; - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, &physicalDeviceTransformFeedbackFeaturesEXT }; - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, &physicalDeviceImage2DViewOf3DFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceFloatControlsProperties physicalDeviceFloatControlsProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceFloatControlsProperties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, -}; -} //namespace multisampledToSingleSampled -namespace shaderStencilExport { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, &physicalDeviceVulkan12Features}; + VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, &physicalDeviceProtectedMemoryFeatures}; + VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, &physicalDeviceShaderIntegerDotProductFeatures}; + VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, &physicalDeviceTransformFeedbackFeaturesEXT}; + VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, &physicalDeviceImage2DViewOf3DFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceFloatControlsProperties physicalDeviceFloatControlsProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceFloatControlsProperties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); + }, +}; +} // namespace multisampledToSingleSampled +namespace shaderStencilExport +{ + static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, &physicalDeviceVulkan12Features }; - VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, &physicalDeviceProtectedMemoryFeatures }; - VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, &physicalDeviceShaderIntegerDotProductFeatures }; - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, &physicalDeviceTransformFeedbackFeaturesEXT }; - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, &physicalDeviceImage2DViewOf3DFeaturesEXT }; - p->pNext = static_cast(static_cast(&physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceFloatControlsProperties physicalDeviceFloatControlsProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceFloatControlsProperties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, &physicalDeviceVulkan12Features}; + VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, &physicalDeviceProtectedMemoryFeatures}; + VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, &physicalDeviceShaderIntegerDotProductFeatures}; + VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, &physicalDeviceTransformFeedbackFeaturesEXT}; + VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, &physicalDeviceImage2DViewOf3DFeaturesEXT}; + p->pNext = static_cast(static_cast(&physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceFloatControlsProperties physicalDeviceFloatControlsProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceFloatControlsProperties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan11Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace shaderStencilExport -} // namespace VP_ANDROID_16_MINIMUMS -#endif // VP_ANDROID_16_minimums +} // namespace shaderStencilExport +} // namespace blocks +} // namespace VP_ANDROID_16_MINIMUMS +#endif // VP_ANDROID_16_minimums #ifdef VP_ANDROID_baseline_2021 -namespace VP_ANDROID_BASELINE_2021 { +namespace VP_ANDROID_BASELINE_2021 +{ static const VkStructureType featureStructTypes[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, @@ -1633,2685 +2431,9726 @@ static const VkStructureType formatStructTypes[] = { }; static const VkExtensionProperties instanceExtensions[] = { - VkExtensionProperties{ VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SURFACE_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SURFACE_EXTENSION_NAME, 1}, }; static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.robustBufferAccess = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - s->features.textureCompressionASTC_LDR = VK_TRUE; - s->features.textureCompressionETC2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.textureCompressionASTC_LDR == VK_TRUE); - ret = ret && (s->features.textureCompressionETC2 == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.textureCompressionASTC_LDR = VK_TRUE; + s->features.textureCompressionETC2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionASTC_LDR == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionETC2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, }; -namespace baseline { +namespace blocks +{ +namespace baseline +{ + static const VkExtensionProperties instanceExtensions[] = { - VkExtensionProperties{ VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SURFACE_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SURFACE_EXTENSION_NAME, 1}, }; static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.robustBufferAccess = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - s->features.textureCompressionASTC_LDR = VK_TRUE; - s->features.textureCompressionETC2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.textureCompressionASTC_LDR == VK_TRUE); - ret = ret && (s->features.textureCompressionETC2 == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.textureCompressionASTC_LDR = VK_TRUE; + s->features.textureCompressionETC2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionASTC_LDR == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionETC2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.discreteQueuePriorities = 2; - s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.maxBoundDescriptorSets = 4; - s->properties.limits.maxColorAttachments = 4; - s->properties.limits.maxComputeSharedMemorySize = 16384; - s->properties.limits.maxComputeWorkGroupCount[0] = 65535; - s->properties.limits.maxComputeWorkGroupCount[1] = 65535; - s->properties.limits.maxComputeWorkGroupCount[2] = 65535; - s->properties.limits.maxComputeWorkGroupInvocations = 128; - s->properties.limits.maxComputeWorkGroupSize[0] = 128; - s->properties.limits.maxComputeWorkGroupSize[1] = 128; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxDescriptorSetInputAttachments = 4; - s->properties.limits.maxDescriptorSetSampledImages = 48; - s->properties.limits.maxDescriptorSetSamplers = 48; - s->properties.limits.maxDescriptorSetStorageBuffers = 24; - s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; - s->properties.limits.maxDescriptorSetStorageImages = 12; - s->properties.limits.maxDescriptorSetUniformBuffers = 36; - s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; - s->properties.limits.maxDrawIndexedIndexValue = 4294967295; - s->properties.limits.maxDrawIndirectCount = 1; - s->properties.limits.maxFragmentCombinedOutputResources = 8; - s->properties.limits.maxFragmentInputComponents = 64; - s->properties.limits.maxFragmentOutputAttachments = 4; - s->properties.limits.maxFramebufferHeight = 4096; - s->properties.limits.maxFramebufferLayers = 256; - s->properties.limits.maxFramebufferWidth = 4096; - s->properties.limits.maxImageArrayLayers = 256; - s->properties.limits.maxImageDimension1D = 4096; - s->properties.limits.maxImageDimension2D = 4096; - s->properties.limits.maxImageDimension3D = 512; - s->properties.limits.maxImageDimensionCube = 4096; - s->properties.limits.maxInterpolationOffset = 0.4375f; - s->properties.limits.maxMemoryAllocationCount = 4096; - s->properties.limits.maxPerStageDescriptorInputAttachments = 4; - s->properties.limits.maxPerStageDescriptorSampledImages = 16; - s->properties.limits.maxPerStageDescriptorSamplers = 16; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; - s->properties.limits.maxPerStageDescriptorStorageImages = 4; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; - s->properties.limits.maxPerStageResources = 44; - s->properties.limits.maxPushConstantsSize = 128; - s->properties.limits.maxSampleMaskWords = 1; - s->properties.limits.maxSamplerAllocationCount = 4000; - s->properties.limits.maxSamplerAnisotropy = 1.0f; - s->properties.limits.maxSamplerLodBias = 2.0f; - s->properties.limits.maxStorageBufferRange = 134217728; - s->properties.limits.maxTexelBufferElements = 65536; - s->properties.limits.maxTexelOffset = 7; - s->properties.limits.maxUniformBufferRange = 16384; - s->properties.limits.maxVertexInputAttributeOffset = 2047; - s->properties.limits.maxVertexInputAttributes = 16; - s->properties.limits.maxVertexInputBindingStride = 2048; - s->properties.limits.maxVertexInputBindings = 16; - s->properties.limits.maxVertexOutputComponents = 64; - s->properties.limits.maxViewportDimensions[0] = 4096; - s->properties.limits.maxViewportDimensions[1] = 4096; - s->properties.limits.maxViewports = 1; - s->properties.limits.minInterpolationOffset = -0.5f; - s->properties.limits.minStorageBufferOffsetAlignment = 256; - s->properties.limits.minTexelBufferOffsetAlignment = 256; - s->properties.limits.minTexelOffset = -8; - s->properties.limits.minUniformBufferOffsetAlignment = 256; - s->properties.limits.mipmapPrecisionBits = 4; - s->properties.limits.pointSizeGranularity = 1; - s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.standardSampleLocations = VK_TRUE; - s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.subPixelInterpolationOffsetBits = 4; - s->properties.limits.subPixelPrecisionBits = 4; - s->properties.limits.subTexelPrecisionBits = 4; - s->properties.limits.viewportBoundsRange[0] = -8192; - s->properties.limits.viewportBoundsRange[1] = 8191; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.discreteQueuePriorities >= 2); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 4); - ret = ret && (s->properties.limits.maxColorAttachments >= 4); - ret = ret && (s->properties.limits.maxComputeSharedMemorySize >= 16384); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[0] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[1] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[2] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxDescriptorSetInputAttachments >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 48); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 48); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 12); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 36); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); - ret = ret && (s->properties.limits.maxDrawIndexedIndexValue >= 4294967295); - ret = ret && (s->properties.limits.maxDrawIndirectCount >= 1); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 8); - ret = ret && (s->properties.limits.maxFragmentInputComponents >= 64); - ret = ret && (s->properties.limits.maxFragmentOutputAttachments >= 4); - ret = ret && (s->properties.limits.maxFramebufferHeight >= 4096); - ret = ret && (s->properties.limits.maxFramebufferLayers >= 256); - ret = ret && (s->properties.limits.maxFramebufferWidth >= 4096); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 256); - ret = ret && (s->properties.limits.maxImageDimension1D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension2D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension3D >= 512); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 4096); - ret = ret && (s->properties.limits.maxInterpolationOffset >= 0.4375); - ret = ret && (s->properties.limits.maxMemoryAllocationCount >= 4096); - ret = ret && (s->properties.limits.maxPerStageDescriptorInputAttachments >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageResources >= 44); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 128); - ret = ret && (s->properties.limits.maxSampleMaskWords >= 1); - ret = ret && (s->properties.limits.maxSamplerAllocationCount >= 4000); - ret = ret && (s->properties.limits.maxSamplerAnisotropy >= 1.0); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 2.0); - ret = ret && (s->properties.limits.maxStorageBufferRange >= 134217728); - ret = ret && (s->properties.limits.maxTexelBufferElements >= 65536); - ret = ret && (s->properties.limits.maxTexelOffset >= 7); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 16384); - ret = ret && (s->properties.limits.maxVertexInputAttributeOffset >= 2047); - ret = ret && (s->properties.limits.maxVertexInputAttributes >= 16); - ret = ret && (s->properties.limits.maxVertexInputBindingStride >= 2048); - ret = ret && (s->properties.limits.maxVertexInputBindings >= 16); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 64); - ret = ret && (s->properties.limits.maxViewportDimensions[0] >= 4096); - ret = ret && (s->properties.limits.maxViewportDimensions[1] >= 4096); - ret = ret && (s->properties.limits.maxViewports >= 1); - ret = ret && (s->properties.limits.minInterpolationOffset <= -0.5); - ret = ret && (s->properties.limits.minStorageBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minStorageBufferOffsetAlignment & (s->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minTexelBufferOffsetAlignment & (s->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelOffset <= -8); - ret = ret && (s->properties.limits.minUniformBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minUniformBufferOffsetAlignment & (s->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 4); - ret = ret && (s->properties.limits.pointSizeGranularity <= 1); - ret = ret && (isMultiple(1, s->properties.limits.pointSizeGranularity)); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.standardSampleLocations == VK_TRUE); - ret = ret && (vpCheckFlags(s->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (s->properties.limits.subPixelInterpolationOffsetBits >= 4); - ret = ret && (s->properties.limits.subPixelPrecisionBits >= 4); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 4); - ret = ret && (s->properties.limits.viewportBoundsRange[0] <= -8192); - ret = ret && (s->properties.limits.viewportBoundsRange[1] >= 8191); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.maxBoundDescriptorSets = 4; + s->properties.limits.maxColorAttachments = 4; + s->properties.limits.maxComputeSharedMemorySize = 16384; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 128; + s->properties.limits.maxComputeWorkGroupSize[0] = 128; + s->properties.limits.maxComputeWorkGroupSize[1] = 128; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxDescriptorSetInputAttachments = 4; + s->properties.limits.maxDescriptorSetSampledImages = 48; + s->properties.limits.maxDescriptorSetSamplers = 48; + s->properties.limits.maxDescriptorSetStorageBuffers = 24; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; + s->properties.limits.maxDescriptorSetStorageImages = 12; + s->properties.limits.maxDescriptorSetUniformBuffers = 36; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 4294967295; + s->properties.limits.maxDrawIndirectCount = 1; + s->properties.limits.maxFragmentCombinedOutputResources = 8; + s->properties.limits.maxFragmentInputComponents = 64; + s->properties.limits.maxFragmentOutputAttachments = 4; + s->properties.limits.maxFramebufferHeight = 4096; + s->properties.limits.maxFramebufferLayers = 256; + s->properties.limits.maxFramebufferWidth = 4096; + s->properties.limits.maxImageArrayLayers = 256; + s->properties.limits.maxImageDimension1D = 4096; + s->properties.limits.maxImageDimension2D = 4096; + s->properties.limits.maxImageDimension3D = 512; + s->properties.limits.maxImageDimensionCube = 4096; + s->properties.limits.maxInterpolationOffset = 0.4375f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 4; + s->properties.limits.maxPerStageDescriptorSampledImages = 16; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; + s->properties.limits.maxPerStageDescriptorStorageImages = 4; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; + s->properties.limits.maxPerStageResources = 44; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 1.0f; + s->properties.limits.maxSamplerLodBias = 2.0f; + s->properties.limits.maxStorageBufferRange = 134217728; + s->properties.limits.maxTexelBufferElements = 65536; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 16384; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 16; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 16; + s->properties.limits.maxVertexOutputComponents = 64; + s->properties.limits.maxViewportDimensions[0] = 4096; + s->properties.limits.maxViewportDimensions[1] = 4096; + s->properties.limits.maxViewports = 1; + s->properties.limits.minInterpolationOffset = -0.5f; + s->properties.limits.minStorageBufferOffsetAlignment = 256; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.pointSizeGranularity = 1; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 4; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.viewportBoundsRange[0] = -8192; + s->properties.limits.viewportBoundsRange[1] = 8191; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 48); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 48), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 48"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 48); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 48), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 48"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 36); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 36), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 36"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 4294967295"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 512); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 512), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 512"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.4375"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 44); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 44), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 44"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 2.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 134217728"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= -0.5"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1"); + ret = ret && (isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8191); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8191), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 8191"); + } + break; + default: + break; + } + return ret; + }}; static const VpFormatDesc formatDesc[] = { - { - VK_FORMAT_A1R5G5B5_UNORM_PACK16, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A2B10G10R10_UINT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A2B10G10R10_UNORM_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_SINT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_SNORM_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_SRGB_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_UINT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_UNORM_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x10_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x10_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + {VK_FORMAT_A1R5G5B5_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A1R5G5B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A1R5G5B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SRGB_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x10_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x10_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x6_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x6_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x10_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x10_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x12_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x12_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_4x4_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_4x4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x4_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x6_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x6_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x6_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x6_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B10G11R11_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B4G4R4A4_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B4G4R4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B4G4R4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11G11_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11G11_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R5G6B5_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R5G6B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R5G6B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, +}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - { - VK_FORMAT_ASTC_10x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - { - VK_FORMAT_ASTC_10x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - { - VK_FORMAT_ASTC_10x6_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, - { - VK_FORMAT_ASTC_10x6_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace baseline +} // namespace blocks +} // namespace VP_ANDROID_BASELINE_2021 +#endif // VP_ANDROID_baseline_2021 + +#ifdef VP_ANDROID_baseline_2022 +namespace VP_ANDROID_BASELINE_2022 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, +}; + +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, +}; + +static const VkStructureType formatStructTypes[] = { + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, +}; + +static const VkExtensionProperties instanceExtensions[] = { + VkExtensionProperties{VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SURFACE_EXTENSION_NAME, 1}, +}; + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.textureCompressionASTC_LDR = VK_TRUE; + s->features.textureCompressionETC2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + { + VkPhysicalDeviceSamplerYcbcrConversionFeatures *s = static_cast(static_cast(p)); + s->samplerYcbcrConversion = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: + { + VkPhysicalDeviceShaderDrawParametersFeatures *s = static_cast(static_cast(p)); + s->shaderDrawParameters = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeatures *s = static_cast(static_cast(p)); + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionASTC_LDR == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionETC2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *prettify_VkPhysicalDeviceMultiviewFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceMultiviewFeatures::multiview == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + { + VkPhysicalDeviceSamplerYcbcrConversionFeatures *prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures->samplerYcbcrConversion == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures->samplerYcbcrConversion == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceSamplerYcbcrConversionFeatures::samplerYcbcrConversion == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: + { + VkPhysicalDeviceShaderDrawParametersFeatures *prettify_VkPhysicalDeviceShaderDrawParametersFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderDrawParametersFeatures->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderDrawParametersFeatures->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderDrawParametersFeatures::shaderDrawParameters == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeatures *prettify_VkPhysicalDeviceVariablePointersFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeatures::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeatures::variablePointersStorageBuffer == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_ASTC_10x8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceMultiviewFeatures}; + VkPhysicalDeviceShaderDrawParametersFeatures physicalDeviceShaderDrawParametersFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceVariablePointersFeatures physicalDeviceVariablePointersFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, &physicalDeviceShaderDrawParametersFeatures}; + p->pNext = static_cast(static_cast(&physicalDeviceVariablePointersFeatures)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceMultiviewProperties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, - { - VK_FORMAT_ASTC_10x8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; + +namespace blocks +{ +namespace baseline +{ + +static const VkExtensionProperties instanceExtensions[] = { + VkExtensionProperties{VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SURFACE_EXTENSION_NAME, 1}, +}; + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.textureCompressionASTC_LDR = VK_TRUE; + s->features.textureCompressionETC2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + { + VkPhysicalDeviceSamplerYcbcrConversionFeatures *s = static_cast(static_cast(p)); + s->samplerYcbcrConversion = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: + { + VkPhysicalDeviceShaderDrawParametersFeatures *s = static_cast(static_cast(p)); + s->shaderDrawParameters = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeatures *s = static_cast(static_cast(p)); + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionASTC_LDR == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionASTC_LDR == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionETC2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionETC2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *prettify_VkPhysicalDeviceMultiviewFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceMultiviewFeatures::multiview == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + { + VkPhysicalDeviceSamplerYcbcrConversionFeatures *prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures->samplerYcbcrConversion == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSamplerYcbcrConversionFeatures->samplerYcbcrConversion == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceSamplerYcbcrConversionFeatures::samplerYcbcrConversion == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: + { + VkPhysicalDeviceShaderDrawParametersFeatures *prettify_VkPhysicalDeviceShaderDrawParametersFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderDrawParametersFeatures->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderDrawParametersFeatures->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderDrawParametersFeatures::shaderDrawParameters == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeatures *prettify_VkPhysicalDeviceVariablePointersFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeatures::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeatures->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeatures::variablePointersStorageBuffer == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.maxBoundDescriptorSets = 4; + s->properties.limits.maxColorAttachments = 4; + s->properties.limits.maxComputeSharedMemorySize = 16384; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 128; + s->properties.limits.maxComputeWorkGroupSize[0] = 128; + s->properties.limits.maxComputeWorkGroupSize[1] = 128; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxDescriptorSetInputAttachments = 4; + s->properties.limits.maxDescriptorSetSampledImages = 48; + s->properties.limits.maxDescriptorSetSamplers = 48; + s->properties.limits.maxDescriptorSetStorageBuffers = 24; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; + s->properties.limits.maxDescriptorSetStorageImages = 12; + s->properties.limits.maxDescriptorSetUniformBuffers = 36; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 4294967295; + s->properties.limits.maxDrawIndirectCount = 1; + s->properties.limits.maxFragmentCombinedOutputResources = 8; + s->properties.limits.maxFragmentInputComponents = 64; + s->properties.limits.maxFragmentOutputAttachments = 4; + s->properties.limits.maxFramebufferHeight = 4096; + s->properties.limits.maxFramebufferLayers = 256; + s->properties.limits.maxFramebufferWidth = 4096; + s->properties.limits.maxImageArrayLayers = 256; + s->properties.limits.maxImageDimension1D = 4096; + s->properties.limits.maxImageDimension2D = 4096; + s->properties.limits.maxImageDimension3D = 512; + s->properties.limits.maxImageDimensionCube = 4096; + s->properties.limits.maxInterpolationOffset = 0.4375f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 4; + s->properties.limits.maxPerStageDescriptorSampledImages = 16; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; + s->properties.limits.maxPerStageDescriptorStorageImages = 4; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; + s->properties.limits.maxPerStageResources = 44; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 1.0f; + s->properties.limits.maxSamplerLodBias = 2.0f; + s->properties.limits.maxStorageBufferRange = 134217728; + s->properties.limits.maxTexelBufferElements = 65536; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 16384; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 16; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 16; + s->properties.limits.maxVertexOutputComponents = 64; + s->properties.limits.maxViewportDimensions[0] = 4096; + s->properties.limits.maxViewportDimensions[1] = 4096; + s->properties.limits.maxViewports = 1; + s->properties.limits.minInterpolationOffset = -0.5f; + s->properties.limits.minStorageBufferOffsetAlignment = 256; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.pointSizeGranularity = 1; + s->properties.limits.pointSizeRange[0] = 1.0f; + s->properties.limits.pointSizeRange[1] = 511; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 4; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.viewportBoundsRange[0] = -8192; + s->properties.limits.viewportBoundsRange[1] = 8191; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: + { + VkPhysicalDeviceMultiviewProperties *s = static_cast(static_cast(p)); + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 48); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 48), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 48"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 48); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 48), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 48"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 36); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 36), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 36"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 4294967295"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 512); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 512), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 512"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.4375"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 44); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 44), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 44"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 2.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 134217728"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= -0.5"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1"); + ret = ret && (isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 511); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 511), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 511"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8191); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8191), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 8191"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: + { + VkPhysicalDeviceMultiviewProperties *prettify_VkPhysicalDeviceMultiviewProperties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceMultiviewProperties::maxMultiviewViewCount >= 6"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpFormatDesc formatDesc[] = { + {VK_FORMAT_A1R5G5B5_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A1R5G5B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A1R5G5B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SRGB_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x10_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x10_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x6_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x6_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_10x8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_10x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x10_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x10_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x10_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x12_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_12x12_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_12x12_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_4x4_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_4x4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_4x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x4_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_5x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_5x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x6_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_6x6_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_6x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x5_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x6_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x6_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x6_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ASTC_8x8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ASTC_8x8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B10G11R11_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B4G4R4A4_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B4G4R4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B4G4R4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11G11_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11G11_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11G11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_EAC_R11_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_EAC_R11_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R5G6B5_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R5G6B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R5G6B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, +}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceMultiviewFeatures}; + VkPhysicalDeviceShaderDrawParametersFeatures physicalDeviceShaderDrawParametersFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures}; + VkPhysicalDeviceVariablePointersFeatures physicalDeviceVariablePointersFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, &physicalDeviceShaderDrawParametersFeatures}; + p->pNext = static_cast(static_cast(&physicalDeviceVariablePointersFeatures)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceMultiviewProperties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, - { - VK_FORMAT_ASTC_12x10_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x10_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x12_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x12_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_4x4_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_4x4_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x4_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x4_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x6_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x6_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x6_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x6_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B10G11R11_UFLOAT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B4G4R4A4_UNORM_PACK16, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B8G8R8A8_SRGB, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B8G8R8A8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_D16_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_D32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11G11_SNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11G11_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11_SNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace baseline +} // namespace blocks +} // namespace VP_ANDROID_BASELINE_2022 +#endif // VP_ANDROID_baseline_2022 + +#ifdef VP_KHR_roadmap_2022 +namespace VP_KHR_ROADMAP_2022 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, +}; + +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, +}; + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + s->samplerYcbcrConversion = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->scalarBlockLayout = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + s->vulkanMemoryModel = VK_TRUE; + s->vulkanMemoryModelDeviceScope = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *s = static_cast(static_cast(p)); + s->computeFullSubgroups = VK_TRUE; + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + s->dynamicRendering = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + s->maintenance4 = VK_TRUE; + s->pipelineCreationCacheControl = VK_TRUE; + s->robustImageAccess = VK_TRUE; + s->shaderDemoteToHelperInvocation = VK_TRUE; + s->shaderIntegerDotProduct = VK_TRUE; + s->shaderTerminateInvocation = VK_TRUE; + s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; + s->subgroupSizeControl = VK_TRUE; + s->synchronization2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->samplerYcbcrConversion == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->samplerYcbcrConversion == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::samplerYcbcrConversion == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::scalarBlockLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModel == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *prettify_VkPhysicalDeviceVulkan13Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::computeFullSubgroups == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::dynamicRendering == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::inlineUniformBlock == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::maintenance4 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::robustImageAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::subgroupSizeControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::synchronization2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16B16A16_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; + +namespace blocks +{ +namespace vulkan10requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R16G16B16A16_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16B16A16_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan10requirements +namespace vulkan10requirements_roadmap2022 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 4096; + s->properties.limits.maxColorAttachments = 7; + s->properties.limits.maxComputeWorkGroupInvocations = 256; + s->properties.limits.maxComputeWorkGroupSize[0] = 256; + s->properties.limits.maxComputeWorkGroupSize[1] = 256; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxDescriptorSetSampledImages = 1800; + s->properties.limits.maxDescriptorSetSamplers = 576; + s->properties.limits.maxDescriptorSetStorageBuffers = 96; + s->properties.limits.maxDescriptorSetStorageImages = 144; + s->properties.limits.maxDescriptorSetUniformBuffers = 90; + s->properties.limits.maxFragmentCombinedOutputResources = 16; + s->properties.limits.maxImageArrayLayers = 2048; + s->properties.limits.maxImageDimension1D = 8192; + s->properties.limits.maxImageDimension2D = 8192; + s->properties.limits.maxImageDimensionCube = 8192; + s->properties.limits.maxPerStageDescriptorSampledImages = 200; + s->properties.limits.maxPerStageDescriptorSamplers = 64; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 30; + s->properties.limits.maxPerStageDescriptorStorageImages = 16; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; + s->properties.limits.maxPerStageResources = 200; + s->properties.limits.maxSamplerLodBias = 14; + s->properties.limits.maxUniformBufferRange = 65536; + s->properties.limits.mipmapPrecisionBits = 6; + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.subTexelPrecisionBits = 8; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 4096"); + ret = ret && ((4096 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((4096 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (4096 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 1800); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 1800), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 1800"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 576); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 576), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 576"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 144); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 144), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 144"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 90"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 200); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 200), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 200"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 30); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 30), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 30"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 200); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 200), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 200"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 14); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 14), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 14"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 6), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 6"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 8"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16B16A16_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan10requirements_roadmap2022 +namespace vulkan11requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewViewCount >= 6"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan11requirements +namespace vulkan11requirements_roadmap2022 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->samplerYcbcrConversion = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->samplerYcbcrConversion == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->samplerYcbcrConversion == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::samplerYcbcrConversion == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->subgroupSize = 4; + s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT); + s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSize >= 4"); + ret = ret && ((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedStages contains (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT)"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan11requirements_roadmap2022 +namespace vulkan12requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->maxTimelineSemaphoreValueDifference = 2147483647; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxTimelineSemaphoreValueDifference >= 2147483647"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan12requirements +namespace vulkan12requirements_roadmap2022 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->scalarBlockLayout = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::scalarBlockLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->maxDescriptorSetUpdateAfterBindInputAttachments = 7; + s->maxDescriptorSetUpdateAfterBindSampledImages = 500000; + s->maxDescriptorSetUpdateAfterBindSamplers = 500000; + s->maxDescriptorSetUpdateAfterBindStorageBuffers = 500000; + s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 4; + s->maxDescriptorSetUpdateAfterBindStorageImages = 500000; + s->maxDescriptorSetUpdateAfterBindUniformBuffers = 72; + s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 8; + s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 7; + s->maxPerStageDescriptorUpdateAfterBindSampledImages = 500000; + s->maxPerStageDescriptorUpdateAfterBindSamplers = 500000; + s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 500000; + s->maxPerStageDescriptorUpdateAfterBindStorageImages = 500000; + s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 12; + s->maxPerStageUpdateAfterBindResources = 500000; + s->shaderSignedZeroInfNanPreserveFloat16 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSampledImages >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSamplers >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffers >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageImages >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 72); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 72), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffers >= 72"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSampledImages >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSamplers >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageImages >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 500000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 500000), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageUpdateAfterBindResources >= 500000"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16G16_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan12requirements_roadmap2022 +namespace vulkan13requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->vulkanMemoryModel = VK_TRUE; + s->vulkanMemoryModelDeviceScope = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *s = static_cast(static_cast(p)); + s->computeFullSubgroups = VK_TRUE; + s->dynamicRendering = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + s->maintenance4 = VK_TRUE; + s->pipelineCreationCacheControl = VK_TRUE; + s->robustImageAccess = VK_TRUE; + s->shaderDemoteToHelperInvocation = VK_TRUE; + s->shaderIntegerDotProduct = VK_TRUE; + s->shaderTerminateInvocation = VK_TRUE; + s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; + s->subgroupSizeControl = VK_TRUE; + s->synchronization2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModel == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *prettify_VkPhysicalDeviceVulkan13Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::computeFullSubgroups == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::dynamicRendering == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::inlineUniformBlock == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::maintenance4 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::robustImageAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::subgroupSizeControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::synchronization2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: + { + VkPhysicalDeviceVulkan13Properties *s = static_cast(static_cast(p)); + s->maxBufferSize = 1073741824; + s->maxDescriptorSetInlineUniformBlocks = 4; + s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = 4; + s->maxInlineUniformBlockSize = 256; + s->maxInlineUniformTotalSize = 256; + s->maxPerStageDescriptorInlineUniformBlocks = 4; + s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: + { + VkPhysicalDeviceVulkan13Properties *prettify_VkPhysicalDeviceVulkan13Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxBufferSize >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxBufferSize >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxBufferSize >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxDescriptorSetInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformBlockSize >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformBlockSize >= 256), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxInlineUniformBlockSize >= 256"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformTotalSize >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformTotalSize >= 256), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxInlineUniformTotalSize >= 256"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxPerStageDescriptorInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan13requirements +namespace vulkan13requirements_roadmap2022 +{ + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *s = static_cast(static_cast(p)); + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *prettify_VkPhysicalDeviceVulkan13Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R16_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R16_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan13requirements_roadmap2022 +} // namespace blocks +} // namespace VP_KHR_ROADMAP_2022 +#endif // VP_KHR_roadmap_2022 + +#ifdef VP_KHR_roadmap_2024 +namespace VP_KHR_ROADMAP_2024 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, +}; + +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, +}; + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_5_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAP_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + s->samplerYcbcrConversion = VK_TRUE; + s->shaderDrawParameters = VK_TRUE; + s->storageBuffer16BitAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->scalarBlockLayout = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderFloat16 = VK_TRUE; + s->shaderInt8 = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->storageBuffer8BitAccess = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + s->vulkanMemoryModel = VK_TRUE; + s->vulkanMemoryModelDeviceScope = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *s = static_cast(static_cast(p)); + s->computeFullSubgroups = VK_TRUE; + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + s->dynamicRendering = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + s->maintenance4 = VK_TRUE; + s->pipelineCreationCacheControl = VK_TRUE; + s->robustImageAccess = VK_TRUE; + s->shaderDemoteToHelperInvocation = VK_TRUE; + s->shaderIntegerDotProduct = VK_TRUE; + s->shaderTerminateInvocation = VK_TRUE; + s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; + s->subgroupSizeControl = VK_TRUE; + s->synchronization2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->samplerYcbcrConversion == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->samplerYcbcrConversion == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::samplerYcbcrConversion == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::shaderDrawParameters == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::scalarBlockLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderFloat16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderFloat16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderFloat16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModel == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *prettify_VkPhysicalDeviceVulkan13Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::computeFullSubgroups == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::dynamicRendering == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::inlineUniformBlock == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::maintenance4 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::robustImageAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::subgroupSizeControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::synchronization2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R16_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R16_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R32G32B32A32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - { - VK_FORMAT_R32G32B32A32_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R32G32B32A32_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; + +namespace blocks +{ +namespace vulkan10requirements_roadmap2024 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.multiDrawIndirect = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.maxBoundDescriptorSets = 7; + s->properties.limits.maxColorAttachments = 8; + s->properties.limits.timestampComputeAndGraphics = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.timestampComputeAndGraphics >= VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R32G32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R32G32_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - { - VK_FORMAT_R32G32_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan10requirements_roadmap2024 +namespace vulkan11requirements_roadmap2024 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->shaderDrawParameters = VK_TRUE; + s->storageBuffer16BitAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::shaderDrawParameters == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R32_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R32_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R5G6B5_UNORM_PACK16, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - { - VK_FORMAT_R8G8B8A8_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R8G8B8A8_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan11requirements_roadmap2024 +namespace vulkan12requirements_roadmap2024 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->shaderFloat16 = VK_TRUE; + s->shaderInt8 = VK_TRUE; + s->storageBuffer8BitAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderFloat16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderFloat16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderFloat16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->shaderRoundingModeRTEFloat16 = VK_TRUE; + s->shaderRoundingModeRTEFloat32 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat16 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat32 >= VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R8G8B8A8_SRGB, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R8G8B8A8_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - { - VK_FORMAT_R8G8B8A8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R8G8_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan12requirements_roadmap2024 +namespace vulkan13requirements_roadmap2024 +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R8G8_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R8G8_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R8G8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R8_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - { - VK_FORMAT_R8_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - { - VK_FORMAT_R8_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace vulkan13requirements_roadmap2024 +namespace vulkanextensionrequirements_roadmap2024 +{ + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_5_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAP_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace baseline -} // namespace VP_ANDROID_BASELINE_2021 -#endif // VP_ANDROID_baseline_2021 +} // namespace vulkanextensionrequirements_roadmap2024 +} // namespace blocks +} // namespace VP_KHR_ROADMAP_2024 +#endif // VP_KHR_roadmap_2024 -#ifdef VP_ANDROID_baseline_2022 -namespace VP_ANDROID_BASELINE_2022 { +#ifdef VP_LUNARG_desktop_baseline_2022 +namespace VP_LUNARG_DESKTOP_BASELINE_2022 +{ static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, }; static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, }; static const VkStructureType formatStructTypes[] = { @@ -4319,3757 +12158,16313 @@ static const VkStructureType formatStructTypes[] = { VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, }; -static const VkExtensionProperties instanceExtensions[] = { - VkExtensionProperties{ VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SURFACE_EXTENSION_NAME, 1 }, -}; - static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEVICE_GROUP_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_MAINTENANCE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_3_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MULTIVIEW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 70}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.largePoints = VK_TRUE; - s->features.robustBufferAccess = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.shaderInt16 = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - s->features.textureCompressionASTC_LDR = VK_TRUE; - s->features.textureCompressionETC2 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { - VkPhysicalDeviceSamplerYcbcrConversionFeatures* s = static_cast(static_cast(p)); - s->samplerYcbcrConversion = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: { - VkPhysicalDeviceShaderDrawParametersFeatures* s = static_cast(static_cast(p)); - s->shaderDrawParameters = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: { - VkPhysicalDeviceVariablePointersFeatures* s = static_cast(static_cast(p)); - s->variablePointers = VK_TRUE; - s->variablePointersStorageBuffer = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.largePoints == VK_TRUE); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.shaderInt16 == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.textureCompressionASTC_LDR == VK_TRUE); - ret = ret && (s->features.textureCompressionETC2 == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { - VkPhysicalDeviceSamplerYcbcrConversionFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->samplerYcbcrConversion == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: { - VkPhysicalDeviceShaderDrawParametersFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->shaderDrawParameters == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: { - VkPhysicalDeviceVariablePointersFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->variablePointers == VK_TRUE); - ret = ret && (s->variablePointersStorageBuffer == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice16BitStorageFeaturesKHR *s = static_cast(static_cast(p)); + s->storageBuffer16BitAccess = VK_TRUE; + s->uniformAndStorageBuffer16BitAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice8BitStorageFeaturesKHR *s = static_cast(static_cast(p)); + s->storageBuffer8BitAccess = VK_TRUE; + s->uniformAndStorageBuffer8BitAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: + { + VkPhysicalDeviceDescriptorIndexingFeaturesEXT *s = static_cast(static_cast(p)); + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.dualSrcBlend = VK_TRUE; + s->features.fillModeNonSolid = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.inheritedQueries = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.multiViewport = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderClipDistance = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + s->features.shaderTessellationAndGeometryPointSize = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.tessellationShader = VK_TRUE; + s->features.textureCompressionBC = VK_TRUE; + s->features.vertexPipelineStoresAndAtomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR: + { + VkPhysicalDeviceFloat16Int8FeaturesKHR *s = static_cast(static_cast(p)); + s->shaderInt8 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: + { + VkPhysicalDeviceHostQueryResetFeaturesEXT *s = static_cast(static_cast(p)); + s->hostQueryReset = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *s = static_cast(static_cast(p)); + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR: + { + VkPhysicalDeviceMultiviewFeaturesKHR *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: + { + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *s = static_cast(static_cast(p)); + s->scalarBlockLayout = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *s = static_cast(static_cast(p)); + s->texelBufferAlignment = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR: + { + VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *s = static_cast(static_cast(p)); + s->timelineSemaphore = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: + { + VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *s = static_cast(static_cast(p)); + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeaturesKHR *s = static_cast(static_cast(p)); + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + s->vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice16BitStorageFeaturesKHR *prettify_VkPhysicalDevice16BitStorageFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice16BitStorageFeaturesKHR->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice16BitStorageFeaturesKHR->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDevice16BitStorageFeaturesKHR->uniformAndStorageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice16BitStorageFeaturesKHR->uniformAndStorageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice16BitStorageFeaturesKHR::uniformAndStorageBuffer16BitAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice8BitStorageFeaturesKHR *prettify_VkPhysicalDevice8BitStorageFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice8BitStorageFeaturesKHR->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice8BitStorageFeaturesKHR->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice8BitStorageFeaturesKHR::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDevice8BitStorageFeaturesKHR->uniformAndStorageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice8BitStorageFeaturesKHR->uniformAndStorageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice8BitStorageFeaturesKHR::uniformAndStorageBuffer8BitAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: + { + VkPhysicalDeviceDescriptorIndexingFeaturesEXT *prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.dualSrcBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fillModeNonSolid == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.inheritedQueries == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiViewport == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderClipDistance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderTessellationAndGeometryPointSize == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.tessellationShader == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionBC == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.vertexPipelineStoresAndAtomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR: + { + VkPhysicalDeviceFloat16Int8FeaturesKHR *prettify_VkPhysicalDeviceFloat16Int8FeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFloat16Int8FeaturesKHR->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloat16Int8FeaturesKHR->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFloat16Int8FeaturesKHR::shaderInt8 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: + { + VkPhysicalDeviceHostQueryResetFeaturesEXT *prettify_VkPhysicalDeviceHostQueryResetFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceHostQueryResetFeaturesEXT->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceHostQueryResetFeaturesEXT->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceHostQueryResetFeaturesEXT::hostQueryReset == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::inlineUniformBlock == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR: + { + VkPhysicalDeviceMultiviewFeaturesKHR *prettify_VkPhysicalDeviceMultiviewFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewFeaturesKHR->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewFeaturesKHR->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceMultiviewFeaturesKHR::multiview == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *prettify_VkPhysicalDeviceRobustness2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: + { + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *prettify_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceScalarBlockLayoutFeaturesEXT::scalarBlockLayout == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR: + { + VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *prettify_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTimelineSemaphoreFeaturesKHR::timelineSemaphore == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: + { + VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *prettify_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR::uniformBufferStandardLayout == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeaturesKHR *prettify_VkPhysicalDeviceVariablePointersFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeaturesKHR::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeaturesKHR::variablePointersStorageBuffer == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateDivisor == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateZeroDivisor == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceMultiviewFeatures }; - VkPhysicalDeviceShaderDrawParametersFeatures physicalDeviceShaderDrawParametersFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceVariablePointersFeatures physicalDeviceVariablePointersFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, &physicalDeviceShaderDrawParametersFeatures }; - p->pNext = static_cast(static_cast(&physicalDeviceVariablePointersFeatures)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceMultiviewProperties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDevice16BitStorageFeaturesKHR physicalDevice16BitStorageFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, nullptr}; + VkPhysicalDevice8BitStorageFeaturesKHR physicalDevice8BitStorageFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, &physicalDevice16BitStorageFeaturesKHR}; + VkPhysicalDeviceDescriptorIndexingFeaturesEXT physicalDeviceDescriptorIndexingFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, &physicalDevice8BitStorageFeaturesKHR}; + VkPhysicalDeviceFloat16Int8FeaturesKHR physicalDeviceFloat16Int8FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR, &physicalDeviceDescriptorIndexingFeaturesEXT}; + VkPhysicalDeviceHostQueryResetFeaturesEXT physicalDeviceHostQueryResetFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, &physicalDeviceFloat16Int8FeaturesKHR}; + VkPhysicalDeviceInlineUniformBlockFeaturesEXT physicalDeviceInlineUniformBlockFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, &physicalDeviceHostQueryResetFeaturesEXT}; + VkPhysicalDeviceMultiviewFeaturesKHR physicalDeviceMultiviewFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, &physicalDeviceInlineUniformBlockFeaturesEXT}; + VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &physicalDeviceMultiviewFeaturesKHR}; + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT physicalDeviceScalarBlockLayoutFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, &physicalDeviceRobustness2FeaturesEXT}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, &physicalDeviceScalarBlockLayoutFeaturesEXT}; + VkPhysicalDeviceTimelineSemaphoreFeaturesKHR physicalDeviceTimelineSemaphoreFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, &physicalDeviceTexelBufferAlignmentFeaturesEXT}; + VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR physicalDeviceUniformBufferStandardLayoutFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, &physicalDeviceTimelineSemaphoreFeaturesKHR}; + VkPhysicalDeviceVariablePointersFeaturesKHR physicalDeviceVariablePointersFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, &physicalDeviceUniformBufferStandardLayoutFeaturesKHR}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physicalDeviceVertexAttributeDivisorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, &physicalDeviceVariablePointersFeaturesKHR}; + p->pNext = static_cast(static_cast(&physicalDeviceVertexAttributeDivisorFeaturesEXT)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceDepthStencilResolvePropertiesKHR physicalDeviceDepthStencilResolvePropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR, nullptr}; + VkPhysicalDeviceDescriptorIndexingPropertiesEXT physicalDeviceDescriptorIndexingPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, &physicalDeviceDepthStencilResolvePropertiesKHR}; + VkPhysicalDeviceInlineUniformBlockPropertiesEXT physicalDeviceInlineUniformBlockPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, &physicalDeviceDescriptorIndexingPropertiesEXT}; + VkPhysicalDeviceMaintenance3PropertiesKHR physicalDeviceMaintenance3PropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR, &physicalDeviceInlineUniformBlockPropertiesEXT}; + VkPhysicalDeviceMultiviewPropertiesKHR physicalDeviceMultiviewPropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR, &physicalDeviceMaintenance3PropertiesKHR}; + VkPhysicalDeviceRobustness2PropertiesEXT physicalDeviceRobustness2PropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, &physicalDeviceMultiviewPropertiesKHR}; + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT physicalDeviceSubgroupSizeControlPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, &physicalDeviceRobustness2PropertiesEXT}; + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT physicalDeviceTexelBufferAlignmentPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, &physicalDeviceSubgroupSizeControlPropertiesEXT}; + VkPhysicalDeviceTimelineSemaphorePropertiesKHR physicalDeviceTimelineSemaphorePropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR, &physicalDeviceTexelBufferAlignmentPropertiesEXT}; + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT physicalDeviceVertexAttributeDivisorPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, &physicalDeviceTimelineSemaphorePropertiesKHR}; + p->pNext = static_cast(static_cast(&physicalDeviceVertexAttributeDivisorPropertiesEXT)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, }; -namespace baseline { -static const VkExtensionProperties instanceExtensions[] = { - VkExtensionProperties{ VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SURFACE_EXTENSION_NAME, 1 }, -}; +namespace blocks +{ +namespace VP_LUNARG_desktop_baseline_2022_block +{ static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SWAPCHAIN_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEVICE_GROUP_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_MAINTENANCE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_3_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MULTIVIEW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 70}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.largePoints = VK_TRUE; - s->features.robustBufferAccess = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.shaderInt16 = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - s->features.textureCompressionASTC_LDR = VK_TRUE; - s->features.textureCompressionETC2 = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { - VkPhysicalDeviceSamplerYcbcrConversionFeatures* s = static_cast(static_cast(p)); - s->samplerYcbcrConversion = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: { - VkPhysicalDeviceShaderDrawParametersFeatures* s = static_cast(static_cast(p)); - s->shaderDrawParameters = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: { - VkPhysicalDeviceVariablePointersFeatures* s = static_cast(static_cast(p)); - s->variablePointers = VK_TRUE; - s->variablePointersStorageBuffer = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.largePoints == VK_TRUE); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.shaderInt16 == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.textureCompressionASTC_LDR == VK_TRUE); - ret = ret && (s->features.textureCompressionETC2 == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { - VkPhysicalDeviceSamplerYcbcrConversionFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->samplerYcbcrConversion == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: { - VkPhysicalDeviceShaderDrawParametersFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->shaderDrawParameters == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: { - VkPhysicalDeviceVariablePointersFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->variablePointers == VK_TRUE); - ret = ret && (s->variablePointersStorageBuffer == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice16BitStorageFeaturesKHR *s = static_cast(static_cast(p)); + s->storageBuffer16BitAccess = VK_TRUE; + s->uniformAndStorageBuffer16BitAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice8BitStorageFeaturesKHR *s = static_cast(static_cast(p)); + s->storageBuffer8BitAccess = VK_TRUE; + s->uniformAndStorageBuffer8BitAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: + { + VkPhysicalDeviceDescriptorIndexingFeaturesEXT *s = static_cast(static_cast(p)); + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.dualSrcBlend = VK_TRUE; + s->features.fillModeNonSolid = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.inheritedQueries = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.multiViewport = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderClipDistance = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + s->features.shaderTessellationAndGeometryPointSize = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.tessellationShader = VK_TRUE; + s->features.textureCompressionBC = VK_TRUE; + s->features.vertexPipelineStoresAndAtomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR: + { + VkPhysicalDeviceFloat16Int8FeaturesKHR *s = static_cast(static_cast(p)); + s->shaderInt8 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: + { + VkPhysicalDeviceHostQueryResetFeaturesEXT *s = static_cast(static_cast(p)); + s->hostQueryReset = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *s = static_cast(static_cast(p)); + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR: + { + VkPhysicalDeviceMultiviewFeaturesKHR *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: + { + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *s = static_cast(static_cast(p)); + s->scalarBlockLayout = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *s = static_cast(static_cast(p)); + s->texelBufferAlignment = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR: + { + VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *s = static_cast(static_cast(p)); + s->timelineSemaphore = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: + { + VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *s = static_cast(static_cast(p)); + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeaturesKHR *s = static_cast(static_cast(p)); + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + s->vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice16BitStorageFeaturesKHR *prettify_VkPhysicalDevice16BitStorageFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice16BitStorageFeaturesKHR->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice16BitStorageFeaturesKHR->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDevice16BitStorageFeaturesKHR->uniformAndStorageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice16BitStorageFeaturesKHR->uniformAndStorageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice16BitStorageFeaturesKHR::uniformAndStorageBuffer16BitAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: + { + VkPhysicalDevice8BitStorageFeaturesKHR *prettify_VkPhysicalDevice8BitStorageFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice8BitStorageFeaturesKHR->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice8BitStorageFeaturesKHR->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice8BitStorageFeaturesKHR::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDevice8BitStorageFeaturesKHR->uniformAndStorageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice8BitStorageFeaturesKHR->uniformAndStorageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice8BitStorageFeaturesKHR::uniformAndStorageBuffer8BitAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: + { + VkPhysicalDeviceDescriptorIndexingFeaturesEXT *prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingFeaturesEXT->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.dualSrcBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fillModeNonSolid == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.inheritedQueries == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiViewport == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderClipDistance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderTessellationAndGeometryPointSize == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.tessellationShader == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionBC == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.vertexPipelineStoresAndAtomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR: + { + VkPhysicalDeviceFloat16Int8FeaturesKHR *prettify_VkPhysicalDeviceFloat16Int8FeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFloat16Int8FeaturesKHR->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloat16Int8FeaturesKHR->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFloat16Int8FeaturesKHR::shaderInt8 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: + { + VkPhysicalDeviceHostQueryResetFeaturesEXT *prettify_VkPhysicalDeviceHostQueryResetFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceHostQueryResetFeaturesEXT->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceHostQueryResetFeaturesEXT->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceHostQueryResetFeaturesEXT::hostQueryReset == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::inlineUniformBlock == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR: + { + VkPhysicalDeviceMultiviewFeaturesKHR *prettify_VkPhysicalDeviceMultiviewFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewFeaturesKHR->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewFeaturesKHR->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceMultiviewFeaturesKHR::multiview == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *prettify_VkPhysicalDeviceRobustness2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: + { + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *prettify_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceScalarBlockLayoutFeaturesEXT::scalarBlockLayout == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR: + { + VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *prettify_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTimelineSemaphoreFeaturesKHR::timelineSemaphore == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR: + { + VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *prettify_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR::uniformBufferStandardLayout == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + { + VkPhysicalDeviceVariablePointersFeaturesKHR *prettify_VkPhysicalDeviceVariablePointersFeaturesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeaturesKHR::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVariablePointersFeaturesKHR->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVariablePointersFeaturesKHR::variablePointersStorageBuffer == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateDivisor == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateZeroDivisor == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.discreteQueuePriorities = 2; - s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.maxBoundDescriptorSets = 4; - s->properties.limits.maxColorAttachments = 4; - s->properties.limits.maxComputeSharedMemorySize = 16384; - s->properties.limits.maxComputeWorkGroupCount[0] = 65535; - s->properties.limits.maxComputeWorkGroupCount[1] = 65535; - s->properties.limits.maxComputeWorkGroupCount[2] = 65535; - s->properties.limits.maxComputeWorkGroupInvocations = 128; - s->properties.limits.maxComputeWorkGroupSize[0] = 128; - s->properties.limits.maxComputeWorkGroupSize[1] = 128; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxDescriptorSetInputAttachments = 4; - s->properties.limits.maxDescriptorSetSampledImages = 48; - s->properties.limits.maxDescriptorSetSamplers = 48; - s->properties.limits.maxDescriptorSetStorageBuffers = 24; - s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; - s->properties.limits.maxDescriptorSetStorageImages = 12; - s->properties.limits.maxDescriptorSetUniformBuffers = 36; - s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; - s->properties.limits.maxDrawIndexedIndexValue = 4294967295; - s->properties.limits.maxDrawIndirectCount = 1; - s->properties.limits.maxFragmentCombinedOutputResources = 8; - s->properties.limits.maxFragmentInputComponents = 64; - s->properties.limits.maxFragmentOutputAttachments = 4; - s->properties.limits.maxFramebufferHeight = 4096; - s->properties.limits.maxFramebufferLayers = 256; - s->properties.limits.maxFramebufferWidth = 4096; - s->properties.limits.maxImageArrayLayers = 256; - s->properties.limits.maxImageDimension1D = 4096; - s->properties.limits.maxImageDimension2D = 4096; - s->properties.limits.maxImageDimension3D = 512; - s->properties.limits.maxImageDimensionCube = 4096; - s->properties.limits.maxInterpolationOffset = 0.4375f; - s->properties.limits.maxMemoryAllocationCount = 4096; - s->properties.limits.maxPerStageDescriptorInputAttachments = 4; - s->properties.limits.maxPerStageDescriptorSampledImages = 16; - s->properties.limits.maxPerStageDescriptorSamplers = 16; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; - s->properties.limits.maxPerStageDescriptorStorageImages = 4; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; - s->properties.limits.maxPerStageResources = 44; - s->properties.limits.maxPushConstantsSize = 128; - s->properties.limits.maxSampleMaskWords = 1; - s->properties.limits.maxSamplerAllocationCount = 4000; - s->properties.limits.maxSamplerAnisotropy = 1.0f; - s->properties.limits.maxSamplerLodBias = 2.0f; - s->properties.limits.maxStorageBufferRange = 134217728; - s->properties.limits.maxTexelBufferElements = 65536; - s->properties.limits.maxTexelOffset = 7; - s->properties.limits.maxUniformBufferRange = 16384; - s->properties.limits.maxVertexInputAttributeOffset = 2047; - s->properties.limits.maxVertexInputAttributes = 16; - s->properties.limits.maxVertexInputBindingStride = 2048; - s->properties.limits.maxVertexInputBindings = 16; - s->properties.limits.maxVertexOutputComponents = 64; - s->properties.limits.maxViewportDimensions[0] = 4096; - s->properties.limits.maxViewportDimensions[1] = 4096; - s->properties.limits.maxViewports = 1; - s->properties.limits.minInterpolationOffset = -0.5f; - s->properties.limits.minStorageBufferOffsetAlignment = 256; - s->properties.limits.minTexelBufferOffsetAlignment = 256; - s->properties.limits.minTexelOffset = -8; - s->properties.limits.minUniformBufferOffsetAlignment = 256; - s->properties.limits.mipmapPrecisionBits = 4; - s->properties.limits.pointSizeGranularity = 1; - s->properties.limits.pointSizeRange[0] = 1.0f; - s->properties.limits.pointSizeRange[1] = 511; - s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.standardSampleLocations = VK_TRUE; - s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.subPixelInterpolationOffsetBits = 4; - s->properties.limits.subPixelPrecisionBits = 4; - s->properties.limits.subTexelPrecisionBits = 4; - s->properties.limits.viewportBoundsRange[0] = -8192; - s->properties.limits.viewportBoundsRange[1] = 8191; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: { - VkPhysicalDeviceMultiviewProperties* s = static_cast(static_cast(p)); - s->maxMultiviewInstanceIndex = 134217727; - s->maxMultiviewViewCount = 6; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.discreteQueuePriorities >= 2); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 4); - ret = ret && (s->properties.limits.maxColorAttachments >= 4); - ret = ret && (s->properties.limits.maxComputeSharedMemorySize >= 16384); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[0] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[1] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[2] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxDescriptorSetInputAttachments >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 48); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 48); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 12); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 36); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); - ret = ret && (s->properties.limits.maxDrawIndexedIndexValue >= 4294967295); - ret = ret && (s->properties.limits.maxDrawIndirectCount >= 1); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 8); - ret = ret && (s->properties.limits.maxFragmentInputComponents >= 64); - ret = ret && (s->properties.limits.maxFragmentOutputAttachments >= 4); - ret = ret && (s->properties.limits.maxFramebufferHeight >= 4096); - ret = ret && (s->properties.limits.maxFramebufferLayers >= 256); - ret = ret && (s->properties.limits.maxFramebufferWidth >= 4096); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 256); - ret = ret && (s->properties.limits.maxImageDimension1D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension2D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension3D >= 512); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 4096); - ret = ret && (s->properties.limits.maxInterpolationOffset >= 0.4375); - ret = ret && (s->properties.limits.maxMemoryAllocationCount >= 4096); - ret = ret && (s->properties.limits.maxPerStageDescriptorInputAttachments >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageResources >= 44); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 128); - ret = ret && (s->properties.limits.maxSampleMaskWords >= 1); - ret = ret && (s->properties.limits.maxSamplerAllocationCount >= 4000); - ret = ret && (s->properties.limits.maxSamplerAnisotropy >= 1.0); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 2.0); - ret = ret && (s->properties.limits.maxStorageBufferRange >= 134217728); - ret = ret && (s->properties.limits.maxTexelBufferElements >= 65536); - ret = ret && (s->properties.limits.maxTexelOffset >= 7); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 16384); - ret = ret && (s->properties.limits.maxVertexInputAttributeOffset >= 2047); - ret = ret && (s->properties.limits.maxVertexInputAttributes >= 16); - ret = ret && (s->properties.limits.maxVertexInputBindingStride >= 2048); - ret = ret && (s->properties.limits.maxVertexInputBindings >= 16); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 64); - ret = ret && (s->properties.limits.maxViewportDimensions[0] >= 4096); - ret = ret && (s->properties.limits.maxViewportDimensions[1] >= 4096); - ret = ret && (s->properties.limits.maxViewports >= 1); - ret = ret && (s->properties.limits.minInterpolationOffset <= -0.5); - ret = ret && (s->properties.limits.minStorageBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minStorageBufferOffsetAlignment & (s->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minTexelBufferOffsetAlignment & (s->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelOffset <= -8); - ret = ret && (s->properties.limits.minUniformBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minUniformBufferOffsetAlignment & (s->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 4); - ret = ret && (s->properties.limits.pointSizeGranularity <= 1); - ret = ret && (isMultiple(1, s->properties.limits.pointSizeGranularity)); - ret = ret && (s->properties.limits.pointSizeRange[0] <= 1.0); - ret = ret && (s->properties.limits.pointSizeRange[1] >= 511); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.standardSampleLocations == VK_TRUE); - ret = ret && (vpCheckFlags(s->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (s->properties.limits.subPixelInterpolationOffsetBits >= 4); - ret = ret && (s->properties.limits.subPixelPrecisionBits >= 4); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 4); - ret = ret && (s->properties.limits.viewportBoundsRange[0] <= -8192); - ret = ret && (s->properties.limits.viewportBoundsRange[1] >= 8191); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: { - VkPhysicalDeviceMultiviewProperties* s = static_cast(static_cast(p)); - ret = ret && (s->maxMultiviewInstanceIndex >= 134217727); - ret = ret && (s->maxMultiviewViewCount >= 6); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR: + { + VkPhysicalDeviceDepthStencilResolvePropertiesKHR *s = static_cast(static_cast(p)); + s->independentResolve = VK_TRUE; + s->independentResolveNone = VK_TRUE; + s->supportedDepthResolveModes |= (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); + s->supportedStencilResolveModes |= (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: + { + VkPhysicalDeviceDescriptorIndexingPropertiesEXT *s = static_cast(static_cast(p)); + s->maxDescriptorSetUpdateAfterBindInputAttachments = 256; + s->maxDescriptorSetUpdateAfterBindSampledImages = 640; + s->maxDescriptorSetUpdateAfterBindSamplers = 80; + s->maxDescriptorSetUpdateAfterBindStorageBuffers = 155; + s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 8; + s->maxDescriptorSetUpdateAfterBindStorageImages = 40; + s->maxDescriptorSetUpdateAfterBindUniformBuffers = 90; + s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 8; + s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 64; + s->maxPerStageDescriptorUpdateAfterBindSampledImages = 128; + s->maxPerStageDescriptorUpdateAfterBindSamplers = 16; + s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 31; + s->maxPerStageDescriptorUpdateAfterBindStorageImages = 8; + s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 15; + s->maxPerStageUpdateAfterBindResources = 159; + s->maxUpdateAfterBindDescriptorsInAllPools = 1048576; + s->quadDivergentImplicitLod = VK_FALSE; + s->robustBufferAccessUpdateAfterBind = VK_TRUE; + s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; + s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: + { + VkPhysicalDeviceInlineUniformBlockPropertiesEXT *s = static_cast(static_cast(p)); + s->maxDescriptorSetInlineUniformBlocks = 4; + s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = 4; + s->maxInlineUniformBlockSize = 256; + s->maxPerStageDescriptorInlineUniformBlocks = 4; + s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR: + { + VkPhysicalDeviceMaintenance3PropertiesKHR *s = static_cast(static_cast(p)); + s->maxMemoryAllocationSize = 2147483648; + s->maxPerSetDescriptors = 700; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR: + { + VkPhysicalDeviceMultiviewPropertiesKHR *s = static_cast(static_cast(p)); + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 65536; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 1.0f; + s->properties.limits.lineWidthRange[0] = 1; + s->properties.limits.lineWidthRange[1] = 1; + s->properties.limits.maxBoundDescriptorSets = 8; + s->properties.limits.maxClipDistances = 8; + s->properties.limits.maxColorAttachments = 8; + s->properties.limits.maxCombinedClipAndCullDistances = 8; + s->properties.limits.maxComputeSharedMemorySize = 32768; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 1024; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 7; + s->properties.limits.maxDescriptorSetSampledImages = 640; + s->properties.limits.maxDescriptorSetSamplers = 80; + s->properties.limits.maxDescriptorSetStorageBuffers = 155; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 8; + s->properties.limits.maxDescriptorSetStorageImages = 40; + s->properties.limits.maxDescriptorSetUniformBuffers = 90; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 4294967294; + s->properties.limits.maxDrawIndirectCount = 1073741824; + s->properties.limits.maxFragmentCombinedOutputResources = 8; + s->properties.limits.maxFragmentDualSrcAttachments = 1; + s->properties.limits.maxFragmentInputComponents = 116; + s->properties.limits.maxFragmentOutputAttachments = 8; + s->properties.limits.maxFramebufferHeight = 16384; + s->properties.limits.maxFramebufferLayers = 1024; + s->properties.limits.maxFramebufferWidth = 16384; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 2048; + s->properties.limits.maxImageDimension1D = 16384; + s->properties.limits.maxImageDimension2D = 16384; + s->properties.limits.maxImageDimension3D = 2048; + s->properties.limits.maxImageDimensionCube = 16384; + s->properties.limits.maxInterpolationOffset = 0.4375f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 7; + s->properties.limits.maxPerStageDescriptorSampledImages = 128; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 31; + s->properties.limits.maxPerStageDescriptorStorageImages = 8; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; + s->properties.limits.maxPerStageResources = 159; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 1024; + s->properties.limits.maxSamplerAnisotropy = 16; + s->properties.limits.maxSamplerLodBias = 0.0f; + s->properties.limits.maxStorageBufferRange = 1073741820; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 120; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 124; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 124; + s->properties.limits.maxTessellationControlTotalOutputComponents = 2048; + s->properties.limits.maxTessellationEvaluationInputComponents = 124; + s->properties.limits.maxTessellationEvaluationOutputComponents = 124; + s->properties.limits.maxTessellationGenerationLevel = 64; + s->properties.limits.maxTessellationPatchSize = 32; + s->properties.limits.maxTexelBufferElements = 67108864; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 65536; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 28; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 28; + s->properties.limits.maxVertexOutputComponents = 124; + s->properties.limits.maxViewportDimensions[0] = 16384; + s->properties.limits.maxViewportDimensions[1] = 16384; + s->properties.limits.maxViewports = 16; + s->properties.limits.minInterpolationOffset = -0.5f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 64; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 256; + s->properties.limits.optimalBufferCopyOffsetAlignment = 256; + s->properties.limits.optimalBufferCopyRowPitchAlignment = 128; + s->properties.limits.pointSizeGranularity = 1; + s->properties.limits.pointSizeRange[0] = 1; + s->properties.limits.pointSizeRange[1] = 64; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 4; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.timestampComputeAndGraphics = VK_TRUE; + s->properties.limits.viewportBoundsRange[0] = -32768; + s->properties.limits.viewportBoundsRange[1] = 32767; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyAlignedMipSize = VK_TRUE; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: + { + VkPhysicalDeviceRobustness2PropertiesEXT *s = static_cast(static_cast(p)); + s->robustStorageBufferAccessSizeAlignment = 4; + s->robustUniformBufferAccessSizeAlignment = 256; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: + { + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *s = static_cast(static_cast(p)); + s->maxComputeWorkgroupSubgroups = 16; + s->maxSubgroupSize = 1; + s->minSubgroupSize = 64; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *s = static_cast(static_cast(p)); + s->storageTexelBufferOffsetAlignmentBytes = 256; + s->uniformTexelBufferOffsetAlignmentBytes = 256; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR: + { + VkPhysicalDeviceTimelineSemaphorePropertiesKHR *s = static_cast(static_cast(p)); + s->maxTimelineSemaphoreValueDifference = 2147483647; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *s = static_cast(static_cast(p)); + s->maxVertexAttribDivisor = 268435455; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR: + { + VkPhysicalDeviceDepthStencilResolvePropertiesKHR *prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->independentResolve >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->independentResolve >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceDepthStencilResolvePropertiesKHR::independentResolve >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->independentResolveNone >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->independentResolveNone >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceDepthStencilResolvePropertiesKHR::independentResolveNone >= VK_TRUE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->supportedDepthResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->supportedDepthResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))), "Unsupported properties condition: VkPhysicalDeviceDepthStencilResolvePropertiesKHR::supportedDepthResolveModes contains (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->supportedStencilResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceDepthStencilResolvePropertiesKHR->supportedStencilResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))), "Unsupported properties condition: VkPhysicalDeviceDepthStencilResolvePropertiesKHR::supportedStencilResolveModes contains (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: + { + VkPhysicalDeviceDescriptorIndexingPropertiesEXT *prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindInputAttachments >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindInputAttachments >= 256), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindInputAttachments >= 256"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindSampledImages >= 640); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindSampledImages >= 640), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSampledImages >= 640"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindSamplers >= 80); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindSamplers >= 80), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSamplers >= 80"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindStorageBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindStorageBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindStorageImages >= 40); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindStorageImages >= 40), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageImages >= 40"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindUniformBuffers >= 90); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindUniformBuffers >= 90), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffers >= 90"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindStorageImages >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindStorageImages >= 8), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageImages >= 8"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageUpdateAfterBindResources >= 159); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxPerStageUpdateAfterBindResources >= 159), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageUpdateAfterBindResources >= 159"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxUpdateAfterBindDescriptorsInAllPools >= 1048576); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->maxUpdateAfterBindDescriptorsInAllPools >= 1048576), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxUpdateAfterBindDescriptorsInAllPools >= 1048576"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->quadDivergentImplicitLod >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->quadDivergentImplicitLod >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::quadDivergentImplicitLod >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->robustBufferAccessUpdateAfterBind >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->robustBufferAccessUpdateAfterBind >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::robustBufferAccessUpdateAfterBind >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceDescriptorIndexingPropertiesEXT->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceDescriptorIndexingPropertiesEXT::shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: + { + VkPhysicalDeviceInlineUniformBlockPropertiesEXT *prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxInlineUniformBlockSize >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxInlineUniformBlockSize >= 256), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxInlineUniformBlockSize >= 256"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR: + { + VkPhysicalDeviceMaintenance3PropertiesKHR *prettify_VkPhysicalDeviceMaintenance3PropertiesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMaintenance3PropertiesKHR->maxMemoryAllocationSize >= 2147483648); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMaintenance3PropertiesKHR->maxMemoryAllocationSize >= 2147483648), "Unsupported properties condition: VkPhysicalDeviceMaintenance3PropertiesKHR::maxMemoryAllocationSize >= 2147483648"); + ret = ret && (prettify_VkPhysicalDeviceMaintenance3PropertiesKHR->maxPerSetDescriptors >= 700); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMaintenance3PropertiesKHR->maxPerSetDescriptors >= 700), "Unsupported properties condition: VkPhysicalDeviceMaintenance3PropertiesKHR::maxPerSetDescriptors >= 700"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR: + { + VkPhysicalDeviceMultiviewPropertiesKHR *prettify_VkPhysicalDeviceMultiviewPropertiesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewPropertiesKHR->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewPropertiesKHR->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceMultiviewPropertiesKHR::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceMultiviewPropertiesKHR->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewPropertiesKHR->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceMultiviewPropertiesKHR::maxMultiviewViewCount >= 6"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 65536"); + ret = ret && ((65536 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((65536 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (65536 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 32768); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 32768), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 32768"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 640); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 640), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 640"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 80); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 80), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 80"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 40); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 40), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 40"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 90"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967294); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967294), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 4294967294"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 116); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 116), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 116"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.4375"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 31), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 31"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 159); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 159), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 159"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 1073741820); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 1073741820), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 1073741820"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 120); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 120), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 120"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 32), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 32"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 67108864); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 67108864), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 67108864"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 28); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 28), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 28"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 28); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 28), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 28"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= -0.5"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.optimalBufferCopyOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment <= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment <= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.optimalBufferCopyRowPitchAlignment <= 128"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1"); + ret = ret && (isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 64"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.timestampComputeAndGraphics >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -32768); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -32768), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -32768"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 32767); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 32767), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 32767"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyAlignedMipSize <= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyAlignedMipSize <= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyAlignedMipSize <= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: + { + VkPhysicalDeviceRobustness2PropertiesEXT *prettify_VkPhysicalDeviceRobustness2PropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment <= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment <= 4), "Unsupported properties condition: VkPhysicalDeviceRobustness2PropertiesEXT::robustStorageBufferAccessSizeAlignment <= 4"); + ret = ret && ((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceRobustness2PropertiesEXT::robustUniformBufferAccessSizeAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: + { + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxComputeWorkgroupSubgroups >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxComputeWorkgroupSubgroups >= 16), "Unsupported properties condition: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT::maxComputeWorkgroupSubgroups >= 16"); + ret = ret && (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize >= 1), "Unsupported properties condition: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT::maxSubgroupSize >= 1"); + ret = ret && ((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize <= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize <= 64), "Unsupported properties condition: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT::minSubgroupSize <= 64"); + ret = ret && ((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes <= 256), "Unsupported properties condition: VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetAlignmentBytes <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes <= 256), "Unsupported properties condition: VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetAlignmentBytes <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR: + { + VkPhysicalDeviceTimelineSemaphorePropertiesKHR *prettify_VkPhysicalDeviceTimelineSemaphorePropertiesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTimelineSemaphorePropertiesKHR->maxTimelineSemaphoreValueDifference >= 2147483647); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTimelineSemaphorePropertiesKHR->maxTimelineSemaphoreValueDifference >= 2147483647), "Unsupported properties condition: VkPhysicalDeviceTimelineSemaphorePropertiesKHR::maxTimelineSemaphoreValueDifference >= 2147483647"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT->maxVertexAttribDivisor >= 268435455); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT->maxVertexAttribDivisor >= 268435455), "Unsupported properties condition: VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor >= 268435455"); + } + break; + default: + break; + } + return ret; + }}; static const VpFormatDesc formatDesc[] = { - { - VK_FORMAT_A1R5G5B5_UNORM_PACK16, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A2B10G10R10_UINT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A2B10G10R10_UNORM_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_SINT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_SNORM_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_SRGB_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_UINT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_A8B8G8R8_UNORM_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x10_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x10_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x6_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x6_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_10x8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x10_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x10_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x12_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_12x12_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_4x4_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_4x4_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x4_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x4_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_5x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x6_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_6x6_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x5_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x5_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x6_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x6_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ASTC_8x8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B10G11R11_UFLOAT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B4G4R4A4_UNORM_PACK16, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B8G8R8A8_SRGB, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_B8G8R8A8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_D16_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_D32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11G11_SNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11G11_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11_SNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_EAC_R11_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16B16A16_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16B16A16_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16B16A16_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16B16A16_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16G16_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R16_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32G32B32A32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32G32B32A32_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32G32B32A32_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32G32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32G32_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32G32_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32_SFLOAT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R32_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R5G6B5_UNORM_PACK16, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8B8A8_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8B8A8_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8B8A8_SRGB, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8B8A8_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8B8A8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8G8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8_SINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } - }, - { - VK_FORMAT_R8_SNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + {VK_FORMAT_A2B10G10R10_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2R10G10B10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SRGB_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SSCALED_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SSCALED_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_USCALED_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_USCALED_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B10G11R11_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGBA_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGBA_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGB_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGB_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGB_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGB_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC2_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC2_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC2_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC2_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC3_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC3_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC3_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC3_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC4_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC4_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC5_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC5_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC6H_SFLOAT_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC6H_SFLOAT_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC6H_UFLOAT_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC6H_UFLOAT_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC7_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC7_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC7_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC7_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT_S8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT_S8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, +}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDevice16BitStorageFeaturesKHR physicalDevice16BitStorageFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, nullptr}; + VkPhysicalDevice8BitStorageFeaturesKHR physicalDevice8BitStorageFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, &physicalDevice16BitStorageFeaturesKHR}; + VkPhysicalDeviceDescriptorIndexingFeaturesEXT physicalDeviceDescriptorIndexingFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, &physicalDevice8BitStorageFeaturesKHR}; + VkPhysicalDeviceFloat16Int8FeaturesKHR physicalDeviceFloat16Int8FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR, &physicalDeviceDescriptorIndexingFeaturesEXT}; + VkPhysicalDeviceHostQueryResetFeaturesEXT physicalDeviceHostQueryResetFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT, &physicalDeviceFloat16Int8FeaturesKHR}; + VkPhysicalDeviceInlineUniformBlockFeaturesEXT physicalDeviceInlineUniformBlockFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, &physicalDeviceHostQueryResetFeaturesEXT}; + VkPhysicalDeviceMultiviewFeaturesKHR physicalDeviceMultiviewFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, &physicalDeviceInlineUniformBlockFeaturesEXT}; + VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &physicalDeviceMultiviewFeaturesKHR}; + VkPhysicalDeviceScalarBlockLayoutFeaturesEXT physicalDeviceScalarBlockLayoutFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, &physicalDeviceRobustness2FeaturesEXT}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, &physicalDeviceScalarBlockLayoutFeaturesEXT}; + VkPhysicalDeviceTimelineSemaphoreFeaturesKHR physicalDeviceTimelineSemaphoreFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR, &physicalDeviceTexelBufferAlignmentFeaturesEXT}; + VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR physicalDeviceUniformBufferStandardLayoutFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR, &physicalDeviceTimelineSemaphoreFeaturesKHR}; + VkPhysicalDeviceVariablePointersFeaturesKHR physicalDeviceVariablePointersFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, &physicalDeviceUniformBufferStandardLayoutFeaturesKHR}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physicalDeviceVertexAttributeDivisorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, &physicalDeviceVariablePointersFeaturesKHR}; + p->pNext = static_cast(static_cast(&physicalDeviceVertexAttributeDivisorFeaturesEXT)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceDepthStencilResolvePropertiesKHR physicalDeviceDepthStencilResolvePropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR, nullptr}; + VkPhysicalDeviceDescriptorIndexingPropertiesEXT physicalDeviceDescriptorIndexingPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, &physicalDeviceDepthStencilResolvePropertiesKHR}; + VkPhysicalDeviceInlineUniformBlockPropertiesEXT physicalDeviceInlineUniformBlockPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, &physicalDeviceDescriptorIndexingPropertiesEXT}; + VkPhysicalDeviceMaintenance3PropertiesKHR physicalDeviceMaintenance3PropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR, &physicalDeviceInlineUniformBlockPropertiesEXT}; + VkPhysicalDeviceMultiviewPropertiesKHR physicalDeviceMultiviewPropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR, &physicalDeviceMaintenance3PropertiesKHR}; + VkPhysicalDeviceRobustness2PropertiesEXT physicalDeviceRobustness2PropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, &physicalDeviceMultiviewPropertiesKHR}; + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT physicalDeviceSubgroupSizeControlPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, &physicalDeviceRobustness2PropertiesEXT}; + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT physicalDeviceTexelBufferAlignmentPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, &physicalDeviceSubgroupSizeControlPropertiesEXT}; + VkPhysicalDeviceTimelineSemaphorePropertiesKHR physicalDeviceTimelineSemaphorePropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR, &physicalDeviceTexelBufferAlignmentPropertiesEXT}; + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT physicalDeviceVertexAttributeDivisorPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, &physicalDeviceTimelineSemaphorePropertiesKHR}; + p->pNext = static_cast(static_cast(&physicalDeviceVertexAttributeDivisorPropertiesEXT)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, - { - VK_FORMAT_R8_UINT, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } +}; +} // namespace VP_LUNARG_desktop_baseline_2022_block +} // namespace blocks +} // namespace VP_LUNARG_DESKTOP_BASELINE_2022 +#endif // VP_LUNARG_desktop_baseline_2022 + +#ifdef VP_LUNARG_desktop_baseline_2023 +namespace VP_LUNARG_DESKTOP_BASELINE_2023 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, +}; + +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, +}; + +static const VkStructureType formatStructTypes[] = { + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, +}; + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEVICE_GROUP_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_MAINTENANCE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_3_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MULTIVIEW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_SPIRV_1_4_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 70}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.dualSrcBlend = VK_TRUE; + s->features.fillModeNonSolid = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.inheritedQueries = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.multiViewport = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderClipDistance = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + s->features.shaderTessellationAndGeometryPointSize = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.tessellationShader = VK_TRUE; + s->features.textureCompressionBC = VK_TRUE; + s->features.vertexPipelineStoresAndAtomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: + { + VkPhysicalDeviceImageRobustnessFeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *s = static_cast(static_cast(p)); + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *s = static_cast(static_cast(p)); + s->texelBufferAlignment = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + s->vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + s->protectedMemory = VK_FALSE; + s->shaderDrawParameters = VK_TRUE; + s->storageBuffer16BitAccess = VK_TRUE; + s->uniformAndStorageBuffer16BitAccess = VK_TRUE; + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderInt8 = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->storageBuffer8BitAccess = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformAndStorageBuffer8BitAccess = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.dualSrcBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fillModeNonSolid == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.inheritedQueries == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiViewport == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderClipDistance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderTessellationAndGeometryPointSize == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.tessellationShader == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionBC == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.vertexPipelineStoresAndAtomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: + { + VkPhysicalDeviceImageRobustnessFeaturesEXT *prettify_VkPhysicalDeviceImageRobustnessFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceImageRobustnessFeaturesEXT->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceImageRobustnessFeaturesEXT->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceImageRobustnessFeaturesEXT::robustImageAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::inlineUniformBlock == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *prettify_VkPhysicalDeviceRobustness2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateDivisor == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateZeroDivisor == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::protectedMemory == VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::shaderDrawParameters == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::uniformAndStorageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointersStorageBuffer == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; }, - { - VK_FORMAT_R8_UNORM, - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); - s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: { - VkFormatProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - ret = ret && (vpCheckFlags(s->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceImageRobustnessFeaturesEXT physicalDeviceImageRobustnessFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceInlineUniformBlockFeaturesEXT physicalDeviceInlineUniformBlockFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, &physicalDeviceImageRobustnessFeaturesEXT}; + VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &physicalDeviceInlineUniformBlockFeaturesEXT}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, &physicalDeviceRobustness2FeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physicalDeviceVertexAttributeDivisorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, &physicalDeviceTexelBufferAlignmentFeaturesEXT}; + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesEXT}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, }; +namespace blocks +{ +namespace VP_LUNARG_desktop_baseline_2023_block +{ + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEVICE_GROUP_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_MAINTENANCE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_3_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MULTIVIEW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_SPIRV_1_4_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 70}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.dualSrcBlend = VK_TRUE; + s->features.fillModeNonSolid = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.inheritedQueries = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.multiViewport = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderClipDistance = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + s->features.shaderTessellationAndGeometryPointSize = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.tessellationShader = VK_TRUE; + s->features.textureCompressionBC = VK_TRUE; + s->features.vertexPipelineStoresAndAtomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: + { + VkPhysicalDeviceImageRobustnessFeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *s = static_cast(static_cast(p)); + s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *s = static_cast(static_cast(p)); + s->texelBufferAlignment = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + s->vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + s->protectedMemory = VK_FALSE; + s->shaderDrawParameters = VK_TRUE; + s->storageBuffer16BitAccess = VK_TRUE; + s->uniformAndStorageBuffer16BitAccess = VK_TRUE; + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderInt8 = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->storageBuffer8BitAccess = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformAndStorageBuffer8BitAccess = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.dualSrcBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fillModeNonSolid == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.inheritedQueries == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiViewport == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderClipDistance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderTessellationAndGeometryPointSize == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.tessellationShader == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionBC == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.vertexPipelineStoresAndAtomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: + { + VkPhysicalDeviceImageRobustnessFeaturesEXT *prettify_VkPhysicalDeviceImageRobustnessFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceImageRobustnessFeaturesEXT->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceImageRobustnessFeaturesEXT->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceImageRobustnessFeaturesEXT::robustImageAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: + { + VkPhysicalDeviceInlineUniformBlockFeaturesEXT *prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockFeaturesEXT->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceInlineUniformBlockFeaturesEXT::inlineUniformBlock == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *prettify_VkPhysicalDeviceRobustness2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateDivisor == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateZeroDivisor == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::protectedMemory == VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::shaderDrawParameters == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::uniformAndStorageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointersStorageBuffer == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 65536; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 1.0f; + s->properties.limits.lineWidthRange[0] = 1; + s->properties.limits.lineWidthRange[1] = 1; + s->properties.limits.maxBoundDescriptorSets = 8; + s->properties.limits.maxClipDistances = 8; + s->properties.limits.maxColorAttachments = 8; + s->properties.limits.maxCombinedClipAndCullDistances = 8; + s->properties.limits.maxComputeSharedMemorySize = 32768; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 1024; + s->properties.limits.maxComputeWorkGroupSize[0] = 1024; + s->properties.limits.maxComputeWorkGroupSize[1] = 1024; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 7; + s->properties.limits.maxDescriptorSetSampledImages = 640; + s->properties.limits.maxDescriptorSetSamplers = 80; + s->properties.limits.maxDescriptorSetStorageBuffers = 155; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 8; + s->properties.limits.maxDescriptorSetStorageImages = 40; + s->properties.limits.maxDescriptorSetUniformBuffers = 90; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 4294967295; + s->properties.limits.maxDrawIndirectCount = 1073741824; + s->properties.limits.maxFragmentCombinedOutputResources = 8; + s->properties.limits.maxFragmentDualSrcAttachments = 1; + s->properties.limits.maxFragmentInputComponents = 116; + s->properties.limits.maxFragmentOutputAttachments = 8; + s->properties.limits.maxFramebufferHeight = 16384; + s->properties.limits.maxFramebufferLayers = 1024; + s->properties.limits.maxFramebufferWidth = 16384; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 2048; + s->properties.limits.maxImageDimension1D = 16384; + s->properties.limits.maxImageDimension2D = 16384; + s->properties.limits.maxImageDimension3D = 2048; + s->properties.limits.maxImageDimensionCube = 16384; + s->properties.limits.maxInterpolationOffset = 0.4375f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 7; + s->properties.limits.maxPerStageDescriptorSampledImages = 128; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 31; + s->properties.limits.maxPerStageDescriptorStorageImages = 8; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; + s->properties.limits.maxPerStageResources = 159; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 16; + s->properties.limits.maxSamplerLodBias = 4; + s->properties.limits.maxStorageBufferRange = 1073741820; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 120; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 124; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 124; + s->properties.limits.maxTessellationControlTotalOutputComponents = 2048; + s->properties.limits.maxTessellationEvaluationInputComponents = 124; + s->properties.limits.maxTessellationEvaluationOutputComponents = 124; + s->properties.limits.maxTessellationGenerationLevel = 64; + s->properties.limits.maxTessellationPatchSize = 32; + s->properties.limits.maxTexelBufferElements = 67108864; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 65536; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 28; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 28; + s->properties.limits.maxVertexOutputComponents = 124; + s->properties.limits.maxViewportDimensions[0] = 16384; + s->properties.limits.maxViewportDimensions[1] = 16384; + s->properties.limits.maxViewports = 16; + s->properties.limits.minInterpolationOffset = -0.5f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 64; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 256; + s->properties.limits.optimalBufferCopyOffsetAlignment = 256; + s->properties.limits.optimalBufferCopyRowPitchAlignment = 128; + s->properties.limits.pointSizeGranularity = 1; + s->properties.limits.pointSizeRange[0] = 1; + s->properties.limits.pointSizeRange[1] = 64; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.strictLines = VK_FALSE; + s->properties.limits.subPixelInterpolationOffsetBits = 4; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.timestampComputeAndGraphics = VK_TRUE; + s->properties.limits.viewportBoundsRange[0] = -32768; + s->properties.limits.viewportBoundsRange[1] = 32767; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyAlignedMipSize = VK_TRUE; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->maxMemoryAllocationSize = 1610612736; + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + s->maxPerSetDescriptors = 700; + s->subgroupQuadOperationsInAllStages = VK_FALSE; + s->subgroupSize = 1; + s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); + s->subgroupSupportedStages |= (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->filterMinmaxImageComponentMapping = VK_FALSE; + s->filterMinmaxSingleComponentFormats = VK_FALSE; + s->framebufferIntegerColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->independentResolve = VK_TRUE; + s->independentResolveNone = VK_TRUE; + s->maxDescriptorSetUpdateAfterBindInputAttachments = 256; + s->maxDescriptorSetUpdateAfterBindSampledImages = 640; + s->maxDescriptorSetUpdateAfterBindSamplers = 80; + s->maxDescriptorSetUpdateAfterBindStorageBuffers = 155; + s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 8; + s->maxDescriptorSetUpdateAfterBindStorageImages = 40; + s->maxDescriptorSetUpdateAfterBindUniformBuffers = 90; + s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 8; + s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 64; + s->maxPerStageDescriptorUpdateAfterBindSampledImages = 128; + s->maxPerStageDescriptorUpdateAfterBindSamplers = 16; + s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 31; + s->maxPerStageDescriptorUpdateAfterBindStorageImages = 8; + s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 15; + s->maxPerStageUpdateAfterBindResources = 159; + s->maxTimelineSemaphoreValueDifference = 0; + s->maxUpdateAfterBindDescriptorsInAllPools = 1048576; + s->quadDivergentImplicitLod = VK_FALSE; + s->robustBufferAccessUpdateAfterBind = VK_FALSE; + s->shaderDenormFlushToZeroFloat16 = VK_FALSE; + s->shaderDenormFlushToZeroFloat32 = VK_FALSE; + s->shaderDenormFlushToZeroFloat64 = VK_FALSE; + s->shaderDenormPreserveFloat16 = VK_FALSE; + s->shaderDenormPreserveFloat32 = VK_FALSE; + s->shaderDenormPreserveFloat64 = VK_FALSE; + s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; + s->shaderRoundingModeRTEFloat16 = VK_FALSE; + s->shaderRoundingModeRTEFloat32 = VK_FALSE; + s->shaderRoundingModeRTEFloat64 = VK_FALSE; + s->shaderRoundingModeRTZFloat16 = VK_FALSE; + s->shaderRoundingModeRTZFloat32 = VK_FALSE; + s->shaderRoundingModeRTZFloat64 = VK_FALSE; + s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat16 = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat64 = VK_FALSE; + s->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE; + s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE; + s->supportedDepthResolveModes |= (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); + s->supportedStencilResolveModes |= (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 65536"); + ret = ret && ((65536 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((65536 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (65536 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 32768); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 32768), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 32768"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 640); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 640), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 640"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 80); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 80), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 80"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 40); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 40), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 40"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 90), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 90"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 4294967295"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 116); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 116), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 116"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.4375"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 31), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 31"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 159); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 159), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 159"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 1073741820); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 1073741820), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 1073741820"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 120); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 120), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 120"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 32), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 32"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 67108864); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 67108864), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 67108864"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 28); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 28), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 28"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 28); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 28), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 28"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= -0.5"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.optimalBufferCopyOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment <= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment <= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.optimalBufferCopyRowPitchAlignment <= 128"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1"); + ret = ret && (isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 64"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.strictLines >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.strictLines >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.strictLines >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.timestampComputeAndGraphics >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -32768); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -32768), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -32768"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 32767); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 32767), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 32767"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyAlignedMipSize <= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyAlignedMipSize <= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyAlignedMipSize <= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 1610612736); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 1610612736), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMemoryAllocationSize >= 1610612736"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewViewCount >= 6"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 700); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 700), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxPerSetDescriptors >= 700"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupQuadOperationsInAllStages >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupQuadOperationsInAllStages >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupQuadOperationsInAllStages >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 1), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSize >= 1"); + ret = ret && ((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedStages contains (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT)"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxImageComponentMapping >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxSingleComponentFormats >= VK_FALSE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::framebufferIntegerColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolve >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolveNone >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 256), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindInputAttachments >= 256"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 640); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 640), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSampledImages >= 640"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 80); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 80), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSamplers >= 80"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 40); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 40), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageImages >= 40"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 90); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 90), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffers >= 90"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageImages >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 159); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 159), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageUpdateAfterBindResources >= 159"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxTimelineSemaphoreValueDifference >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 1048576); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 1048576), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxUpdateAfterBindDescriptorsInAllPools >= 1048576"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::quadDivergentImplicitLod >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::robustBufferAccessUpdateAfterBind >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedDepthResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedDepthResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::supportedDepthResolveModes contains (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedStencilResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedStencilResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::supportedStencilResolveModes contains (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpFormatDesc formatDesc[] = { + {VK_FORMAT_A2B10G10R10_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2R10G10B10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SRGB_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SSCALED_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SSCALED_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_USCALED_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_USCALED_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B10G11R11_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGBA_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGBA_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGB_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGB_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGB_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGB_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC2_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC2_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC2_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC2_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC3_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC3_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC3_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC3_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC4_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC4_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC5_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC5_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC6H_SFLOAT_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC6H_SFLOAT_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC6H_UFLOAT_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC6H_UFLOAT_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC7_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC7_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC7_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC7_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT_S8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT_S8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, +}; + static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, &physicalDeviceMultiviewFeatures }; - VkPhysicalDeviceShaderDrawParametersFeatures physicalDeviceShaderDrawParametersFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, &physicalDeviceSamplerYcbcrConversionFeatures }; - VkPhysicalDeviceVariablePointersFeatures physicalDeviceVariablePointersFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, &physicalDeviceShaderDrawParametersFeatures }; - p->pNext = static_cast(static_cast(&physicalDeviceVariablePointersFeatures)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceMultiviewProperties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkFormatProperties3KHR formatProperties3KHR{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr }; - p->pNext = static_cast(static_cast(&formatProperties3KHR)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceImageRobustnessFeaturesEXT physicalDeviceImageRobustnessFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceInlineUniformBlockFeaturesEXT physicalDeviceInlineUniformBlockFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, &physicalDeviceImageRobustnessFeaturesEXT}; + VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &physicalDeviceInlineUniformBlockFeaturesEXT}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, &physicalDeviceRobustness2FeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physicalDeviceVertexAttributeDivisorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, &physicalDeviceTexelBufferAlignmentFeaturesEXT}; + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesEXT}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, }; -} //namespace baseline -} // namespace VP_ANDROID_BASELINE_2022 -#endif // VP_ANDROID_baseline_2022 +} // namespace VP_LUNARG_desktop_baseline_2023_block +} // namespace blocks +} // namespace VP_LUNARG_DESKTOP_BASELINE_2023 +#endif // VP_LUNARG_desktop_baseline_2023 -#ifdef VP_KHR_roadmap_2022 -namespace VP_KHR_ROADMAP_2022 { +#ifdef VP_LUNARG_desktop_baseline_2024 +namespace VP_LUNARG_DESKTOP_BASELINE_2024 +{ static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, }; static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, +}; + +static const VkStructureType formatStructTypes[] = { + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, }; static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1 }, + VkExtensionProperties{VK_EXT_4444_FORMATS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PRIVATE_DATA_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEVICE_GROUP_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_MAINTENANCE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_3_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MULTIVIEW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SPIRV_1_4_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 70}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, }; static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.depthClamp = VK_TRUE; - s->features.drawIndirectFirstInstance = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.occlusionQueryPrecise = VK_TRUE; - s->features.robustBufferAccess = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.samplerAnisotropy = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageExtendedFormats = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - s->samplerYcbcrConversion = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->bufferDeviceAddress = VK_TRUE; - s->descriptorBindingPartiallyBound = VK_TRUE; - s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; - s->descriptorBindingVariableDescriptorCount = VK_TRUE; - s->descriptorIndexing = VK_TRUE; - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->runtimeDescriptorArray = VK_TRUE; - s->samplerMirrorClampToEdge = VK_TRUE; - s->scalarBlockLayout = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; - s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; - s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - s->vulkanMemoryModel = VK_TRUE; - s->vulkanMemoryModelDeviceScope = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - s->computeFullSubgroups = VK_TRUE; - s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; - s->dynamicRendering = VK_TRUE; - s->inlineUniformBlock = VK_TRUE; - s->maintenance4 = VK_TRUE; - s->pipelineCreationCacheControl = VK_TRUE; - s->robustImageAccess = VK_TRUE; - s->shaderDemoteToHelperInvocation = VK_TRUE; - s->shaderIntegerDotProduct = VK_TRUE; - s->shaderTerminateInvocation = VK_TRUE; - s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; - s->subgroupSizeControl = VK_TRUE; - s->synchronization2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.depthClamp == VK_TRUE); - ret = ret && (s->features.drawIndirectFirstInstance == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.occlusionQueryPrecise == VK_TRUE); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.samplerAnisotropy == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageExtendedFormats == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - ret = ret && (s->samplerYcbcrConversion == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->bufferDeviceAddress == VK_TRUE); - ret = ret && (s->descriptorBindingPartiallyBound == VK_TRUE); - ret = ret && (s->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); - ret = ret && (s->descriptorBindingVariableDescriptorCount == VK_TRUE); - ret = ret && (s->descriptorIndexing == VK_TRUE); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->runtimeDescriptorArray == VK_TRUE); - ret = ret && (s->samplerMirrorClampToEdge == VK_TRUE); - ret = ret && (s->scalarBlockLayout == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - ret = ret && (s->vulkanMemoryModel == VK_TRUE); - ret = ret && (s->vulkanMemoryModelDeviceScope == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - ret = ret && (s->computeFullSubgroups == VK_TRUE); - ret = ret && (s->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); - ret = ret && (s->dynamicRendering == VK_TRUE); - ret = ret && (s->inlineUniformBlock == VK_TRUE); - ret = ret && (s->maintenance4 == VK_TRUE); - ret = ret && (s->pipelineCreationCacheControl == VK_TRUE); - ret = ret && (s->robustImageAccess == VK_TRUE); - ret = ret && (s->shaderDemoteToHelperInvocation == VK_TRUE); - ret = ret && (s->shaderIntegerDotProduct == VK_TRUE); - ret = ret && (s->shaderTerminateInvocation == VK_TRUE); - ret = ret && (s->shaderZeroInitializeWorkgroupMemory == VK_TRUE); - ret = ret && (s->subgroupSizeControl == VK_TRUE); - ret = ret && (s->synchronization2 == VK_TRUE); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: + { + VkPhysicalDevice4444FormatsFeaturesEXT *s = static_cast(static_cast(p)); + s->formatA4R4G4B4 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *s = static_cast(static_cast(p)); + s->extendedDynamicState2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *s = static_cast(static_cast(p)); + s->extendedDynamicState = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.dualSrcBlend = VK_TRUE; + s->features.fillModeNonSolid = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.inheritedQueries = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.multiViewport = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderClipDistance = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + s->features.shaderTessellationAndGeometryPointSize = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.tessellationShader = VK_TRUE; + s->features.textureCompressionBC = VK_TRUE; + s->features.vertexPipelineStoresAndAtomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: + { + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *s = static_cast(static_cast(p)); + s->shaderBufferFloat32Atomics = VK_TRUE; + s->shaderSharedFloat32Atomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *s = static_cast(static_cast(p)); + s->texelBufferAlignment = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + s->vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + s->protectedMemory = VK_FALSE; + s->shaderDrawParameters = VK_TRUE; + s->storageBuffer16BitAccess = VK_TRUE; + s->uniformAndStorageBuffer16BitAccess = VK_TRUE; + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->scalarBlockLayout = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderInt8 = VK_TRUE; + s->shaderOutputLayer = VK_TRUE; + s->shaderOutputViewportIndex = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->storageBuffer8BitAccess = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformAndStorageBuffer8BitAccess = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: + { + VkPhysicalDevice4444FormatsFeaturesEXT *prettify_VkPhysicalDevice4444FormatsFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice4444FormatsFeaturesEXT->formatA4R4G4B4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice4444FormatsFeaturesEXT->formatA4R4G4B4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice4444FormatsFeaturesEXT::formatA4R4G4B4 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *prettify_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT->extendedDynamicState2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT->extendedDynamicState2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *prettify_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT->extendedDynamicState == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT->extendedDynamicState == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::extendedDynamicState == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.dualSrcBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fillModeNonSolid == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.inheritedQueries == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiViewport == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderClipDistance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderTessellationAndGeometryPointSize == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.tessellationShader == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionBC == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.vertexPipelineStoresAndAtomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *prettify_VkPhysicalDeviceRobustness2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: + { + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderBufferFloat32Atomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderBufferFloat32Atomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32Atomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderSharedFloat32Atomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderSharedFloat32Atomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat32Atomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateDivisor == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateZeroDivisor == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::protectedMemory == VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::shaderDrawParameters == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::uniformAndStorageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointersStorageBuffer == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::scalarBlockLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderOutputLayer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderOutputLayer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderOutputLayer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderOutputViewportIndex == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderOutputViewportIndex == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDevice4444FormatsFeaturesEXT physicalDevice4444FormatsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT physicalDeviceExtendedDynamicState2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, &physicalDevice4444FormatsFeaturesEXT}; + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT physicalDeviceExtendedDynamicStateFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, &physicalDeviceExtendedDynamicState2FeaturesEXT}; + VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &physicalDeviceExtendedDynamicStateFeaturesEXT}; + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT physicalDeviceShaderAtomicFloatFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, &physicalDeviceRobustness2FeaturesEXT}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, &physicalDeviceShaderAtomicFloatFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physicalDeviceVertexAttributeDivisorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, &physicalDeviceTexelBufferAlignmentFeaturesEXT}; + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesEXT}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceExternalMemoryHostPropertiesEXT physicalDeviceExternalMemoryHostPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, nullptr}; + VkPhysicalDeviceFloatControlsPropertiesKHR physicalDeviceFloatControlsPropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR, &physicalDeviceExternalMemoryHostPropertiesEXT}; + VkPhysicalDeviceInlineUniformBlockPropertiesEXT physicalDeviceInlineUniformBlockPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, &physicalDeviceFloatControlsPropertiesKHR}; + VkPhysicalDevicePushDescriptorPropertiesKHR physicalDevicePushDescriptorPropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, &physicalDeviceInlineUniformBlockPropertiesEXT}; + VkPhysicalDeviceRobustness2PropertiesEXT physicalDeviceRobustness2PropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, &physicalDevicePushDescriptorPropertiesKHR}; + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT physicalDeviceSubgroupSizeControlPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, &physicalDeviceRobustness2PropertiesEXT}; + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT physicalDeviceTexelBufferAlignmentPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, &physicalDeviceSubgroupSizeControlPropertiesEXT}; + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT physicalDeviceVertexAttributeDivisorPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, &physicalDeviceTexelBufferAlignmentPropertiesEXT}; + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceVertexAttributeDivisorPropertiesEXT}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); + }, +}; + +namespace blocks +{ +namespace VP_LUNARG_desktop_baseline_2024_block +{ + +static const VkExtensionProperties deviceExtensions[] = { + VkExtensionProperties{VK_EXT_4444_FORMATS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_PRIVATE_DATA_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_16BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DEVICE_GROUP_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_1_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_MAINTENANCE_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MAINTENANCE_3_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_MULTIVIEW_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, 3}, + VkExtensionProperties{VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, 4}, + VkExtensionProperties{VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SPIRV_1_4_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_EXTENSION_NAME, 70}, + VkExtensionProperties{VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, 2}, + VkExtensionProperties{VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, 1}, + VkExtensionProperties{VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, 1}, }; +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: + { + VkPhysicalDevice4444FormatsFeaturesEXT *s = static_cast(static_cast(p)); + s->formatA4R4G4B4 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *s = static_cast(static_cast(p)); + s->extendedDynamicState2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *s = static_cast(static_cast(p)); + s->extendedDynamicState = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.depthBiasClamp = VK_TRUE; + s->features.depthClamp = VK_TRUE; + s->features.drawIndirectFirstInstance = VK_TRUE; + s->features.dualSrcBlend = VK_TRUE; + s->features.fillModeNonSolid = VK_TRUE; + s->features.fragmentStoresAndAtomics = VK_TRUE; + s->features.fullDrawIndexUint32 = VK_TRUE; + s->features.imageCubeArray = VK_TRUE; + s->features.independentBlend = VK_TRUE; + s->features.inheritedQueries = VK_TRUE; + s->features.largePoints = VK_TRUE; + s->features.multiDrawIndirect = VK_TRUE; + s->features.multiViewport = VK_TRUE; + s->features.occlusionQueryPrecise = VK_TRUE; + s->features.robustBufferAccess = VK_TRUE; + s->features.sampleRateShading = VK_TRUE; + s->features.samplerAnisotropy = VK_TRUE; + s->features.shaderClipDistance = VK_TRUE; + s->features.shaderImageGatherExtended = VK_TRUE; + s->features.shaderInt16 = VK_TRUE; + s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; + s->features.shaderStorageImageExtendedFormats = VK_TRUE; + s->features.shaderStorageImageWriteWithoutFormat = VK_TRUE; + s->features.shaderTessellationAndGeometryPointSize = VK_TRUE; + s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; + s->features.tessellationShader = VK_TRUE; + s->features.textureCompressionBC = VK_TRUE; + s->features.vertexPipelineStoresAndAtomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *s = static_cast(static_cast(p)); + s->robustImageAccess2 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: + { + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *s = static_cast(static_cast(p)); + s->shaderBufferFloat32Atomics = VK_TRUE; + s->shaderSharedFloat32Atomics = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *s = static_cast(static_cast(p)); + s->texelBufferAlignment = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *s = static_cast(static_cast(p)); + s->vertexAttributeInstanceRateDivisor = VK_TRUE; + s->vertexAttributeInstanceRateZeroDivisor = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + s->protectedMemory = VK_FALSE; + s->shaderDrawParameters = VK_TRUE; + s->storageBuffer16BitAccess = VK_TRUE; + s->uniformAndStorageBuffer16BitAccess = VK_TRUE; + s->variablePointers = VK_TRUE; + s->variablePointersStorageBuffer = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->descriptorBindingPartiallyBound = VK_TRUE; + s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; + s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; + s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; + s->descriptorBindingVariableDescriptorCount = VK_TRUE; + s->descriptorIndexing = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->runtimeDescriptorArray = VK_TRUE; + s->samplerMirrorClampToEdge = VK_TRUE; + s->scalarBlockLayout = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderInt8 = VK_TRUE; + s->shaderOutputLayer = VK_TRUE; + s->shaderOutputViewportIndex = VK_TRUE; + s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; + s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; + s->storageBuffer8BitAccess = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformAndStorageBuffer8BitAccess = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: + { + VkPhysicalDevice4444FormatsFeaturesEXT *prettify_VkPhysicalDevice4444FormatsFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevice4444FormatsFeaturesEXT->formatA4R4G4B4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevice4444FormatsFeaturesEXT->formatA4R4G4B4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDevice4444FormatsFeaturesEXT::formatA4R4G4B4 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *prettify_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT->extendedDynamicState2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT->extendedDynamicState2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: + { + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *prettify_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT->extendedDynamicState == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT->extendedDynamicState == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::extendedDynamicState == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthBiasClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthBiasClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.depthClamp == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.depthClamp == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.drawIndirectFirstInstance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.drawIndirectFirstInstance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.dualSrcBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.dualSrcBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fillModeNonSolid == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fillModeNonSolid == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fragmentStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fragmentStoresAndAtomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.fullDrawIndexUint32 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.fullDrawIndexUint32 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.imageCubeArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.imageCubeArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.independentBlend == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.independentBlend == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.inheritedQueries == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.inheritedQueries == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.largePoints == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.largePoints == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiDrawIndirect == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiDrawIndirect == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.multiViewport == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.multiViewport == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.occlusionQueryPrecise == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.occlusionQueryPrecise == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.sampleRateShading == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.sampleRateShading == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.samplerAnisotropy == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.samplerAnisotropy == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderClipDistance == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderClipDistance == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderImageGatherExtended == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderImageGatherExtended == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderInt16 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderInt16 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderSampledImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageExtendedFormats == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageExtendedFormats == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderStorageImageWriteWithoutFormat == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderStorageImageWriteWithoutFormat == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderTessellationAndGeometryPointSize == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderTessellationAndGeometryPointSize == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.tessellationShader == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.tessellationShader == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.textureCompressionBC == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.textureCompressionBC == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.vertexPipelineStoresAndAtomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.vertexPipelineStoresAndAtomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: + { + VkPhysicalDeviceRobustness2FeaturesEXT *prettify_VkPhysicalDeviceRobustness2FeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2FeaturesEXT->robustImageAccess2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2 == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: + { + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderBufferFloat32Atomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderBufferFloat32Atomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32Atomics == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderSharedFloat32Atomics == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT->shaderSharedFloat32Atomics == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat32Atomics == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT->texelBufferAlignment == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateDivisor == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT->vertexAttributeInstanceRateZeroDivisor == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT::vertexAttributeInstanceRateZeroDivisor == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->protectedMemory == VK_FALSE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::protectedMemory == VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->shaderDrawParameters == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::shaderDrawParameters == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->storageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->uniformAndStorageBuffer16BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::uniformAndStorageBuffer16BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointers == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointers == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->variablePointersStorageBuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::variablePointersStorageBuffer == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingPartiallyBound == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingUpdateUnusedWhilePending == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorBindingVariableDescriptorCount == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->descriptorIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::descriptorIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->runtimeDescriptorArray == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->samplerMirrorClampToEdge == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->scalarBlockLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::scalarBlockLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderInt8 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderInt8 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderOutputLayer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderOutputLayer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderOutputLayer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderOutputViewportIndex == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderOutputViewportIndex == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSampledImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageImageArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->storageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformAndStorageBuffer8BitAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: + { + VkPhysicalDeviceExternalMemoryHostPropertiesEXT *s = static_cast(static_cast(p)); + s->minImportedHostPointerAlignment = 4096; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR: + { + VkPhysicalDeviceFloatControlsPropertiesKHR *s = static_cast(static_cast(p)); + s->shaderDenormFlushToZeroFloat16 = VK_FALSE; + s->shaderDenormFlushToZeroFloat32 = VK_FALSE; + s->shaderDenormFlushToZeroFloat64 = VK_FALSE; + s->shaderDenormPreserveFloat16 = VK_TRUE; + s->shaderDenormPreserveFloat32 = VK_FALSE; + s->shaderDenormPreserveFloat64 = VK_FALSE; + s->shaderRoundingModeRTEFloat16 = VK_TRUE; + s->shaderRoundingModeRTEFloat32 = VK_TRUE; + s->shaderRoundingModeRTEFloat64 = VK_TRUE; + s->shaderRoundingModeRTZFloat16 = VK_FALSE; + s->shaderRoundingModeRTZFloat32 = VK_TRUE; + s->shaderRoundingModeRTZFloat64 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat16 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat64 = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: + { + VkPhysicalDeviceInlineUniformBlockPropertiesEXT *s = static_cast(static_cast(p)); + s->maxDescriptorSetInlineUniformBlocks = 4; + s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = 4; + s->maxInlineUniformBlockSize = 256; + s->maxPerStageDescriptorInlineUniformBlocks = 4; + s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 1024; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 0.125f; + s->properties.limits.lineWidthRange[0] = 1; + s->properties.limits.lineWidthRange[1] = 1; + s->properties.limits.maxBoundDescriptorSets = 8; + s->properties.limits.maxClipDistances = 8; + s->properties.limits.maxColorAttachments = 8; + s->properties.limits.maxCombinedClipAndCullDistances = 8; + s->properties.limits.maxComputeSharedMemorySize = 32768; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 1024; + s->properties.limits.maxComputeWorkGroupSize[0] = 1024; + s->properties.limits.maxComputeWorkGroupSize[1] = 1024; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 7; + s->properties.limits.maxDescriptorSetSampledImages = 640; + s->properties.limits.maxDescriptorSetSamplers = 80; + s->properties.limits.maxDescriptorSetStorageBuffers = 155; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 8; + s->properties.limits.maxDescriptorSetStorageImages = 40; + s->properties.limits.maxDescriptorSetUniformBuffers = 155; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 4294967295; + s->properties.limits.maxDrawIndirectCount = 1073741824; + s->properties.limits.maxFragmentCombinedOutputResources = 16; + s->properties.limits.maxFragmentDualSrcAttachments = 1; + s->properties.limits.maxFragmentInputComponents = 116; + s->properties.limits.maxFragmentOutputAttachments = 8; + s->properties.limits.maxFramebufferHeight = 16384; + s->properties.limits.maxFramebufferLayers = 1024; + s->properties.limits.maxFramebufferWidth = 16384; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 2048; + s->properties.limits.maxImageDimension1D = 16384; + s->properties.limits.maxImageDimension2D = 16384; + s->properties.limits.maxImageDimension3D = 2048; + s->properties.limits.maxImageDimensionCube = 16384; + s->properties.limits.maxInterpolationOffset = 0.4375f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 7; + s->properties.limits.maxPerStageDescriptorSampledImages = 128; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 31; + s->properties.limits.maxPerStageDescriptorStorageImages = 8; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; + s->properties.limits.maxPerStageResources = 159; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 16; + s->properties.limits.maxSamplerLodBias = 4.0f; + s->properties.limits.maxStorageBufferRange = 1073741820; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 120; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 124; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 124; + s->properties.limits.maxTessellationControlTotalOutputComponents = 2048; + s->properties.limits.maxTessellationEvaluationInputComponents = 124; + s->properties.limits.maxTessellationEvaluationOutputComponents = 124; + s->properties.limits.maxTessellationGenerationLevel = 64; + s->properties.limits.maxTessellationPatchSize = 32; + s->properties.limits.maxTexelBufferElements = 67108864; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 65536; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 29; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 31; + s->properties.limits.maxVertexOutputComponents = 124; + s->properties.limits.maxViewportDimensions[0] = 16384; + s->properties.limits.maxViewportDimensions[1] = 16384; + s->properties.limits.maxViewports = 16; + s->properties.limits.minInterpolationOffset = -0.5f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 64; + s->properties.limits.minTexelBufferOffsetAlignment = 64; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 128; + s->properties.limits.optimalBufferCopyOffsetAlignment = 128; + s->properties.limits.optimalBufferCopyRowPitchAlignment = 128; + s->properties.limits.pointSizeGranularity = 1.0f; + s->properties.limits.pointSizeRange[0] = 1; + s->properties.limits.pointSizeRange[1] = 255.875f; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.standardSampleLocations = VK_TRUE; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.strictLines = VK_FALSE; + s->properties.limits.subPixelInterpolationOffsetBits = 4; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.timestampComputeAndGraphics = VK_TRUE; + s->properties.limits.viewportBoundsRange[0] = -32768; + s->properties.limits.viewportBoundsRange[1] = 32767; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyAlignedMipSize = VK_FALSE; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: + { + VkPhysicalDevicePushDescriptorPropertiesKHR *s = static_cast(static_cast(p)); + s->maxPushDescriptors = 32; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: + { + VkPhysicalDeviceRobustness2PropertiesEXT *s = static_cast(static_cast(p)); + s->robustStorageBufferAccessSizeAlignment = 4; + s->robustUniformBufferAccessSizeAlignment = 256; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: + { + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *s = static_cast(static_cast(p)); + s->maxComputeWorkgroupSubgroups = 32; + s->maxSubgroupSize = 32; + s->minSubgroupSize = 64; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *s = static_cast(static_cast(p)); + s->storageTexelBufferOffsetAlignmentBytes = 16; + s->uniformTexelBufferOffsetAlignmentBytes = 16; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *s = static_cast(static_cast(p)); + s->maxVertexAttribDivisor = 268435455; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->maxMemoryAllocationSize = 2147483648; + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + s->maxPerSetDescriptors = 1024; + s->subgroupQuadOperationsInAllStages = VK_TRUE; + s->subgroupSize = 32; + s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT); + s->subgroupSupportedStages |= (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->filterMinmaxImageComponentMapping = VK_FALSE; + s->filterMinmaxSingleComponentFormats = VK_FALSE; + s->framebufferIntegerColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->independentResolve = VK_TRUE; + s->independentResolveNone = VK_TRUE; + s->maxDescriptorSetUpdateAfterBindInputAttachments = 256; + s->maxDescriptorSetUpdateAfterBindSampledImages = 640; + s->maxDescriptorSetUpdateAfterBindSamplers = 80; + s->maxDescriptorSetUpdateAfterBindStorageBuffers = 155; + s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 8; + s->maxDescriptorSetUpdateAfterBindStorageImages = 40; + s->maxDescriptorSetUpdateAfterBindUniformBuffers = 155; + s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 8; + s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 64; + s->maxPerStageDescriptorUpdateAfterBindSampledImages = 128; + s->maxPerStageDescriptorUpdateAfterBindSamplers = 16; + s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 31; + s->maxPerStageDescriptorUpdateAfterBindStorageImages = 8; + s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 15; + s->maxPerStageUpdateAfterBindResources = 159; + s->maxTimelineSemaphoreValueDifference = 2147483647; + s->maxUpdateAfterBindDescriptorsInAllPools = 1048576; + s->quadDivergentImplicitLod = VK_FALSE; + s->robustBufferAccessUpdateAfterBind = VK_TRUE; + s->shaderDenormFlushToZeroFloat16 = VK_FALSE; + s->shaderDenormFlushToZeroFloat32 = VK_FALSE; + s->shaderDenormFlushToZeroFloat64 = VK_FALSE; + s->shaderDenormPreserveFloat16 = VK_FALSE; + s->shaderDenormPreserveFloat32 = VK_FALSE; + s->shaderDenormPreserveFloat64 = VK_FALSE; + s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; + s->shaderRoundingModeRTEFloat16 = VK_FALSE; + s->shaderRoundingModeRTEFloat32 = VK_FALSE; + s->shaderRoundingModeRTEFloat64 = VK_FALSE; + s->shaderRoundingModeRTZFloat16 = VK_FALSE; + s->shaderRoundingModeRTZFloat32 = VK_FALSE; + s->shaderRoundingModeRTZFloat64 = VK_FALSE; + s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat16 = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; + s->shaderSignedZeroInfNanPreserveFloat64 = VK_FALSE; + s->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE; + s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE; + s->supportedDepthResolveModes |= (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT); + s->supportedStencilResolveModes |= (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: + { + VkPhysicalDeviceExternalMemoryHostPropertiesEXT *prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment <= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment <= 4096), "Unsupported properties condition: VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment <= 4096"); + ret = ret && ((prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment & (prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment & (prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment & (prettify_VkPhysicalDeviceExternalMemoryHostPropertiesEXT->minImportedHostPointerAlignment - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR: + { + VkPhysicalDeviceFloatControlsPropertiesKHR *prettify_VkPhysicalDeviceFloatControlsPropertiesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormFlushToZeroFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormFlushToZeroFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderDenormFlushToZeroFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormFlushToZeroFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormFlushToZeroFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderDenormFlushToZeroFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormFlushToZeroFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormFlushToZeroFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderDenormFlushToZeroFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormPreserveFloat16 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormPreserveFloat16 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderDenormPreserveFloat16 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderDenormPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderDenormPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderDenormPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTEFloat16 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTEFloat16 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderRoundingModeRTEFloat16 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTEFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTEFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderRoundingModeRTEFloat32 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTEFloat64 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTEFloat64 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderRoundingModeRTEFloat64 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTZFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTZFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderRoundingModeRTZFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTZFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTZFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderRoundingModeRTZFloat32 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTZFloat64 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderRoundingModeRTZFloat64 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderRoundingModeRTZFloat64 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderSignedZeroInfNanPreserveFloat16 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderSignedZeroInfNanPreserveFloat64 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFloatControlsPropertiesKHR->shaderSignedZeroInfNanPreserveFloat64 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceFloatControlsPropertiesKHR::shaderSignedZeroInfNanPreserveFloat64 >= VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: + { + VkPhysicalDeviceInlineUniformBlockPropertiesEXT *prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxInlineUniformBlockSize >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxInlineUniformBlockSize >= 256), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxInlineUniformBlockSize >= 256"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceInlineUniformBlockPropertiesEXT->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 1024"); + ret = ret && ((1024 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((1024 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (1024 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 0.125); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 0.125), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 0.125"); + ret = ret && (isMultiple(0.125, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(0.125, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(0.125, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 32768); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 32768), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 32768"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 640); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 640), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 640"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 80); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 80), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 80"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 40); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 40), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 40"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 4294967295), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 4294967295"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 116); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 116), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 116"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 1024), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.4375), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.4375"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 31), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 31"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 159); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 159), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 159"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 4.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 4.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 4.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 1073741820); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 1073741820), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 1073741820"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 120); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 120), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 120"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 32), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 32"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 67108864); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 67108864), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 67108864"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 29); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 29), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 29"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 31), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 31"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 124); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 124), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 124"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= -0.5), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= -0.5"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 128"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment <= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment <= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.optimalBufferCopyOffsetAlignment <= 128"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment <= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment <= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.optimalBufferCopyRowPitchAlignment <= 128"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.optimalBufferCopyRowPitchAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 255.875); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 255.875), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 255.875"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.standardSampleLocations >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.standardSampleLocations >= VK_TRUE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.strictLines >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.strictLines >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.strictLines >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.timestampComputeAndGraphics >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.timestampComputeAndGraphics >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -32768); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -32768), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -32768"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 32767); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 32767), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 32767"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyAlignedMipSize <= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyAlignedMipSize <= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyAlignedMipSize <= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: + { + VkPhysicalDevicePushDescriptorPropertiesKHR *prettify_VkPhysicalDevicePushDescriptorPropertiesKHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDevicePushDescriptorPropertiesKHR->maxPushDescriptors >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDevicePushDescriptorPropertiesKHR->maxPushDescriptors >= 32), "Unsupported properties condition: VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors >= 32"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: + { + VkPhysicalDeviceRobustness2PropertiesEXT *prettify_VkPhysicalDeviceRobustness2PropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment <= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment <= 4), "Unsupported properties condition: VkPhysicalDeviceRobustness2PropertiesEXT::robustStorageBufferAccessSizeAlignment <= 4"); + ret = ret && ((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustStorageBufferAccessSizeAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceRobustness2PropertiesEXT::robustUniformBufferAccessSizeAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment & (prettify_VkPhysicalDeviceRobustness2PropertiesEXT->robustUniformBufferAccessSizeAlignment - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: + { + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxComputeWorkgroupSubgroups >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxComputeWorkgroupSubgroups >= 32), "Unsupported properties condition: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT::maxComputeWorkgroupSubgroups >= 32"); + ret = ret && (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize >= 32), "Unsupported properties condition: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT::maxSubgroupSize >= 32"); + ret = ret && ((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->maxSubgroupSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize <= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize <= 64), "Unsupported properties condition: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT::minSubgroupSize <= 64"); + ret = ret && ((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize & (prettify_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT->minSubgroupSize - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: + { + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes <= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes <= 16), "Unsupported properties condition: VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetAlignmentBytes <= 16"); + ret = ret && ((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->storageTexelBufferOffsetAlignmentBytes - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes <= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes <= 16), "Unsupported properties condition: VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetAlignmentBytes <= 16"); + ret = ret && ((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes & (prettify_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT->uniformTexelBufferOffsetAlignmentBytes - 1)) == 0"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: + { + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *prettify_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT->maxVertexAttribDivisor >= 268435455); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT->maxVertexAttribDivisor >= 268435455), "Unsupported properties condition: VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor >= 268435455"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 2147483648); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 2147483648), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMemoryAllocationSize >= 2147483648"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewViewCount >= 6"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 1024), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxPerSetDescriptors >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupQuadOperationsInAllStages >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupQuadOperationsInAllStages >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupQuadOperationsInAllStages >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 32); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 32), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSize >= 32"); + ret = ret && ((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedStages contains (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT)"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxImageComponentMapping >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxSingleComponentFormats >= VK_FALSE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::framebufferIntegerColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolve >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolveNone >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 256), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindInputAttachments >= 256"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 640); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 640), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSampledImages >= 640"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 80); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 80), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSamplers >= 80"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 40); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 40), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageImages >= 40"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 155); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 155), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffers >= 155"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindInputAttachments >= 64"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 128), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSampledImages >= 128"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 31"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 8), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageImages >= 8"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 15"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 159); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 159), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageUpdateAfterBindResources >= 159"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxTimelineSemaphoreValueDifference >= 2147483647"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 1048576); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 1048576), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxUpdateAfterBindDescriptorsInAllPools >= 1048576"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::quadDivergentImplicitLod >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::robustBufferAccessUpdateAfterBind >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat32 >= VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedDepthResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedDepthResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::supportedDepthResolveModes contains (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT | VK_RESOLVE_MODE_MIN_BIT | VK_RESOLVE_MODE_MAX_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedStencilResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->supportedStencilResolveModes, (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::supportedStencilResolveModes contains (VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpFormatDesc formatDesc[] = { + {VK_FORMAT_A1R5G5B5_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A1R5G5B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A1R5G5B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2B10G10R10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2B10G10R10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A2R10G10B10_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A2R10G10B10_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SRGB_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SRGB_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_SSCALED_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_SSCALED_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UINT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UINT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_UNORM_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_UNORM_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_A8B8G8R8_USCALED_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_A8B8G8R8_USCALED_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B10G11R11_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B10G11R11_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B4G4R4A4_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B4G4R4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B4G4R4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_B8G8R8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_B8G8R8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGBA_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGBA_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGB_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGB_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC1_RGB_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC1_RGB_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC2_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC2_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC2_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC2_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC3_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC3_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC3_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC3_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC4_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC4_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC4_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC4_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC5_SNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC5_SNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC5_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC5_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC6H_SFLOAT_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC6H_SFLOAT_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC6H_UFLOAT_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC6H_UFLOAT_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC7_SRGB_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC7_SRGB_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_BC7_UNORM_BLOCK, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_BC7_UNORM_BLOCK: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_D32_SFLOAT_S8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_D32_SFLOAT_S8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16A16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16A16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16B16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16B16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16G16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16G16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R16_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R16_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R16_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32A32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32A32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32B32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32B32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32G32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32G32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SFLOAT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SFLOAT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R32_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R32_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R4G4B4A4_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R4G4B4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R4G4B4A4_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R5G6B5_UNORM_PACK16, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R5G6B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R5G6B5_UNORM_PACK16: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SRGB, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SRGB: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8A8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8A8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8B8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8B8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8G8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8G8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_SNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_SSCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_SSCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UINT, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UINT: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_UNORM, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + s->formatProperties.linearTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + s->formatProperties.optimalTilingFeatures |= (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.linearTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.linearTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.optimalTilingFeatures, (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))), "Unsupported format condition for VK_FORMAT_R8_UNORM: VkFormatProperties2KHR::formatProperties.optimalTilingFeatures contains (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)"); + } + break; + default: + break; + } + return ret; + }}, + {VK_FORMAT_R8_USCALED, + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *s = static_cast(static_cast(p)); + s->formatProperties.bufferFeatures |= (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR: + { + VkFormatProperties2KHR *prettify_VkFormatProperties2KHR = static_cast(static_cast(p)); + ret = ret && (vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkFormatProperties2KHR->formatProperties.bufferFeatures, (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT))), "Unsupported format condition for VK_FORMAT_R8_USCALED: VkFormatProperties2KHR::formatProperties.bufferFeatures contains (VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)"); + } + break; + default: + break; + } + return ret; + }}, +}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDevice4444FormatsFeaturesEXT physicalDevice4444FormatsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT physicalDeviceExtendedDynamicState2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, &physicalDevice4444FormatsFeaturesEXT}; + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT physicalDeviceExtendedDynamicStateFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, &physicalDeviceExtendedDynamicState2FeaturesEXT}; + VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &physicalDeviceExtendedDynamicStateFeaturesEXT}; + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT physicalDeviceShaderAtomicFloatFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, &physicalDeviceRobustness2FeaturesEXT}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, &physicalDeviceShaderAtomicFloatFeaturesEXT}; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physicalDeviceVertexAttributeDivisorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, &physicalDeviceTexelBufferAlignmentFeaturesEXT}; + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, &physicalDeviceVertexAttributeDivisorFeaturesEXT}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceExternalMemoryHostPropertiesEXT physicalDeviceExternalMemoryHostPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, nullptr}; + VkPhysicalDeviceFloatControlsPropertiesKHR physicalDeviceFloatControlsPropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR, &physicalDeviceExternalMemoryHostPropertiesEXT}; + VkPhysicalDeviceInlineUniformBlockPropertiesEXT physicalDeviceInlineUniformBlockPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, &physicalDeviceFloatControlsPropertiesKHR}; + VkPhysicalDevicePushDescriptorPropertiesKHR physicalDevicePushDescriptorPropertiesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, &physicalDeviceInlineUniformBlockPropertiesEXT}; + VkPhysicalDeviceRobustness2PropertiesEXT physicalDeviceRobustness2PropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, &physicalDevicePushDescriptorPropertiesKHR}; + VkPhysicalDeviceSubgroupSizeControlPropertiesEXT physicalDeviceSubgroupSizeControlPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, &physicalDeviceRobustness2PropertiesEXT}; + VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT physicalDeviceTexelBufferAlignmentPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, &physicalDeviceSubgroupSizeControlPropertiesEXT}; + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT physicalDeviceVertexAttributeDivisorPropertiesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, &physicalDeviceTexelBufferAlignmentPropertiesEXT}; + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, &physicalDeviceVertexAttributeDivisorPropertiesEXT}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkFormatProperties3KHR formatProperties3KHR{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR, nullptr}; + p->pNext = static_cast(static_cast(&formatProperties3KHR)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; +} // namespace VP_LUNARG_desktop_baseline_2024_block +} // namespace blocks +} // namespace VP_LUNARG_DESKTOP_BASELINE_2024 +#endif // VP_LUNARG_desktop_baseline_2024 + +#ifdef VP_LUNARG_minimum_requirements_1_0 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, +}; + +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, +}; + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -namespace vulkan10requirements { +namespace blocks +{ +namespace vulkan10requirements +{ + static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 131072; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 1.0f; + s->properties.limits.lineWidthRange[0] = 1.0f; + s->properties.limits.lineWidthRange[1] = 1.0f; + s->properties.limits.maxBoundDescriptorSets = 4; + s->properties.limits.maxClipDistances = 0; + s->properties.limits.maxColorAttachments = 4; + s->properties.limits.maxCombinedClipAndCullDistances = 0; + s->properties.limits.maxComputeSharedMemorySize = 16384; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 128; + s->properties.limits.maxComputeWorkGroupSize[0] = 128; + s->properties.limits.maxComputeWorkGroupSize[1] = 128; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 4; + s->properties.limits.maxDescriptorSetSampledImages = 96; + s->properties.limits.maxDescriptorSetSamplers = 96; + s->properties.limits.maxDescriptorSetStorageBuffers = 24; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; + s->properties.limits.maxDescriptorSetStorageImages = 24; + s->properties.limits.maxDescriptorSetUniformBuffers = 72; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 16777216; + s->properties.limits.maxDrawIndirectCount = 1; + s->properties.limits.maxFragmentCombinedOutputResources = 4; + s->properties.limits.maxFragmentDualSrcAttachments = 0; + s->properties.limits.maxFragmentInputComponents = 64; + s->properties.limits.maxFragmentOutputAttachments = 4; + s->properties.limits.maxFramebufferHeight = 4096; + s->properties.limits.maxFramebufferLayers = 256; + s->properties.limits.maxFramebufferWidth = 4096; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 256; + s->properties.limits.maxImageDimension1D = 4096; + s->properties.limits.maxImageDimension2D = 4096; + s->properties.limits.maxImageDimension3D = 256; + s->properties.limits.maxImageDimensionCube = 4096; + s->properties.limits.maxInterpolationOffset = 0.0f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 4; + s->properties.limits.maxPerStageDescriptorSampledImages = 16; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; + s->properties.limits.maxPerStageDescriptorStorageImages = 4; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; + s->properties.limits.maxPerStageResources = 128; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 1; + s->properties.limits.maxSamplerLodBias = 2; + s->properties.limits.maxStorageBufferRange = 134217728; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; + s->properties.limits.maxTessellationControlTotalOutputComponents = 0; + s->properties.limits.maxTessellationEvaluationInputComponents = 0; + s->properties.limits.maxTessellationEvaluationOutputComponents = 0; + s->properties.limits.maxTessellationGenerationLevel = 0; + s->properties.limits.maxTessellationPatchSize = 0; + s->properties.limits.maxTexelBufferElements = 65536; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 16384; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 16; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 16; + s->properties.limits.maxVertexOutputComponents = 64; + s->properties.limits.maxViewportDimensions[0] = 4096; + s->properties.limits.maxViewportDimensions[1] = 4096; + s->properties.limits.maxViewports = 1; + s->properties.limits.minInterpolationOffset = 0.0f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 256; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 256; + s->properties.limits.pointSizeGranularity = 1.0f; + s->properties.limits.pointSizeRange[0] = 1.0f; + s->properties.limits.pointSizeRange[1] = 1.0f; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 0; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.viewportBoundsRange[0] = -8192; + s->properties.limits.viewportBoundsRange[1] = 8192; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 131072"); + ret = ret && ((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 72"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 16777216"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 2"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 134217728"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 1.0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + p->pNext = static_cast(static_cast(nullptr)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan10requirements -namespace vulkan10requirements_roadmap2022 { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.depthClamp = VK_TRUE; - s->features.drawIndirectFirstInstance = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.occlusionQueryPrecise = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.samplerAnisotropy = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageExtendedFormats = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.depthClamp == VK_TRUE); - ret = ret && (s->features.drawIndirectFirstInstance == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.occlusionQueryPrecise == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.samplerAnisotropy == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageExtendedFormats == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - } break; - default: break; - } - return ret; - } +} // namespace vulkan10requirements +} // namespace blocks +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 +#endif // VP_LUNARG_minimum_requirements_1_0 + +#ifdef VP_LUNARG_minimum_requirements_1_1 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, }; -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.bufferImageGranularity = 4096; - s->properties.limits.maxColorAttachments = 7; - s->properties.limits.maxComputeWorkGroupInvocations = 256; - s->properties.limits.maxComputeWorkGroupSize[0] = 256; - s->properties.limits.maxComputeWorkGroupSize[1] = 256; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxDescriptorSetSampledImages = 1800; - s->properties.limits.maxDescriptorSetSamplers = 576; - s->properties.limits.maxDescriptorSetStorageBuffers = 96; - s->properties.limits.maxDescriptorSetStorageImages = 144; - s->properties.limits.maxDescriptorSetUniformBuffers = 90; - s->properties.limits.maxFragmentCombinedOutputResources = 16; - s->properties.limits.maxImageArrayLayers = 2048; - s->properties.limits.maxImageDimension1D = 8192; - s->properties.limits.maxImageDimension2D = 8192; - s->properties.limits.maxImageDimensionCube = 8192; - s->properties.limits.maxPerStageDescriptorSampledImages = 200; - s->properties.limits.maxPerStageDescriptorSamplers = 64; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 30; - s->properties.limits.maxPerStageDescriptorStorageImages = 16; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 15; - s->properties.limits.maxPerStageResources = 200; - s->properties.limits.maxSamplerLodBias = 14; - s->properties.limits.maxUniformBufferRange = 65536; - s->properties.limits.mipmapPrecisionBits = 6; - s->properties.limits.standardSampleLocations = VK_TRUE; - s->properties.limits.subTexelPrecisionBits = 8; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.bufferImageGranularity <= 4096); - ret = ret && ((4096 % s->properties.limits.bufferImageGranularity) == 0); - ret = ret && (s->properties.limits.maxColorAttachments >= 7); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 256); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 256); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 256); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 1800); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 576); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 144); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 90); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 16); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 2048); - ret = ret && (s->properties.limits.maxImageDimension1D >= 8192); - ret = ret && (s->properties.limits.maxImageDimension2D >= 8192); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 8192); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 200); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 64); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 30); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 15); - ret = ret && (s->properties.limits.maxPerStageResources >= 200); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 14); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 65536); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 6); - ret = ret && (s->properties.limits.standardSampleLocations == VK_TRUE); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 8); - } break; - default: break; - } - return ret; - } +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, }; +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *prettify_VkPhysicalDeviceMultiviewFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceMultiviewFeatures::multiview == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceMultiviewFeatures)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceSubgroupProperties physicalDeviceSubgroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, nullptr}; + VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, &physicalDeviceSubgroupProperties}; + VkPhysicalDeviceMaintenance3Properties physicalDeviceMaintenance3Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, &physicalDeviceMultiviewProperties}; + p->pNext = static_cast(static_cast(&physicalDeviceMaintenance3Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan10requirements_roadmap2022 -namespace vulkan11requirements { + +namespace blocks +{ +namespace vulkan10requirements +{ + static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - s->maxMultiviewInstanceIndex = 134217727; - s->maxMultiviewViewCount = 6; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxMultiviewInstanceIndex >= 134217727); - ret = ret && (s->maxMultiviewViewCount >= 6); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 131072; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 1.0f; + s->properties.limits.lineWidthRange[0] = 1.0f; + s->properties.limits.lineWidthRange[1] = 1.0f; + s->properties.limits.maxBoundDescriptorSets = 4; + s->properties.limits.maxClipDistances = 0; + s->properties.limits.maxColorAttachments = 4; + s->properties.limits.maxCombinedClipAndCullDistances = 0; + s->properties.limits.maxComputeSharedMemorySize = 16384; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 128; + s->properties.limits.maxComputeWorkGroupSize[0] = 128; + s->properties.limits.maxComputeWorkGroupSize[1] = 128; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 4; + s->properties.limits.maxDescriptorSetSampledImages = 96; + s->properties.limits.maxDescriptorSetSamplers = 96; + s->properties.limits.maxDescriptorSetStorageBuffers = 24; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; + s->properties.limits.maxDescriptorSetStorageImages = 24; + s->properties.limits.maxDescriptorSetUniformBuffers = 72; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 16777216; + s->properties.limits.maxDrawIndirectCount = 1; + s->properties.limits.maxFragmentCombinedOutputResources = 4; + s->properties.limits.maxFragmentDualSrcAttachments = 0; + s->properties.limits.maxFragmentInputComponents = 64; + s->properties.limits.maxFragmentOutputAttachments = 4; + s->properties.limits.maxFramebufferHeight = 4096; + s->properties.limits.maxFramebufferLayers = 256; + s->properties.limits.maxFramebufferWidth = 4096; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 256; + s->properties.limits.maxImageDimension1D = 4096; + s->properties.limits.maxImageDimension2D = 4096; + s->properties.limits.maxImageDimension3D = 256; + s->properties.limits.maxImageDimensionCube = 4096; + s->properties.limits.maxInterpolationOffset = 0.0f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 4; + s->properties.limits.maxPerStageDescriptorSampledImages = 16; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; + s->properties.limits.maxPerStageDescriptorStorageImages = 4; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; + s->properties.limits.maxPerStageResources = 128; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 1; + s->properties.limits.maxSamplerLodBias = 2; + s->properties.limits.maxStorageBufferRange = 134217728; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; + s->properties.limits.maxTessellationControlTotalOutputComponents = 0; + s->properties.limits.maxTessellationEvaluationInputComponents = 0; + s->properties.limits.maxTessellationEvaluationOutputComponents = 0; + s->properties.limits.maxTessellationGenerationLevel = 0; + s->properties.limits.maxTessellationPatchSize = 0; + s->properties.limits.maxTexelBufferElements = 65536; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 16384; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 16; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 16; + s->properties.limits.maxVertexOutputComponents = 64; + s->properties.limits.maxViewportDimensions[0] = 4096; + s->properties.limits.maxViewportDimensions[1] = 4096; + s->properties.limits.maxViewports = 1; + s->properties.limits.minInterpolationOffset = 0.0f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 256; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 256; + s->properties.limits.pointSizeGranularity = 1.0f; + s->properties.limits.pointSizeRange[0] = 1.0f; + s->properties.limits.pointSizeRange[1] = 1.0f; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 0; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.viewportBoundsRange[0] = -8192; + s->properties.limits.viewportBoundsRange[1] = 8192; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 131072"); + ret = ret && ((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 72"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 16777216"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 2"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 134217728"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 1.0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceMultiviewFeatures)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceSubgroupProperties physicalDeviceSubgroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, nullptr}; + VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, &physicalDeviceSubgroupProperties}; + VkPhysicalDeviceMaintenance3Properties physicalDeviceMaintenance3Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, &physicalDeviceMultiviewProperties}; + p->pNext = static_cast(static_cast(&physicalDeviceMaintenance3Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan11requirements -namespace vulkan11requirements_roadmap2022 { +} // namespace vulkan10requirements +namespace vulkan11requirements_split +{ + static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->samplerYcbcrConversion = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->samplerYcbcrConversion == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + { + VkPhysicalDeviceMultiviewFeatures *prettify_VkPhysicalDeviceMultiviewFeatures = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewFeatures->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceMultiviewFeatures::multiview == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - s->subgroupSize = 4; - s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT); - s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - ret = ret && (s->subgroupSize >= 4); - ret = ret && ((s->subgroupSize & (s->subgroupSize - 1)) == 0); - ret = ret && (vpCheckFlags(s->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_VOTE_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT | VK_SUBGROUP_FEATURE_QUAD_BIT))); - ret = ret && (vpCheckFlags(s->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT))); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: + { + VkPhysicalDeviceSubgroupProperties *s = static_cast(static_cast(p)); + s->subgroupSize = 1; + s->supportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); + s->supportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: + { + VkPhysicalDeviceMultiviewProperties *s = static_cast(static_cast(p)); + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: + { + VkPhysicalDeviceMaintenance3Properties *s = static_cast(static_cast(p)); + s->maxMemoryAllocationSize = 1073741824; + s->maxPerSetDescriptors = 1024; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: + { + VkPhysicalDeviceSubgroupProperties *prettify_VkPhysicalDeviceSubgroupProperties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize >= 1), "Unsupported properties condition: VkPhysicalDeviceSubgroupProperties::subgroupSize >= 1"); + ret = ret && ((prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize & (prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize & (prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize & (prettify_VkPhysicalDeviceSubgroupProperties->subgroupSize - 1)) == 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceSubgroupProperties->supportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceSubgroupProperties->supportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))), "Unsupported properties condition: VkPhysicalDeviceSubgroupProperties::supportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceSubgroupProperties->supportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceSubgroupProperties->supportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))), "Unsupported properties condition: VkPhysicalDeviceSubgroupProperties::supportedStages contains (VK_SHADER_STAGE_COMPUTE_BIT)"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: + { + VkPhysicalDeviceMultiviewProperties *prettify_VkPhysicalDeviceMultiviewProperties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMultiviewProperties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceMultiviewProperties::maxMultiviewViewCount >= 6"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: + { + VkPhysicalDeviceMaintenance3Properties *prettify_VkPhysicalDeviceMaintenance3Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceMaintenance3Properties->maxMemoryAllocationSize >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMaintenance3Properties->maxMemoryAllocationSize >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceMaintenance3Properties::maxMemoryAllocationSize >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceMaintenance3Properties->maxPerSetDescriptors >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceMaintenance3Properties->maxPerSetDescriptors >= 1024), "Unsupported properties condition: VkPhysicalDeviceMaintenance3Properties::maxPerSetDescriptors >= 1024"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr}; + p->pNext = static_cast(static_cast(&physicalDeviceMultiviewFeatures)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceSubgroupProperties physicalDeviceSubgroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, nullptr}; + VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, &physicalDeviceSubgroupProperties}; + VkPhysicalDeviceMaintenance3Properties physicalDeviceMaintenance3Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, &physicalDeviceMultiviewProperties}; + p->pNext = static_cast(static_cast(&physicalDeviceMaintenance3Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan11requirements_roadmap2022 -namespace vulkan12requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - } break; - default: break; - } - return ret; - } +} // namespace vulkan11requirements_split +} // namespace blocks +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 +#endif // VP_LUNARG_minimum_requirements_1_1 + +#ifdef VP_LUNARG_minimum_requirements_1_2 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 +{ + +static const VkStructureType featureStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, }; -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - s->maxTimelineSemaphoreValueDifference = 2147483647; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxTimelineSemaphoreValueDifference >= 2147483647); - } break; - default: break; - } - return ret; - } +static const VkStructureType propertyStructTypes[] = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, }; +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan12requirements -namespace vulkan12requirements_roadmap2022 { + +namespace blocks +{ +namespace vulkan10requirements +{ + static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->descriptorBindingPartiallyBound = VK_TRUE; - s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; - s->descriptorBindingVariableDescriptorCount = VK_TRUE; - s->descriptorIndexing = VK_TRUE; - s->runtimeDescriptorArray = VK_TRUE; - s->samplerMirrorClampToEdge = VK_TRUE; - s->scalarBlockLayout = VK_TRUE; - s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; - s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; - s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->descriptorBindingPartiallyBound == VK_TRUE); - ret = ret && (s->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); - ret = ret && (s->descriptorBindingVariableDescriptorCount == VK_TRUE); - ret = ret && (s->descriptorIndexing == VK_TRUE); - ret = ret && (s->runtimeDescriptorArray == VK_TRUE); - ret = ret && (s->samplerMirrorClampToEdge == VK_TRUE); - ret = ret && (s->scalarBlockLayout == VK_TRUE); - ret = ret && (s->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - s->maxDescriptorSetUpdateAfterBindInputAttachments = 7; - s->maxDescriptorSetUpdateAfterBindSampledImages = 500000; - s->maxDescriptorSetUpdateAfterBindSamplers = 500000; - s->maxDescriptorSetUpdateAfterBindStorageBuffers = 500000; - s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 4; - s->maxDescriptorSetUpdateAfterBindStorageImages = 500000; - s->maxDescriptorSetUpdateAfterBindUniformBuffers = 72; - s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 8; - s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 7; - s->maxPerStageDescriptorUpdateAfterBindSampledImages = 500000; - s->maxPerStageDescriptorUpdateAfterBindSamplers = 500000; - s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 500000; - s->maxPerStageDescriptorUpdateAfterBindStorageImages = 500000; - s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 12; - s->maxPerStageUpdateAfterBindResources = 500000; - s->shaderSignedZeroInfNanPreserveFloat16 = VK_TRUE; - s->shaderSignedZeroInfNanPreserveFloat32 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxDescriptorSetUpdateAfterBindInputAttachments >= 7); - ret = ret && (s->maxDescriptorSetUpdateAfterBindSampledImages >= 500000); - ret = ret && (s->maxDescriptorSetUpdateAfterBindSamplers >= 500000); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageBuffers >= 500000); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 4); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageImages >= 500000); - ret = ret && (s->maxDescriptorSetUpdateAfterBindUniformBuffers >= 72); - ret = ret && (s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 8); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 7); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindSampledImages >= 500000); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindSamplers >= 500000); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 500000); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindStorageImages >= 500000); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 12); - ret = ret && (s->maxPerStageUpdateAfterBindResources >= 500000); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat16, VK_TRUE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat32, VK_TRUE)); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 131072; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 1.0f; + s->properties.limits.lineWidthRange[0] = 1.0f; + s->properties.limits.lineWidthRange[1] = 1.0f; + s->properties.limits.maxBoundDescriptorSets = 4; + s->properties.limits.maxClipDistances = 0; + s->properties.limits.maxColorAttachments = 4; + s->properties.limits.maxCombinedClipAndCullDistances = 0; + s->properties.limits.maxComputeSharedMemorySize = 16384; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 128; + s->properties.limits.maxComputeWorkGroupSize[0] = 128; + s->properties.limits.maxComputeWorkGroupSize[1] = 128; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 4; + s->properties.limits.maxDescriptorSetSampledImages = 96; + s->properties.limits.maxDescriptorSetSamplers = 96; + s->properties.limits.maxDescriptorSetStorageBuffers = 24; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; + s->properties.limits.maxDescriptorSetStorageImages = 24; + s->properties.limits.maxDescriptorSetUniformBuffers = 72; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 16777216; + s->properties.limits.maxDrawIndirectCount = 1; + s->properties.limits.maxFragmentCombinedOutputResources = 4; + s->properties.limits.maxFragmentDualSrcAttachments = 0; + s->properties.limits.maxFragmentInputComponents = 64; + s->properties.limits.maxFragmentOutputAttachments = 4; + s->properties.limits.maxFramebufferHeight = 4096; + s->properties.limits.maxFramebufferLayers = 256; + s->properties.limits.maxFramebufferWidth = 4096; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 256; + s->properties.limits.maxImageDimension1D = 4096; + s->properties.limits.maxImageDimension2D = 4096; + s->properties.limits.maxImageDimension3D = 256; + s->properties.limits.maxImageDimensionCube = 4096; + s->properties.limits.maxInterpolationOffset = 0.0f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 4; + s->properties.limits.maxPerStageDescriptorSampledImages = 16; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; + s->properties.limits.maxPerStageDescriptorStorageImages = 4; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; + s->properties.limits.maxPerStageResources = 128; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 1; + s->properties.limits.maxSamplerLodBias = 2; + s->properties.limits.maxStorageBufferRange = 134217728; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; + s->properties.limits.maxTessellationControlTotalOutputComponents = 0; + s->properties.limits.maxTessellationEvaluationInputComponents = 0; + s->properties.limits.maxTessellationEvaluationOutputComponents = 0; + s->properties.limits.maxTessellationGenerationLevel = 0; + s->properties.limits.maxTessellationPatchSize = 0; + s->properties.limits.maxTexelBufferElements = 65536; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 16384; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 16; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 16; + s->properties.limits.maxVertexOutputComponents = 64; + s->properties.limits.maxViewportDimensions[0] = 4096; + s->properties.limits.maxViewportDimensions[1] = 4096; + s->properties.limits.maxViewports = 1; + s->properties.limits.minInterpolationOffset = 0.0f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 256; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 256; + s->properties.limits.pointSizeGranularity = 1.0f; + s->properties.limits.pointSizeRange[0] = 1.0f; + s->properties.limits.pointSizeRange[1] = 1.0f; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 0; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.viewportBoundsRange[0] = -8192; + s->properties.limits.viewportBoundsRange[1] = 8192; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 131072"); + ret = ret && ((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 72"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 16777216"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 2"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 134217728"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 1.0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan12requirements_roadmap2022 -namespace vulkan13requirements { +} // namespace vulkan10requirements +namespace vulkan11requirements +{ + static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->bufferDeviceAddress = VK_TRUE; - s->vulkanMemoryModel = VK_TRUE; - s->vulkanMemoryModelDeviceScope = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - s->computeFullSubgroups = VK_TRUE; - s->dynamicRendering = VK_TRUE; - s->inlineUniformBlock = VK_TRUE; - s->maintenance4 = VK_TRUE; - s->pipelineCreationCacheControl = VK_TRUE; - s->robustImageAccess = VK_TRUE; - s->shaderDemoteToHelperInvocation = VK_TRUE; - s->shaderIntegerDotProduct = VK_TRUE; - s->shaderTerminateInvocation = VK_TRUE; - s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; - s->subgroupSizeControl = VK_TRUE; - s->synchronization2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->bufferDeviceAddress == VK_TRUE); - ret = ret && (s->vulkanMemoryModel == VK_TRUE); - ret = ret && (s->vulkanMemoryModelDeviceScope == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - ret = ret && (s->computeFullSubgroups == VK_TRUE); - ret = ret && (s->dynamicRendering == VK_TRUE); - ret = ret && (s->inlineUniformBlock == VK_TRUE); - ret = ret && (s->maintenance4 == VK_TRUE); - ret = ret && (s->pipelineCreationCacheControl == VK_TRUE); - ret = ret && (s->robustImageAccess == VK_TRUE); - ret = ret && (s->shaderDemoteToHelperInvocation == VK_TRUE); - ret = ret && (s->shaderIntegerDotProduct == VK_TRUE); - ret = ret && (s->shaderTerminateInvocation == VK_TRUE); - ret = ret && (s->shaderZeroInitializeWorkgroupMemory == VK_TRUE); - ret = ret && (s->subgroupSizeControl == VK_TRUE); - ret = ret && (s->synchronization2 == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: { - VkPhysicalDeviceVulkan13Properties* s = static_cast(static_cast(p)); - s->maxBufferSize = 1073741824; - s->maxDescriptorSetInlineUniformBlocks = 4; - s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = 4; - s->maxInlineUniformBlockSize = 256; - s->maxInlineUniformTotalSize = 256; - s->maxPerStageDescriptorInlineUniformBlocks = 4; - s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: { - VkPhysicalDeviceVulkan13Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxBufferSize >= 1073741824); - ret = ret && (s->maxDescriptorSetInlineUniformBlocks >= 4); - ret = ret && (s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4); - ret = ret && (s->maxInlineUniformBlockSize >= 256); - ret = ret && (s->maxInlineUniformTotalSize >= 256); - ret = ret && (s->maxPerStageDescriptorInlineUniformBlocks >= 4); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->maxMemoryAllocationSize = 1073741824; + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + s->maxPerSetDescriptors = 1024; + s->subgroupSize = 1; + s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); + s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMemoryAllocationSize >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewViewCount >= 6"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 1024), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxPerSetDescriptors >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 1), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSize >= 1"); + ret = ret && ((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedStages contains (VK_SHADER_STAGE_COMPUTE_BIT)"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan13requirements -namespace vulkan13requirements_roadmap2022 { -static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1 }, -}; +} // namespace vulkan11requirements +namespace vulkan12requirements +{ static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - ret = ret && (s->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } -}; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->filterMinmaxImageComponentMapping = VK_FALSE; + s->filterMinmaxSingleComponentFormats = VK_FALSE; + s->framebufferIntegerColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->independentResolve = VK_FALSE; + s->independentResolveNone = VK_FALSE; + s->maxDescriptorSetUpdateAfterBindInputAttachments = 0; + s->maxDescriptorSetUpdateAfterBindSampledImages = 0; + s->maxDescriptorSetUpdateAfterBindSamplers = 0; + s->maxDescriptorSetUpdateAfterBindStorageBuffers = 0; + s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 0; + s->maxDescriptorSetUpdateAfterBindStorageImages = 0; + s->maxDescriptorSetUpdateAfterBindUniformBuffers = 0; + s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 0; + s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 0; + s->maxPerStageDescriptorUpdateAfterBindSampledImages = 0; + s->maxPerStageDescriptorUpdateAfterBindSamplers = 0; + s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 0; + s->maxPerStageDescriptorUpdateAfterBindStorageImages = 0; + s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 0; + s->maxPerStageUpdateAfterBindResources = 0; + s->maxTimelineSemaphoreValueDifference = 2147483647; + s->maxUpdateAfterBindDescriptorsInAllPools = 0; + s->quadDivergentImplicitLod = VK_FALSE; + s->robustBufferAccessUpdateAfterBind = VK_FALSE; + s->shaderDenormFlushToZeroFloat16 = VK_FALSE; + s->shaderDenormFlushToZeroFloat32 = VK_FALSE; + s->shaderDenormFlushToZeroFloat64 = VK_FALSE; + s->shaderDenormPreserveFloat16 = VK_FALSE; + s->shaderDenormPreserveFloat32 = VK_FALSE; + s->shaderDenormPreserveFloat64 = VK_FALSE; + s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; + s->shaderRoundingModeRTEFloat16 = VK_FALSE; + s->shaderRoundingModeRTEFloat32 = VK_FALSE; + s->shaderRoundingModeRTEFloat64 = VK_FALSE; + s->shaderRoundingModeRTZFloat16 = VK_FALSE; + s->shaderRoundingModeRTZFloat32 = VK_FALSE; + s->shaderRoundingModeRTZFloat64 = VK_FALSE; + s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat16 = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat64 = VK_FALSE; + s->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE; + s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxImageComponentMapping >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxSingleComponentFormats >= VK_FALSE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::framebufferIntegerColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolve >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolveNone >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindInputAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSampledImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSamplers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSampledImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSamplers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageUpdateAfterBindResources >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxTimelineSemaphoreValueDifference >= 2147483647"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxUpdateAfterBindDescriptorsInAllPools >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::quadDivergentImplicitLod >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::robustBufferAccessUpdateAfterBind >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, }; -} //namespace vulkan13requirements_roadmap2022 -} // namespace VP_KHR_ROADMAP_2022 -#endif // VP_KHR_roadmap_2022 +} // namespace vulkan12requirements +} // namespace blocks +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 +#endif // VP_LUNARG_minimum_requirements_1_2 -#ifdef VP_KHR_roadmap_2024 -namespace VP_KHR_ROADMAP_2024 { +#ifdef VP_LUNARG_minimum_requirements_1_3 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 +{ static const VkStructureType featureStructTypes[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, @@ -8080,6403 +28475,6611 @@ static const VkStructureType featureStructTypes[] = { static const VkStructureType propertyStructTypes[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, }; -static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_5_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAP_MEMORY_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 1 }, +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + s->vulkanMemoryModel = VK_TRUE; + s->vulkanMemoryModelDeviceScope = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *s = static_cast(static_cast(p)); + s->computeFullSubgroups = VK_TRUE; + s->dynamicRendering = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + s->maintenance4 = VK_TRUE; + s->pipelineCreationCacheControl = VK_TRUE; + s->robustImageAccess = VK_TRUE; + s->shaderDemoteToHelperInvocation = VK_TRUE; + s->shaderIntegerDotProduct = VK_TRUE; + s->shaderTerminateInvocation = VK_TRUE; + s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; + s->subgroupSizeControl = VK_TRUE; + s->synchronization2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModel == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *prettify_VkPhysicalDeviceVulkan13Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::computeFullSubgroups == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::dynamicRendering == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::inlineUniformBlock == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::maintenance4 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::robustImageAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::subgroupSizeControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::synchronization2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); + }, +}; + +namespace blocks +{ +namespace vulkan10requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *s = static_cast(static_cast(p)); + s->features.robustBufferAccess = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: + { + VkPhysicalDeviceFeatures2KHR *prettify_VkPhysicalDeviceFeatures2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceFeatures2KHR->features.robustBufferAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceFeatures2KHR::features.robustBufferAccess == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *s = static_cast(static_cast(p)); + s->properties.limits.bufferImageGranularity = 131072; + s->properties.limits.discreteQueuePriorities = 2; + s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.lineWidthGranularity = 1.0f; + s->properties.limits.lineWidthRange[0] = 1.0f; + s->properties.limits.lineWidthRange[1] = 1.0f; + s->properties.limits.maxBoundDescriptorSets = 4; + s->properties.limits.maxClipDistances = 0; + s->properties.limits.maxColorAttachments = 4; + s->properties.limits.maxCombinedClipAndCullDistances = 0; + s->properties.limits.maxComputeSharedMemorySize = 16384; + s->properties.limits.maxComputeWorkGroupCount[0] = 65535; + s->properties.limits.maxComputeWorkGroupCount[1] = 65535; + s->properties.limits.maxComputeWorkGroupCount[2] = 65535; + s->properties.limits.maxComputeWorkGroupInvocations = 128; + s->properties.limits.maxComputeWorkGroupSize[0] = 128; + s->properties.limits.maxComputeWorkGroupSize[1] = 128; + s->properties.limits.maxComputeWorkGroupSize[2] = 64; + s->properties.limits.maxCullDistances = 0; + s->properties.limits.maxDescriptorSetInputAttachments = 4; + s->properties.limits.maxDescriptorSetSampledImages = 96; + s->properties.limits.maxDescriptorSetSamplers = 96; + s->properties.limits.maxDescriptorSetStorageBuffers = 24; + s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; + s->properties.limits.maxDescriptorSetStorageImages = 24; + s->properties.limits.maxDescriptorSetUniformBuffers = 72; + s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; + s->properties.limits.maxDrawIndexedIndexValue = 16777216; + s->properties.limits.maxDrawIndirectCount = 1; + s->properties.limits.maxFragmentCombinedOutputResources = 4; + s->properties.limits.maxFragmentDualSrcAttachments = 0; + s->properties.limits.maxFragmentInputComponents = 64; + s->properties.limits.maxFragmentOutputAttachments = 4; + s->properties.limits.maxFramebufferHeight = 4096; + s->properties.limits.maxFramebufferLayers = 256; + s->properties.limits.maxFramebufferWidth = 4096; + s->properties.limits.maxGeometryInputComponents = 0; + s->properties.limits.maxGeometryOutputComponents = 0; + s->properties.limits.maxGeometryOutputVertices = 0; + s->properties.limits.maxGeometryShaderInvocations = 0; + s->properties.limits.maxGeometryTotalOutputComponents = 0; + s->properties.limits.maxImageArrayLayers = 256; + s->properties.limits.maxImageDimension1D = 4096; + s->properties.limits.maxImageDimension2D = 4096; + s->properties.limits.maxImageDimension3D = 256; + s->properties.limits.maxImageDimensionCube = 4096; + s->properties.limits.maxInterpolationOffset = 0.0f; + s->properties.limits.maxMemoryAllocationCount = 4096; + s->properties.limits.maxPerStageDescriptorInputAttachments = 4; + s->properties.limits.maxPerStageDescriptorSampledImages = 16; + s->properties.limits.maxPerStageDescriptorSamplers = 16; + s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; + s->properties.limits.maxPerStageDescriptorStorageImages = 4; + s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; + s->properties.limits.maxPerStageResources = 128; + s->properties.limits.maxPushConstantsSize = 128; + s->properties.limits.maxSampleMaskWords = 1; + s->properties.limits.maxSamplerAllocationCount = 4000; + s->properties.limits.maxSamplerAnisotropy = 1; + s->properties.limits.maxSamplerLodBias = 2; + s->properties.limits.maxStorageBufferRange = 134217728; + s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; + s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; + s->properties.limits.maxTessellationControlTotalOutputComponents = 0; + s->properties.limits.maxTessellationEvaluationInputComponents = 0; + s->properties.limits.maxTessellationEvaluationOutputComponents = 0; + s->properties.limits.maxTessellationGenerationLevel = 0; + s->properties.limits.maxTessellationPatchSize = 0; + s->properties.limits.maxTexelBufferElements = 65536; + s->properties.limits.maxTexelGatherOffset = 7; + s->properties.limits.maxTexelOffset = 7; + s->properties.limits.maxUniformBufferRange = 16384; + s->properties.limits.maxVertexInputAttributeOffset = 2047; + s->properties.limits.maxVertexInputAttributes = 16; + s->properties.limits.maxVertexInputBindingStride = 2048; + s->properties.limits.maxVertexInputBindings = 16; + s->properties.limits.maxVertexOutputComponents = 64; + s->properties.limits.maxViewportDimensions[0] = 4096; + s->properties.limits.maxViewportDimensions[1] = 4096; + s->properties.limits.maxViewports = 1; + s->properties.limits.minInterpolationOffset = 0.0f; + s->properties.limits.minMemoryMapAlignment = 64; + s->properties.limits.minStorageBufferOffsetAlignment = 256; + s->properties.limits.minTexelBufferOffsetAlignment = 256; + s->properties.limits.minTexelGatherOffset = -8; + s->properties.limits.minTexelOffset = -8; + s->properties.limits.minUniformBufferOffsetAlignment = 256; + s->properties.limits.mipmapPrecisionBits = 4; + s->properties.limits.nonCoherentAtomSize = 256; + s->properties.limits.pointSizeGranularity = 1.0f; + s->properties.limits.pointSizeRange[0] = 1.0f; + s->properties.limits.pointSizeRange[1] = 1.0f; + s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); + s->properties.limits.sparseAddressSpaceSize = 0; + s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->properties.limits.subPixelInterpolationOffsetBits = 0; + s->properties.limits.subPixelPrecisionBits = 4; + s->properties.limits.subTexelPrecisionBits = 4; + s->properties.limits.viewportBoundsRange[0] = -8192; + s->properties.limits.viewportBoundsRange[1] = 8192; + s->properties.limits.viewportSubPixelBits = 0; + s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; + s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: + { + VkPhysicalDeviceProperties2KHR *prettify_VkPhysicalDeviceProperties2KHR = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity <= 131072), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.bufferImageGranularity <= 131072"); + ret = ret && ((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0); + VP_DEBUG_COND_MSG(!((131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0), "Unsupported properties condition: (131072 % prettify_VkPhysicalDeviceProperties2KHR->properties.limits.bufferImageGranularity) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.discreteQueuePriorities >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.discreteQueuePriorities >= 2"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferNoAttachmentsSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.framebufferStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.lineWidthRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.lineWidthRange[1] >= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxBoundDescriptorSets >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxBoundDescriptorSets >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxClipDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxClipDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxColorAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxColorAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCombinedClipAndCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCombinedClipAndCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeSharedMemorySize >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeSharedMemorySize >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[0] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[0] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[1] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[1] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupCount[2] >= 65535), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupCount[2] >= 65535"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupInvocations >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupInvocations >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[0] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[0] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[1] >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[1] >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxComputeWorkGroupSize[2] >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxComputeWorkGroupSize[2] >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxCullDistances >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxCullDistances >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSampledImages >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSampledImages >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetSamplers >= 96), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetSamplers >= 96"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffers >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffers >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetStorageImages >= 24), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetStorageImages >= 24"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffers >= 72), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffers >= 72"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndexedIndexValue >= 16777216), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndexedIndexValue >= 16777216"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxDrawIndirectCount >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxDrawIndirectCount >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentCombinedOutputResources >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentCombinedOutputResources >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentDualSrcAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentDualSrcAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentInputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentInputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFragmentOutputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFragmentOutputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferHeight >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferHeight >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxFramebufferWidth >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxFramebufferWidth >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryOutputVertices >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryOutputVertices >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryShaderInvocations >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryShaderInvocations >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxGeometryTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxGeometryTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageArrayLayers >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageArrayLayers >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension1D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension1D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension2D >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension2D >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimension3D >= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimension3D >= 256"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxImageDimensionCube >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxImageDimensionCube >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxInterpolationOffset >= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxInterpolationOffset >= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxMemoryAllocationCount >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxMemoryAllocationCount >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorInputAttachments >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorInputAttachments >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSampledImages >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSampledImages >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorSamplers >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorSamplers >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageBuffers >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageBuffers >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorStorageImages >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorStorageImages >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageDescriptorUniformBuffers >= 12), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageDescriptorUniformBuffers >= 12"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPerStageResources >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPerStageResources >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxPushConstantsSize >= 128), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxPushConstantsSize >= 128"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSampleMaskWords >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSampleMaskWords >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAllocationCount >= 4000), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAllocationCount >= 4000"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerAnisotropy >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerAnisotropy >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxSamplerLodBias >= 2), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxSamplerLodBias >= 2"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxStorageBufferRange >= 134217728), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxStorageBufferRange >= 134217728"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerPatchOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlPerVertexOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationControlTotalOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationControlTotalOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationInputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationInputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationEvaluationOutputComponents >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationEvaluationOutputComponents >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationGenerationLevel >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationGenerationLevel >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTessellationPatchSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTessellationPatchSize >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelBufferElements >= 65536), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelBufferElements >= 65536"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelGatherOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelGatherOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxTexelOffset >= 7), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxTexelOffset >= 7"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxUniformBufferRange >= 16384), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxUniformBufferRange >= 16384"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributeOffset >= 2047), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributeOffset >= 2047"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputAttributes >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputAttributes >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindingStride >= 2048), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindingStride >= 2048"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexInputBindings >= 16), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexInputBindings >= 16"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxVertexOutputComponents >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxVertexOutputComponents >= 64"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[0] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[0] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewportDimensions[1] >= 4096), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewportDimensions[1] >= 4096"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.maxViewports >= 1), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.maxViewports >= 1"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minInterpolationOffset <= 0.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minInterpolationOffset <= 0.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment >= 64), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minMemoryMapAlignment >= 64"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minMemoryMapAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minStorageBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelGatherOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelGatherOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minTexelOffset <= -8), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minTexelOffset <= -8"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.minUniformBufferOffsetAlignment <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.mipmapPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.mipmapPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize <= 256), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.nonCoherentAtomSize <= 256"); + ret = ret && ((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize & (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.nonCoherentAtomSize - 1)) == 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeGranularity <= 1.0"); + ret = ret && (isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)); + VP_DEBUG_COND_MSG(!(isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)), "Unsupported properties condition: isMultiple(1.0, prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeGranularity)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[0] <= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[0] <= 1.0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.pointSizeRange[1] >= 1.0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.pointSizeRange[1] >= 1.0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageDepthSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageIntegerSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sampledImageStencilSampleCounts contains (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.sparseAddressSpaceSize >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.sparseAddressSpaceSize >= 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.storageImageSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelInterpolationOffsetBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelInterpolationOffsetBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subPixelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subPixelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.subTexelPrecisionBits >= 4), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.subTexelPrecisionBits >= 4"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[0] <= -8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[0] <= -8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportBoundsRange[1] >= 8192), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportBoundsRange[1] >= 8192"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.limits.viewportSubPixelBits >= 0), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.limits.viewportSubPixelBits >= 0"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyNonResidentStrict >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard2DMultisampleBlockShape >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceProperties2KHR->properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceProperties2KHR::properties.sparseProperties.residencyStandard3DBlockShape >= VK_FALSE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); + }, }; +} // namespace vulkan10requirements +namespace vulkan11requirements +{ static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.depthBiasClamp = VK_TRUE; - s->features.depthClamp = VK_TRUE; - s->features.drawIndirectFirstInstance = VK_TRUE; - s->features.fragmentStoresAndAtomics = VK_TRUE; - s->features.fullDrawIndexUint32 = VK_TRUE; - s->features.imageCubeArray = VK_TRUE; - s->features.independentBlend = VK_TRUE; - s->features.multiDrawIndirect = VK_TRUE; - s->features.occlusionQueryPrecise = VK_TRUE; - s->features.robustBufferAccess = VK_TRUE; - s->features.sampleRateShading = VK_TRUE; - s->features.samplerAnisotropy = VK_TRUE; - s->features.shaderImageGatherExtended = VK_TRUE; - s->features.shaderInt16 = VK_TRUE; - s->features.shaderSampledImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageBufferArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageArrayDynamicIndexing = VK_TRUE; - s->features.shaderStorageImageExtendedFormats = VK_TRUE; - s->features.shaderUniformBufferArrayDynamicIndexing = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - s->samplerYcbcrConversion = VK_TRUE; - s->shaderDrawParameters = VK_TRUE; - s->storageBuffer16BitAccess = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->bufferDeviceAddress = VK_TRUE; - s->descriptorBindingPartiallyBound = VK_TRUE; - s->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE; - s->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE; - s->descriptorBindingUpdateUnusedWhilePending = VK_TRUE; - s->descriptorBindingVariableDescriptorCount = VK_TRUE; - s->descriptorIndexing = VK_TRUE; - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->runtimeDescriptorArray = VK_TRUE; - s->samplerMirrorClampToEdge = VK_TRUE; - s->scalarBlockLayout = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderFloat16 = VK_TRUE; - s->shaderInt8 = VK_TRUE; - s->shaderSampledImageArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageImageArrayNonUniformIndexing = VK_TRUE; - s->shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; - s->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; - s->shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; - s->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; - s->storageBuffer8BitAccess = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - s->vulkanMemoryModel = VK_TRUE; - s->vulkanMemoryModelDeviceScope = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - s->computeFullSubgroups = VK_TRUE; - s->descriptorBindingInlineUniformBlockUpdateAfterBind = VK_TRUE; - s->dynamicRendering = VK_TRUE; - s->inlineUniformBlock = VK_TRUE; - s->maintenance4 = VK_TRUE; - s->pipelineCreationCacheControl = VK_TRUE; - s->robustImageAccess = VK_TRUE; - s->shaderDemoteToHelperInvocation = VK_TRUE; - s->shaderIntegerDotProduct = VK_TRUE; - s->shaderTerminateInvocation = VK_TRUE; - s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; - s->subgroupSizeControl = VK_TRUE; - s->synchronization2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.depthBiasClamp == VK_TRUE); - ret = ret && (s->features.depthClamp == VK_TRUE); - ret = ret && (s->features.drawIndirectFirstInstance == VK_TRUE); - ret = ret && (s->features.fragmentStoresAndAtomics == VK_TRUE); - ret = ret && (s->features.fullDrawIndexUint32 == VK_TRUE); - ret = ret && (s->features.imageCubeArray == VK_TRUE); - ret = ret && (s->features.independentBlend == VK_TRUE); - ret = ret && (s->features.multiDrawIndirect == VK_TRUE); - ret = ret && (s->features.occlusionQueryPrecise == VK_TRUE); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - ret = ret && (s->features.sampleRateShading == VK_TRUE); - ret = ret && (s->features.samplerAnisotropy == VK_TRUE); - ret = ret && (s->features.shaderImageGatherExtended == VK_TRUE); - ret = ret && (s->features.shaderInt16 == VK_TRUE); - ret = ret && (s->features.shaderSampledImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->features.shaderStorageImageExtendedFormats == VK_TRUE); - ret = ret && (s->features.shaderUniformBufferArrayDynamicIndexing == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - ret = ret && (s->samplerYcbcrConversion == VK_TRUE); - ret = ret && (s->shaderDrawParameters == VK_TRUE); - ret = ret && (s->storageBuffer16BitAccess == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->bufferDeviceAddress == VK_TRUE); - ret = ret && (s->descriptorBindingPartiallyBound == VK_TRUE); - ret = ret && (s->descriptorBindingSampledImageUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageImageUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE); - ret = ret && (s->descriptorBindingUpdateUnusedWhilePending == VK_TRUE); - ret = ret && (s->descriptorBindingVariableDescriptorCount == VK_TRUE); - ret = ret && (s->descriptorIndexing == VK_TRUE); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->runtimeDescriptorArray == VK_TRUE); - ret = ret && (s->samplerMirrorClampToEdge == VK_TRUE); - ret = ret && (s->scalarBlockLayout == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderFloat16 == VK_TRUE); - ret = ret && (s->shaderInt8 == VK_TRUE); - ret = ret && (s->shaderSampledImageArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageImageArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderStorageTexelBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->shaderStorageTexelBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->shaderUniformBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->shaderUniformTexelBufferArrayDynamicIndexing == VK_TRUE); - ret = ret && (s->shaderUniformTexelBufferArrayNonUniformIndexing == VK_TRUE); - ret = ret && (s->storageBuffer8BitAccess == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - ret = ret && (s->vulkanMemoryModel == VK_TRUE); - ret = ret && (s->vulkanMemoryModelDeviceScope == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - ret = ret && (s->computeFullSubgroups == VK_TRUE); - ret = ret && (s->descriptorBindingInlineUniformBlockUpdateAfterBind == VK_TRUE); - ret = ret && (s->dynamicRendering == VK_TRUE); - ret = ret && (s->inlineUniformBlock == VK_TRUE); - ret = ret && (s->maintenance4 == VK_TRUE); - ret = ret && (s->pipelineCreationCacheControl == VK_TRUE); - ret = ret && (s->robustImageAccess == VK_TRUE); - ret = ret && (s->shaderDemoteToHelperInvocation == VK_TRUE); - ret = ret && (s->shaderIntegerDotProduct == VK_TRUE); - ret = ret && (s->shaderTerminateInvocation == VK_TRUE); - ret = ret && (s->shaderZeroInitializeWorkgroupMemory == VK_TRUE); - ret = ret && (s->subgroupSizeControl == VK_TRUE); - ret = ret && (s->synchronization2 == VK_TRUE); - } break; - default: break; - } - return ret; - } + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *s = static_cast(static_cast(p)); + s->multiview = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + { + VkPhysicalDeviceVulkan11Features *prettify_VkPhysicalDeviceVulkan11Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Features->multiview == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan11Features::multiview == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *s = static_cast(static_cast(p)); + s->maxMemoryAllocationSize = 1073741824; + s->maxMultiviewInstanceIndex = 134217727; + s->maxMultiviewViewCount = 6; + s->maxPerSetDescriptors = 1024; + s->subgroupSize = 1; + s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); + s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: + { + VkPhysicalDeviceVulkan11Properties *prettify_VkPhysicalDeviceVulkan11Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMemoryAllocationSize >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMemoryAllocationSize >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewInstanceIndex >= 134217727), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewInstanceIndex >= 134217727"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxMultiviewViewCount >= 6), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxMultiviewViewCount >= 6"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 1024); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->maxPerSetDescriptors >= 1024), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::maxPerSetDescriptors >= 1024"); + ret = ret && (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 1); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize >= 1), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSize >= 1"); + ret = ret && ((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0); + VP_DEBUG_COND_MSG(!((prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0), "Unsupported properties condition: (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize & (prettify_VkPhysicalDeviceVulkan11Properties->subgroupSize - 1)) == 0"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedOperations contains (VK_SUBGROUP_FEATURE_BASIC_BIT)"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan11Properties->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan11Properties::subgroupSupportedStages contains (VK_SHADER_STAGE_COMPUTE_BIT)"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); + }, }; +} // namespace vulkan11requirements +namespace vulkan12requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->hostQueryReset = VK_TRUE; + s->imagelessFramebuffer = VK_TRUE; + s->separateDepthStencilLayouts = VK_TRUE; + s->shaderSubgroupExtendedTypes = VK_TRUE; + s->subgroupBroadcastDynamicId = VK_TRUE; + s->timelineSemaphore = VK_TRUE; + s->uniformBufferStandardLayout = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->hostQueryReset == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::hostQueryReset == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->imagelessFramebuffer == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::imagelessFramebuffer == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->separateDepthStencilLayouts == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->shaderSubgroupExtendedTypes == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->subgroupBroadcastDynamicId == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->timelineSemaphore == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::timelineSemaphore == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->uniformBufferStandardLayout == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *s = static_cast(static_cast(p)); + s->filterMinmaxImageComponentMapping = VK_FALSE; + s->filterMinmaxSingleComponentFormats = VK_FALSE; + s->framebufferIntegerColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); + s->independentResolve = VK_FALSE; + s->independentResolveNone = VK_FALSE; + s->maxDescriptorSetUpdateAfterBindInputAttachments = 0; + s->maxDescriptorSetUpdateAfterBindSampledImages = 0; + s->maxDescriptorSetUpdateAfterBindSamplers = 0; + s->maxDescriptorSetUpdateAfterBindStorageBuffers = 0; + s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 0; + s->maxDescriptorSetUpdateAfterBindStorageImages = 0; + s->maxDescriptorSetUpdateAfterBindUniformBuffers = 0; + s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 0; + s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 0; + s->maxPerStageDescriptorUpdateAfterBindSampledImages = 0; + s->maxPerStageDescriptorUpdateAfterBindSamplers = 0; + s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 0; + s->maxPerStageDescriptorUpdateAfterBindStorageImages = 0; + s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 0; + s->maxPerStageUpdateAfterBindResources = 0; + s->maxTimelineSemaphoreValueDifference = 2147483647; + s->maxUpdateAfterBindDescriptorsInAllPools = 0; + s->quadDivergentImplicitLod = VK_FALSE; + s->robustBufferAccessUpdateAfterBind = VK_FALSE; + s->shaderDenormFlushToZeroFloat16 = VK_FALSE; + s->shaderDenormFlushToZeroFloat32 = VK_FALSE; + s->shaderDenormFlushToZeroFloat64 = VK_FALSE; + s->shaderDenormPreserveFloat16 = VK_FALSE; + s->shaderDenormPreserveFloat32 = VK_FALSE; + s->shaderDenormPreserveFloat64 = VK_FALSE; + s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; + s->shaderRoundingModeRTEFloat16 = VK_FALSE; + s->shaderRoundingModeRTEFloat32 = VK_FALSE; + s->shaderRoundingModeRTEFloat64 = VK_FALSE; + s->shaderRoundingModeRTZFloat16 = VK_FALSE; + s->shaderRoundingModeRTZFloat32 = VK_FALSE; + s->shaderRoundingModeRTZFloat64 = VK_FALSE; + s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat16 = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat32 = VK_FALSE; + s->shaderSignedZeroInfNanPreserveFloat64 = VK_FALSE; + s->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE; + s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; + s->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + { + VkPhysicalDeviceVulkan12Properties *prettify_VkPhysicalDeviceVulkan12Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxImageComponentMapping >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxImageComponentMapping >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->filterMinmaxSingleComponentFormats >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::filterMinmaxSingleComponentFormats >= VK_FALSE"); + ret = ret && (vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); + VP_DEBUG_COND_MSG(!(vpCheckFlags(prettify_VkPhysicalDeviceVulkan12Properties->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::framebufferIntegerColorSampleCounts contains (VK_SAMPLE_COUNT_1_BIT)"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolve >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolve >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->independentResolveNone >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::independentResolveNone >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindInputAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindInputAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSampledImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSampledImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindSamplers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindSamplers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindStorageImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindStorageImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSampledImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSampledImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindSamplers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindSamplers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindStorageImages >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindStorageImages >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxPerStageUpdateAfterBindResources >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxPerStageUpdateAfterBindResources >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxTimelineSemaphoreValueDifference >= 2147483647), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxTimelineSemaphoreValueDifference >= 2147483647"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->maxUpdateAfterBindDescriptorsInAllPools >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::maxUpdateAfterBindDescriptorsInAllPools >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->quadDivergentImplicitLod >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::quadDivergentImplicitLod >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->robustBufferAccessUpdateAfterBind >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::robustBufferAccessUpdateAfterBind >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormFlushToZeroFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormFlushToZeroFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderDenormPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderDenormPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderInputAttachmentArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTEFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTEFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderRoundingModeRTZFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderRoundingModeRTZFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSampledImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat16 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat32 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat32 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderSignedZeroInfNanPreserveFloat64 >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageBufferArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderStorageImageArrayNonUniformIndexingNative >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Properties->shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan12Properties::shaderUniformBufferArrayNonUniformIndexingNative >= VK_FALSE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpStructChainerDesc chainerDesc = { + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; +} // namespace vulkan12requirements +namespace vulkan13requirements +{ + +static const VpFeatureDesc featureDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *s = static_cast(static_cast(p)); + s->bufferDeviceAddress = VK_TRUE; + s->vulkanMemoryModel = VK_TRUE; + s->vulkanMemoryModelDeviceScope = VK_TRUE; + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *s = static_cast(static_cast(p)); + s->computeFullSubgroups = VK_TRUE; + s->dynamicRendering = VK_TRUE; + s->inlineUniformBlock = VK_TRUE; + s->maintenance4 = VK_TRUE; + s->pipelineCreationCacheControl = VK_TRUE; + s->robustImageAccess = VK_TRUE; + s->shaderDemoteToHelperInvocation = VK_TRUE; + s->shaderIntegerDotProduct = VK_TRUE; + s->shaderTerminateInvocation = VK_TRUE; + s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; + s->subgroupSizeControl = VK_TRUE; + s->synchronization2 = VK_TRUE; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + { + VkPhysicalDeviceVulkan12Features *prettify_VkPhysicalDeviceVulkan12Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->bufferDeviceAddress == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::bufferDeviceAddress == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModel == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModel == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan12Features->vulkanMemoryModelDeviceScope == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope == VK_TRUE"); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: + { + VkPhysicalDeviceVulkan13Features *prettify_VkPhysicalDeviceVulkan13Features = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->computeFullSubgroups == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::computeFullSubgroups == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->dynamicRendering == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::dynamicRendering == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->inlineUniformBlock == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::inlineUniformBlock == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->maintenance4 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::maintenance4 == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->pipelineCreationCacheControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->robustImageAccess == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::robustImageAccess == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderDemoteToHelperInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderIntegerDotProduct == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderTerminateInvocation == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->shaderZeroInitializeWorkgroupMemory == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->subgroupSizeControl == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::subgroupSizeControl == VK_TRUE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Features->synchronization2 == VK_TRUE), "Unsupported feature condition: VkPhysicalDeviceVulkan13Features::synchronization2 == VK_TRUE"); + } + break; + default: + break; + } + return ret; + }}; + +static const VpPropertyDesc propertyDesc = { + [](VkBaseOutStructure *p) { + (void) p; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: + { + VkPhysicalDeviceVulkan13Properties *s = static_cast(static_cast(p)); + s->integerDotProduct16BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProduct16BitSignedAccelerated = VK_FALSE; + s->integerDotProduct16BitUnsignedAccelerated = VK_FALSE; + s->integerDotProduct32BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProduct32BitSignedAccelerated = VK_FALSE; + s->integerDotProduct32BitUnsignedAccelerated = VK_FALSE; + s->integerDotProduct4x8BitPackedMixedSignednessAccelerated = VK_FALSE; + s->integerDotProduct4x8BitPackedSignedAccelerated = VK_FALSE; + s->integerDotProduct4x8BitPackedUnsignedAccelerated = VK_FALSE; + s->integerDotProduct64BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProduct64BitSignedAccelerated = VK_FALSE; + s->integerDotProduct64BitUnsignedAccelerated = VK_FALSE; + s->integerDotProduct8BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProduct8BitSignedAccelerated = VK_FALSE; + s->integerDotProduct8BitUnsignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating16BitSignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating32BitSignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating64BitSignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating8BitSignedAccelerated = VK_FALSE; + s->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated = VK_FALSE; + s->maxBufferSize = 1073741824; + s->maxComputeWorkgroupSubgroups = 0; + s->maxDescriptorSetInlineUniformBlocks = 4; + s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = 4; + s->maxInlineUniformBlockSize = 256; + s->maxInlineUniformTotalSize = 256; + s->maxPerStageDescriptorInlineUniformBlocks = 4; + s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4; + } + break; + default: + break; + } + }, + [](VkBaseOutStructure *p) -> bool { + (void) p; + bool ret = true; + switch (p->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: + { + VkPhysicalDeviceVulkan13Properties *prettify_VkPhysicalDeviceVulkan13Properties = static_cast(static_cast(p)); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct16BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct16BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct16BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct16BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct16BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct16BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct16BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct16BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct16BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct32BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct32BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct32BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct32BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct32BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct32BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct32BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct32BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct32BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct4x8BitPackedMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct4x8BitPackedMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct4x8BitPackedMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct4x8BitPackedSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct4x8BitPackedSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct4x8BitPackedSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct4x8BitPackedUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct4x8BitPackedUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct4x8BitPackedUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct64BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct64BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct64BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct64BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct64BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct64BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct64BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct64BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct64BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct8BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct8BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct8BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct8BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct8BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct8BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct8BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProduct8BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProduct8BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating16BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating16BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating16BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating16BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating32BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating32BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating32BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating32BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating64BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating64BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating64BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating64BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating8BitSignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating8BitSignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating8BitSignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated >= VK_FALSE); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated >= VK_FALSE), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::integerDotProductAccumulatingSaturating8BitUnsignedAccelerated >= VK_FALSE"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxBufferSize >= 1073741824); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxBufferSize >= 1073741824), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxBufferSize >= 1073741824"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxComputeWorkgroupSubgroups >= 0); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxComputeWorkgroupSubgroups >= 0), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxComputeWorkgroupSubgroups >= 0"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxDescriptorSetInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformBlockSize >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformBlockSize >= 256), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxInlineUniformBlockSize >= 256"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformTotalSize >= 256); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxInlineUniformTotalSize >= 256), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxInlineUniformTotalSize >= 256"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxPerStageDescriptorInlineUniformBlocks >= 4"); + ret = ret && (prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4); + VP_DEBUG_COND_MSG(!(prettify_VkPhysicalDeviceVulkan13Properties->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4), "Unsupported properties condition: VkPhysicalDeviceVulkan13Properties::maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4"); + } + break; + default: + break; + } + return ret; + }}; static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); + pfnCb(p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr}; + VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties}; + VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties}; + p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); + pfnCb(p, pUser); + }, + [](uint32_t count, VkBaseOutStructure *p, void *pUser, PFN_vpStructArrayChainerCb pfnCb) { + pfnCb(count, p, pUser); + }, + [](VkBaseOutStructure *p, void *pUser, PFN_vpStructChainerCb pfnCb) { + pfnCb(p, pUser); + }, +}; +} // namespace vulkan13requirements +} // namespace blocks +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 +#endif // VP_LUNARG_minimum_requirements_1_3 + +#ifdef VP_ANDROID_15_minimums +namespace VP_ANDROID_15_MINIMUMS +{ +namespace blocks +{ +namespace MUST +{ +static const VpVariantDesc variants[] = { + { + "MUST", + static_cast(std::size(blocks::MUST::instanceExtensions)), + blocks::MUST::instanceExtensions, + static_cast(std::size(blocks::MUST::deviceExtensions)), + blocks::MUST::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::MUST::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::MUST::propertyDesc, + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(formatStructTypes)), + formatStructTypes, + static_cast(std::size(blocks::MUST::formatDesc)), + blocks::MUST::formatDesc, + blocks::MUST::chainerDesc, + 0, + nullptr, + }, +}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace MUST + +namespace primitivesGeneratedQuery_pipelineStatisticsQuery_ +{ +static const VpVariantDesc variants[] = { + { + "primitivesGeneratedQuery", + 0, + nullptr, + static_cast(std::size(blocks::primitivesGeneratedQuery::deviceExtensions)), + blocks::primitivesGeneratedQuery::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::primitivesGeneratedQuery::featureDesc, + 0, + nullptr, + blocks::primitivesGeneratedQuery::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::primitivesGeneratedQuery::chainerDesc, + 0, + nullptr, + }, + { + "pipelineStatisticsQuery", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::pipelineStatisticsQuery::featureDesc, + 0, + nullptr, + blocks::pipelineStatisticsQuery::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::pipelineStatisticsQuery::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); +}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace primitivesGeneratedQuery_pipelineStatisticsQuery_ + +namespace swBresenhamLines_hwBresenhamLines_ +{ +static const VpVariantDesc variants[] = { + { + "swBresenhamLines", + 0, + nullptr, + static_cast(std::size(blocks::swBresenhamLines::deviceExtensions)), + blocks::swBresenhamLines::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::swBresenhamLines::featureDesc, + 0, + nullptr, + blocks::swBresenhamLines::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::swBresenhamLines::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); + { + "hwBresenhamLines", + 0, + nullptr, + static_cast(std::size(blocks::hwBresenhamLines::deviceExtensions)), + blocks::hwBresenhamLines::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::hwBresenhamLines::featureDesc, + 0, + nullptr, + blocks::hwBresenhamLines::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::hwBresenhamLines::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace swBresenhamLines_hwBresenhamLines_ +} // namespace blocks + +static const VpCapabilitiesDesc capabilities[] = { + {blocks::MUST::variantCount, blocks::MUST::variants}, + {blocks::primitivesGeneratedQuery_pipelineStatisticsQuery_::variantCount, blocks::primitivesGeneratedQuery_pipelineStatisticsQuery_::variants}, + {blocks::swBresenhamLines_hwBresenhamLines_::variantCount, blocks::swBresenhamLines_hwBresenhamLines_::variants}, +}; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); + +static const VpProfileProperties profiles[] = { + {VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION}, +}; +static const uint32_t profileCount = static_cast(std::size(profiles)); +} // namespace VP_ANDROID_15_MINIMUMS +#endif // VP_ANDROID_15_minimums + +#ifdef VP_ANDROID_16_minimums +namespace VP_ANDROID_16_MINIMUMS +{ +namespace blocks +{ +namespace MUST +{ +static const VpVariantDesc variants[] = { + { + "MUST", + 0, + nullptr, + static_cast(std::size(blocks::MUST::deviceExtensions)), + blocks::MUST::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::MUST::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::MUST::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::MUST::chainerDesc, + 0, + nullptr, }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace MUST -namespace vulkan10requirements_roadmap2024 { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.multiDrawIndirect = VK_TRUE; - s->features.shaderImageGatherExtended = VK_TRUE; - s->features.shaderInt16 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.multiDrawIndirect == VK_TRUE); - ret = ret && (s->features.shaderImageGatherExtended == VK_TRUE); - ret = ret && (s->features.shaderInt16 == VK_TRUE); - } break; - default: break; - } - return ret; - } +namespace multisampledToSingleSampled_shaderStencilExport_ +{ +static const VpVariantDesc variants[] = { + { + "multisampledToSingleSampled", + 0, + nullptr, + static_cast(std::size(blocks::multisampledToSingleSampled::deviceExtensions)), + blocks::multisampledToSingleSampled::deviceExtensions, + 0, + nullptr, + blocks::multisampledToSingleSampled::featureDesc, + 0, + nullptr, + blocks::multisampledToSingleSampled::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::multisampledToSingleSampled::chainerDesc, + 0, + nullptr, + }, + { + "shaderStencilExport", + 0, + nullptr, + static_cast(std::size(blocks::shaderStencilExport::deviceExtensions)), + blocks::shaderStencilExport::deviceExtensions, + 0, + nullptr, + blocks::shaderStencilExport::featureDesc, + 0, + nullptr, + blocks::shaderStencilExport::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::shaderStencilExport::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace multisampledToSingleSampled_shaderStencilExport_ +} // namespace blocks -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.maxBoundDescriptorSets = 7; - s->properties.limits.maxColorAttachments = 8; - s->properties.limits.timestampComputeAndGraphics = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 7); - ret = ret && (s->properties.limits.maxColorAttachments >= 8); - ret = ret && (vpCheckFlags(s->properties.limits.timestampComputeAndGraphics, VK_TRUE)); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::MUST::variantCount, blocks::MUST::variants}, + {blocks::multisampledToSingleSampled_shaderStencilExport_::variantCount, blocks::multisampledToSingleSampled_shaderStencilExport_::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, -}; -} //namespace vulkan10requirements_roadmap2024 -namespace vulkan11requirements_roadmap2024 { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->shaderDrawParameters = VK_TRUE; - s->storageBuffer16BitAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->shaderDrawParameters == VK_TRUE); - ret = ret && (s->storageBuffer16BitAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } +static const VpProfileProperties profiles[] = { + {VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION}, + {VP_ANDROID_15_MINIMUMS_NAME, VP_ANDROID_15_MINIMUMS_SPEC_VERSION}, }; +static const uint32_t profileCount = static_cast(std::size(profiles)); +} // namespace VP_ANDROID_16_MINIMUMS +#endif // VP_ANDROID_16_minimums -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +#ifdef VP_ANDROID_baseline_2021 +namespace VP_ANDROID_BASELINE_2021 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + static_cast(std::size(instanceExtensions)), + instanceExtensions, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace blocks +{ +namespace baseline +{ +static const VpVariantDesc variants[] = { + { + "baseline", + static_cast(std::size(blocks::baseline::instanceExtensions)), + blocks::baseline::instanceExtensions, + static_cast(std::size(blocks::baseline::deviceExtensions)), + blocks::baseline::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::baseline::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::baseline::propertyDesc, + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(formatStructTypes)), + formatStructTypes, + static_cast(std::size(blocks::baseline::formatDesc)), + blocks::baseline::formatDesc, + blocks::baseline::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan11requirements_roadmap2024 -namespace vulkan12requirements_roadmap2024 { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->shaderFloat16 = VK_TRUE; - s->shaderInt8 = VK_TRUE; - s->storageBuffer8BitAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->shaderFloat16 == VK_TRUE); - ret = ret && (s->shaderInt8 == VK_TRUE); - ret = ret && (s->storageBuffer8BitAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace baseline +} // namespace blocks -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - s->shaderRoundingModeRTEFloat16 = VK_TRUE; - s->shaderRoundingModeRTEFloat32 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat16, VK_TRUE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat32, VK_TRUE)); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::baseline::variantCount, blocks::baseline::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_ANDROID_BASELINE_2021 +#endif // VP_ANDROID_baseline_2021 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, -}; -} //namespace vulkan12requirements_roadmap2024 -namespace vulkan13requirements_roadmap2024 { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; +#ifdef VP_ANDROID_baseline_2022 +namespace VP_ANDROID_BASELINE_2022 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + static_cast(std::size(instanceExtensions)), + instanceExtensions, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +namespace blocks +{ +namespace baseline +{ +static const VpVariantDesc variants[] = { + { + "baseline", + static_cast(std::size(blocks::baseline::instanceExtensions)), + blocks::baseline::instanceExtensions, + static_cast(std::size(blocks::baseline::deviceExtensions)), + blocks::baseline::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::baseline::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::baseline::propertyDesc, + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(formatStructTypes)), + formatStructTypes, + static_cast(std::size(blocks::baseline::formatDesc)), + blocks::baseline::formatDesc, + blocks::baseline::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace baseline +} // namespace blocks -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, -}; -} //namespace vulkan13requirements_roadmap2024 -namespace vulkanextensionrequirements_roadmap2024 { -static const VkExtensionProperties deviceExtensions[] = { - VkExtensionProperties{ VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAINTENANCE_5_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_MAP_MEMORY_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, 1 }, - VkExtensionProperties{ VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, 1 }, +static const VpCapabilitiesDesc capabilities[] = { + {blocks::baseline::variantCount, blocks::baseline::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_ANDROID_BASELINE_2022 +#endif // VP_ANDROID_baseline_2022 -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; +#ifdef VP_KHR_roadmap_2022 +namespace VP_KHR_ROADMAP_2022 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +namespace blocks +{ +namespace vulkan10requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements::featureDesc, + 0, + nullptr, + blocks::vulkan10requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan10requirements_roadmap2022 +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements_roadmap2022", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements_roadmap2022::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan10requirements_roadmap2022::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements_roadmap2022::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkanextensionrequirements_roadmap2024 -} // namespace VP_KHR_ROADMAP_2024 -#endif // VP_KHR_roadmap_2024 - -#ifdef VP_LUNARG_minimum_requirements_1_0 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 { - -static const VkStructureType featureStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, -}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements_roadmap2022 -static const VkStructureType propertyStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, -}; - -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; - -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +namespace vulkan11requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan11requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan11requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan11requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan11requirements::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan11requirements -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan11requirements_roadmap2022 +{ +static const VpVariantDesc variants[] = { + { + "vulkan11requirements_roadmap2022", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan11requirements_roadmap2022::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan11requirements_roadmap2022::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan11requirements_roadmap2022::chainerDesc, + 0, + nullptr, }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan11requirements_roadmap2022 -namespace vulkan10requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } +namespace vulkan12requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan12requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan12requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan12requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan12requirements::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan12requirements -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.bufferImageGranularity = 131072; - s->properties.limits.discreteQueuePriorities = 2; - s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.lineWidthGranularity = 1.0f; - s->properties.limits.lineWidthRange[0] = 1.0f; - s->properties.limits.lineWidthRange[1] = 1.0f; - s->properties.limits.maxBoundDescriptorSets = 4; - s->properties.limits.maxClipDistances = 0; - s->properties.limits.maxColorAttachments = 4; - s->properties.limits.maxCombinedClipAndCullDistances = 0; - s->properties.limits.maxComputeSharedMemorySize = 16384; - s->properties.limits.maxComputeWorkGroupCount[0] = 65535; - s->properties.limits.maxComputeWorkGroupCount[1] = 65535; - s->properties.limits.maxComputeWorkGroupCount[2] = 65535; - s->properties.limits.maxComputeWorkGroupInvocations = 128; - s->properties.limits.maxComputeWorkGroupSize[0] = 128; - s->properties.limits.maxComputeWorkGroupSize[1] = 128; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxCullDistances = 0; - s->properties.limits.maxDescriptorSetInputAttachments = 4; - s->properties.limits.maxDescriptorSetSampledImages = 96; - s->properties.limits.maxDescriptorSetSamplers = 96; - s->properties.limits.maxDescriptorSetStorageBuffers = 24; - s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; - s->properties.limits.maxDescriptorSetStorageImages = 24; - s->properties.limits.maxDescriptorSetUniformBuffers = 72; - s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; - s->properties.limits.maxDrawIndexedIndexValue = 16777216; - s->properties.limits.maxDrawIndirectCount = 1; - s->properties.limits.maxFragmentCombinedOutputResources = 4; - s->properties.limits.maxFragmentDualSrcAttachments = 0; - s->properties.limits.maxFragmentInputComponents = 64; - s->properties.limits.maxFragmentOutputAttachments = 4; - s->properties.limits.maxFramebufferHeight = 4096; - s->properties.limits.maxFramebufferLayers = 256; - s->properties.limits.maxFramebufferWidth = 4096; - s->properties.limits.maxGeometryInputComponents = 0; - s->properties.limits.maxGeometryOutputComponents = 0; - s->properties.limits.maxGeometryOutputVertices = 0; - s->properties.limits.maxGeometryShaderInvocations = 0; - s->properties.limits.maxGeometryTotalOutputComponents = 0; - s->properties.limits.maxImageArrayLayers = 256; - s->properties.limits.maxImageDimension1D = 4096; - s->properties.limits.maxImageDimension2D = 4096; - s->properties.limits.maxImageDimension3D = 256; - s->properties.limits.maxImageDimensionCube = 4096; - s->properties.limits.maxInterpolationOffset = 0.0f; - s->properties.limits.maxMemoryAllocationCount = 4096; - s->properties.limits.maxPerStageDescriptorInputAttachments = 4; - s->properties.limits.maxPerStageDescriptorSampledImages = 16; - s->properties.limits.maxPerStageDescriptorSamplers = 16; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; - s->properties.limits.maxPerStageDescriptorStorageImages = 4; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; - s->properties.limits.maxPerStageResources = 128; - s->properties.limits.maxPushConstantsSize = 128; - s->properties.limits.maxSampleMaskWords = 1; - s->properties.limits.maxSamplerAllocationCount = 4000; - s->properties.limits.maxSamplerAnisotropy = 1; - s->properties.limits.maxSamplerLodBias = 2; - s->properties.limits.maxStorageBufferRange = 134217728; - s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; - s->properties.limits.maxTessellationControlTotalOutputComponents = 0; - s->properties.limits.maxTessellationEvaluationInputComponents = 0; - s->properties.limits.maxTessellationEvaluationOutputComponents = 0; - s->properties.limits.maxTessellationGenerationLevel = 0; - s->properties.limits.maxTessellationPatchSize = 0; - s->properties.limits.maxTexelBufferElements = 65536; - s->properties.limits.maxTexelGatherOffset = 7; - s->properties.limits.maxTexelOffset = 7; - s->properties.limits.maxUniformBufferRange = 16384; - s->properties.limits.maxVertexInputAttributeOffset = 2047; - s->properties.limits.maxVertexInputAttributes = 16; - s->properties.limits.maxVertexInputBindingStride = 2048; - s->properties.limits.maxVertexInputBindings = 16; - s->properties.limits.maxVertexOutputComponents = 64; - s->properties.limits.maxViewportDimensions[0] = 4096; - s->properties.limits.maxViewportDimensions[1] = 4096; - s->properties.limits.maxViewports = 1; - s->properties.limits.minInterpolationOffset = 0.0f; - s->properties.limits.minMemoryMapAlignment = 64; - s->properties.limits.minStorageBufferOffsetAlignment = 256; - s->properties.limits.minTexelBufferOffsetAlignment = 256; - s->properties.limits.minTexelGatherOffset = -8; - s->properties.limits.minTexelOffset = -8; - s->properties.limits.minUniformBufferOffsetAlignment = 256; - s->properties.limits.mipmapPrecisionBits = 4; - s->properties.limits.nonCoherentAtomSize = 256; - s->properties.limits.pointSizeGranularity = 1.0f; - s->properties.limits.pointSizeRange[0] = 1.0f; - s->properties.limits.pointSizeRange[1] = 1.0f; - s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sparseAddressSpaceSize = 0; - s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.subPixelInterpolationOffsetBits = 0; - s->properties.limits.subPixelPrecisionBits = 4; - s->properties.limits.subTexelPrecisionBits = 4; - s->properties.limits.viewportBoundsRange[0] = -8192; - s->properties.limits.viewportBoundsRange[1] = 8192; - s->properties.limits.viewportSubPixelBits = 0; - s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.bufferImageGranularity <= 131072); - ret = ret && ((131072 % s->properties.limits.bufferImageGranularity) == 0); - ret = ret && (s->properties.limits.discreteQueuePriorities >= 2); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.lineWidthGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.lineWidthGranularity)); - ret = ret && (s->properties.limits.lineWidthRange[0] <= 1.0); - ret = ret && (s->properties.limits.lineWidthRange[1] >= 1.0); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 4); - ret = ret && (s->properties.limits.maxClipDistances >= 0); - ret = ret && (s->properties.limits.maxColorAttachments >= 4); - ret = ret && (s->properties.limits.maxCombinedClipAndCullDistances >= 0); - ret = ret && (s->properties.limits.maxComputeSharedMemorySize >= 16384); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[0] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[1] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[2] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxCullDistances >= 0); - ret = ret && (s->properties.limits.maxDescriptorSetInputAttachments >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 72); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); - ret = ret && (s->properties.limits.maxDrawIndexedIndexValue >= 16777216); - ret = ret && (s->properties.limits.maxDrawIndirectCount >= 1); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 4); - ret = ret && (s->properties.limits.maxFragmentDualSrcAttachments >= 0); - ret = ret && (s->properties.limits.maxFragmentInputComponents >= 64); - ret = ret && (s->properties.limits.maxFragmentOutputAttachments >= 4); - ret = ret && (s->properties.limits.maxFramebufferHeight >= 4096); - ret = ret && (s->properties.limits.maxFramebufferLayers >= 256); - ret = ret && (s->properties.limits.maxFramebufferWidth >= 4096); - ret = ret && (s->properties.limits.maxGeometryInputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputVertices >= 0); - ret = ret && (s->properties.limits.maxGeometryShaderInvocations >= 0); - ret = ret && (s->properties.limits.maxGeometryTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 256); - ret = ret && (s->properties.limits.maxImageDimension1D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension2D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension3D >= 256); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 4096); - ret = ret && (s->properties.limits.maxInterpolationOffset >= 0.0); - ret = ret && (s->properties.limits.maxMemoryAllocationCount >= 4096); - ret = ret && (s->properties.limits.maxPerStageDescriptorInputAttachments >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageResources >= 128); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 128); - ret = ret && (s->properties.limits.maxSampleMaskWords >= 1); - ret = ret && (s->properties.limits.maxSamplerAllocationCount >= 4000); - ret = ret && (s->properties.limits.maxSamplerAnisotropy >= 1); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 2); - ret = ret && (s->properties.limits.maxStorageBufferRange >= 134217728); - ret = ret && (s->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationGenerationLevel >= 0); - ret = ret && (s->properties.limits.maxTessellationPatchSize >= 0); - ret = ret && (s->properties.limits.maxTexelBufferElements >= 65536); - ret = ret && (s->properties.limits.maxTexelGatherOffset >= 7); - ret = ret && (s->properties.limits.maxTexelOffset >= 7); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 16384); - ret = ret && (s->properties.limits.maxVertexInputAttributeOffset >= 2047); - ret = ret && (s->properties.limits.maxVertexInputAttributes >= 16); - ret = ret && (s->properties.limits.maxVertexInputBindingStride >= 2048); - ret = ret && (s->properties.limits.maxVertexInputBindings >= 16); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 64); - ret = ret && (s->properties.limits.maxViewportDimensions[0] >= 4096); - ret = ret && (s->properties.limits.maxViewportDimensions[1] >= 4096); - ret = ret && (s->properties.limits.maxViewports >= 1); - ret = ret && (s->properties.limits.minInterpolationOffset <= 0.0); - ret = ret && (s->properties.limits.minMemoryMapAlignment <= 64); - ret = ret && ((s->properties.limits.minMemoryMapAlignment & (s->properties.limits.minMemoryMapAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minStorageBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minStorageBufferOffsetAlignment & (s->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minTexelBufferOffsetAlignment & (s->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelGatherOffset <= -8); - ret = ret && (s->properties.limits.minTexelOffset <= -8); - ret = ret && (s->properties.limits.minUniformBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minUniformBufferOffsetAlignment & (s->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 4); - ret = ret && (s->properties.limits.nonCoherentAtomSize <= 256); - ret = ret && ((s->properties.limits.nonCoherentAtomSize & (s->properties.limits.nonCoherentAtomSize - 1)) == 0); - ret = ret && (s->properties.limits.pointSizeGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.pointSizeGranularity)); - ret = ret && (s->properties.limits.pointSizeRange[0] <= 1.0); - ret = ret && (s->properties.limits.pointSizeRange[1] >= 1.0); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.sparseAddressSpaceSize >= 0); - ret = ret && (vpCheckFlags(s->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (s->properties.limits.subPixelInterpolationOffsetBits >= 0); - ret = ret && (s->properties.limits.subPixelPrecisionBits >= 4); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 4); - ret = ret && (s->properties.limits.viewportBoundsRange[0] <= -8192); - ret = ret && (s->properties.limits.viewportBoundsRange[1] >= 8192); - ret = ret && (s->properties.limits.viewportSubPixelBits >= 0); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyNonResidentStrict, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard3DBlockShape, VK_FALSE)); - } break; - default: break; - } - return ret; - } +namespace vulkan12requirements_roadmap2022 +{ +static const VpVariantDesc variants[] = { + { + "vulkan12requirements_roadmap2022", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan12requirements_roadmap2022::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan12requirements_roadmap2022::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan12requirements_roadmap2022::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan12requirements_roadmap2022 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - p->pNext = static_cast(static_cast(nullptr)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan13requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan13requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan13requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan13requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan13requirements::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan10requirements -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 -#endif // VP_LUNARG_minimum_requirements_1_0 - -#ifdef VP_LUNARG_minimum_requirements_1_1 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 { +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan13requirements -static const VkStructureType featureStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, +namespace vulkan13requirements_roadmap2022 +{ +static const VpVariantDesc variants[] = { + { + "vulkan13requirements_roadmap2022", + 0, + nullptr, + static_cast(std::size(blocks::vulkan13requirements_roadmap2022::deviceExtensions)), + blocks::vulkan13requirements_roadmap2022::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan13requirements_roadmap2022::featureDesc, + 0, + nullptr, + blocks::vulkan13requirements_roadmap2022::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan13requirements_roadmap2022::chainerDesc, + 0, + nullptr, + }, }; - -static const VkStructureType propertyStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan13requirements_roadmap2022 +} // namespace blocks + +static const VpCapabilitiesDesc capabilities[] = { + {blocks::vulkan10requirements::variantCount, blocks::vulkan10requirements::variants}, + {blocks::vulkan10requirements_roadmap2022::variantCount, blocks::vulkan10requirements_roadmap2022::variants}, + {blocks::vulkan11requirements::variantCount, blocks::vulkan11requirements::variants}, + {blocks::vulkan11requirements_roadmap2022::variantCount, blocks::vulkan11requirements_roadmap2022::variants}, + {blocks::vulkan12requirements::variantCount, blocks::vulkan12requirements::variants}, + {blocks::vulkan12requirements_roadmap2022::variantCount, blocks::vulkan12requirements_roadmap2022::variants}, + {blocks::vulkan13requirements::variantCount, blocks::vulkan13requirements::variants}, + {blocks::vulkan13requirements_roadmap2022::variantCount, blocks::vulkan13requirements_roadmap2022::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_KHR_ROADMAP_2022 +#endif // VP_KHR_roadmap_2022 -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - default: break; - } - return ret; - } +#ifdef VP_KHR_roadmap_2024 +namespace VP_KHR_ROADMAP_2024 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, + }, }; -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +namespace blocks +{ +namespace vulkan10requirements_roadmap2024 +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements_roadmap2024", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements_roadmap2024::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan10requirements_roadmap2024::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements_roadmap2024::chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements_roadmap2024 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceMultiviewFeatures)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceSubgroupProperties physicalDeviceSubgroupProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, nullptr }; - VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, &physicalDeviceSubgroupProperties }; - VkPhysicalDeviceMaintenance3Properties physicalDeviceMaintenance3Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, &physicalDeviceMultiviewProperties }; - p->pNext = static_cast(static_cast(&physicalDeviceMaintenance3Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan11requirements_roadmap2024 +{ +static const VpVariantDesc variants[] = { + { + "vulkan11requirements_roadmap2024", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan11requirements_roadmap2024::featureDesc, + 0, + nullptr, + blocks::vulkan11requirements_roadmap2024::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan11requirements_roadmap2024::chainerDesc, + 0, + nullptr, }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan11requirements_roadmap2024 -namespace vulkan10requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } +namespace vulkan12requirements_roadmap2024 +{ +static const VpVariantDesc variants[] = { + { + "vulkan12requirements_roadmap2024", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan12requirements_roadmap2024::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan12requirements_roadmap2024::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan12requirements_roadmap2024::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan12requirements_roadmap2024 -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.bufferImageGranularity = 131072; - s->properties.limits.discreteQueuePriorities = 2; - s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.lineWidthGranularity = 1.0f; - s->properties.limits.lineWidthRange[0] = 1.0f; - s->properties.limits.lineWidthRange[1] = 1.0f; - s->properties.limits.maxBoundDescriptorSets = 4; - s->properties.limits.maxClipDistances = 0; - s->properties.limits.maxColorAttachments = 4; - s->properties.limits.maxCombinedClipAndCullDistances = 0; - s->properties.limits.maxComputeSharedMemorySize = 16384; - s->properties.limits.maxComputeWorkGroupCount[0] = 65535; - s->properties.limits.maxComputeWorkGroupCount[1] = 65535; - s->properties.limits.maxComputeWorkGroupCount[2] = 65535; - s->properties.limits.maxComputeWorkGroupInvocations = 128; - s->properties.limits.maxComputeWorkGroupSize[0] = 128; - s->properties.limits.maxComputeWorkGroupSize[1] = 128; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxCullDistances = 0; - s->properties.limits.maxDescriptorSetInputAttachments = 4; - s->properties.limits.maxDescriptorSetSampledImages = 96; - s->properties.limits.maxDescriptorSetSamplers = 96; - s->properties.limits.maxDescriptorSetStorageBuffers = 24; - s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; - s->properties.limits.maxDescriptorSetStorageImages = 24; - s->properties.limits.maxDescriptorSetUniformBuffers = 72; - s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; - s->properties.limits.maxDrawIndexedIndexValue = 16777216; - s->properties.limits.maxDrawIndirectCount = 1; - s->properties.limits.maxFragmentCombinedOutputResources = 4; - s->properties.limits.maxFragmentDualSrcAttachments = 0; - s->properties.limits.maxFragmentInputComponents = 64; - s->properties.limits.maxFragmentOutputAttachments = 4; - s->properties.limits.maxFramebufferHeight = 4096; - s->properties.limits.maxFramebufferLayers = 256; - s->properties.limits.maxFramebufferWidth = 4096; - s->properties.limits.maxGeometryInputComponents = 0; - s->properties.limits.maxGeometryOutputComponents = 0; - s->properties.limits.maxGeometryOutputVertices = 0; - s->properties.limits.maxGeometryShaderInvocations = 0; - s->properties.limits.maxGeometryTotalOutputComponents = 0; - s->properties.limits.maxImageArrayLayers = 256; - s->properties.limits.maxImageDimension1D = 4096; - s->properties.limits.maxImageDimension2D = 4096; - s->properties.limits.maxImageDimension3D = 256; - s->properties.limits.maxImageDimensionCube = 4096; - s->properties.limits.maxInterpolationOffset = 0.0f; - s->properties.limits.maxMemoryAllocationCount = 4096; - s->properties.limits.maxPerStageDescriptorInputAttachments = 4; - s->properties.limits.maxPerStageDescriptorSampledImages = 16; - s->properties.limits.maxPerStageDescriptorSamplers = 16; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; - s->properties.limits.maxPerStageDescriptorStorageImages = 4; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; - s->properties.limits.maxPerStageResources = 128; - s->properties.limits.maxPushConstantsSize = 128; - s->properties.limits.maxSampleMaskWords = 1; - s->properties.limits.maxSamplerAllocationCount = 4000; - s->properties.limits.maxSamplerAnisotropy = 1; - s->properties.limits.maxSamplerLodBias = 2; - s->properties.limits.maxStorageBufferRange = 134217728; - s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; - s->properties.limits.maxTessellationControlTotalOutputComponents = 0; - s->properties.limits.maxTessellationEvaluationInputComponents = 0; - s->properties.limits.maxTessellationEvaluationOutputComponents = 0; - s->properties.limits.maxTessellationGenerationLevel = 0; - s->properties.limits.maxTessellationPatchSize = 0; - s->properties.limits.maxTexelBufferElements = 65536; - s->properties.limits.maxTexelGatherOffset = 7; - s->properties.limits.maxTexelOffset = 7; - s->properties.limits.maxUniformBufferRange = 16384; - s->properties.limits.maxVertexInputAttributeOffset = 2047; - s->properties.limits.maxVertexInputAttributes = 16; - s->properties.limits.maxVertexInputBindingStride = 2048; - s->properties.limits.maxVertexInputBindings = 16; - s->properties.limits.maxVertexOutputComponents = 64; - s->properties.limits.maxViewportDimensions[0] = 4096; - s->properties.limits.maxViewportDimensions[1] = 4096; - s->properties.limits.maxViewports = 1; - s->properties.limits.minInterpolationOffset = 0.0f; - s->properties.limits.minMemoryMapAlignment = 64; - s->properties.limits.minStorageBufferOffsetAlignment = 256; - s->properties.limits.minTexelBufferOffsetAlignment = 256; - s->properties.limits.minTexelGatherOffset = -8; - s->properties.limits.minTexelOffset = -8; - s->properties.limits.minUniformBufferOffsetAlignment = 256; - s->properties.limits.mipmapPrecisionBits = 4; - s->properties.limits.nonCoherentAtomSize = 256; - s->properties.limits.pointSizeGranularity = 1.0f; - s->properties.limits.pointSizeRange[0] = 1.0f; - s->properties.limits.pointSizeRange[1] = 1.0f; - s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sparseAddressSpaceSize = 0; - s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.subPixelInterpolationOffsetBits = 0; - s->properties.limits.subPixelPrecisionBits = 4; - s->properties.limits.subTexelPrecisionBits = 4; - s->properties.limits.viewportBoundsRange[0] = -8192; - s->properties.limits.viewportBoundsRange[1] = 8192; - s->properties.limits.viewportSubPixelBits = 0; - s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.bufferImageGranularity <= 131072); - ret = ret && ((131072 % s->properties.limits.bufferImageGranularity) == 0); - ret = ret && (s->properties.limits.discreteQueuePriorities >= 2); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.lineWidthGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.lineWidthGranularity)); - ret = ret && (s->properties.limits.lineWidthRange[0] <= 1.0); - ret = ret && (s->properties.limits.lineWidthRange[1] >= 1.0); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 4); - ret = ret && (s->properties.limits.maxClipDistances >= 0); - ret = ret && (s->properties.limits.maxColorAttachments >= 4); - ret = ret && (s->properties.limits.maxCombinedClipAndCullDistances >= 0); - ret = ret && (s->properties.limits.maxComputeSharedMemorySize >= 16384); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[0] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[1] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[2] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxCullDistances >= 0); - ret = ret && (s->properties.limits.maxDescriptorSetInputAttachments >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 72); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); - ret = ret && (s->properties.limits.maxDrawIndexedIndexValue >= 16777216); - ret = ret && (s->properties.limits.maxDrawIndirectCount >= 1); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 4); - ret = ret && (s->properties.limits.maxFragmentDualSrcAttachments >= 0); - ret = ret && (s->properties.limits.maxFragmentInputComponents >= 64); - ret = ret && (s->properties.limits.maxFragmentOutputAttachments >= 4); - ret = ret && (s->properties.limits.maxFramebufferHeight >= 4096); - ret = ret && (s->properties.limits.maxFramebufferLayers >= 256); - ret = ret && (s->properties.limits.maxFramebufferWidth >= 4096); - ret = ret && (s->properties.limits.maxGeometryInputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputVertices >= 0); - ret = ret && (s->properties.limits.maxGeometryShaderInvocations >= 0); - ret = ret && (s->properties.limits.maxGeometryTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 256); - ret = ret && (s->properties.limits.maxImageDimension1D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension2D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension3D >= 256); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 4096); - ret = ret && (s->properties.limits.maxInterpolationOffset >= 0.0); - ret = ret && (s->properties.limits.maxMemoryAllocationCount >= 4096); - ret = ret && (s->properties.limits.maxPerStageDescriptorInputAttachments >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageResources >= 128); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 128); - ret = ret && (s->properties.limits.maxSampleMaskWords >= 1); - ret = ret && (s->properties.limits.maxSamplerAllocationCount >= 4000); - ret = ret && (s->properties.limits.maxSamplerAnisotropy >= 1); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 2); - ret = ret && (s->properties.limits.maxStorageBufferRange >= 134217728); - ret = ret && (s->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationGenerationLevel >= 0); - ret = ret && (s->properties.limits.maxTessellationPatchSize >= 0); - ret = ret && (s->properties.limits.maxTexelBufferElements >= 65536); - ret = ret && (s->properties.limits.maxTexelGatherOffset >= 7); - ret = ret && (s->properties.limits.maxTexelOffset >= 7); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 16384); - ret = ret && (s->properties.limits.maxVertexInputAttributeOffset >= 2047); - ret = ret && (s->properties.limits.maxVertexInputAttributes >= 16); - ret = ret && (s->properties.limits.maxVertexInputBindingStride >= 2048); - ret = ret && (s->properties.limits.maxVertexInputBindings >= 16); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 64); - ret = ret && (s->properties.limits.maxViewportDimensions[0] >= 4096); - ret = ret && (s->properties.limits.maxViewportDimensions[1] >= 4096); - ret = ret && (s->properties.limits.maxViewports >= 1); - ret = ret && (s->properties.limits.minInterpolationOffset <= 0.0); - ret = ret && (s->properties.limits.minMemoryMapAlignment <= 64); - ret = ret && ((s->properties.limits.minMemoryMapAlignment & (s->properties.limits.minMemoryMapAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minStorageBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minStorageBufferOffsetAlignment & (s->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minTexelBufferOffsetAlignment & (s->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelGatherOffset <= -8); - ret = ret && (s->properties.limits.minTexelOffset <= -8); - ret = ret && (s->properties.limits.minUniformBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minUniformBufferOffsetAlignment & (s->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 4); - ret = ret && (s->properties.limits.nonCoherentAtomSize <= 256); - ret = ret && ((s->properties.limits.nonCoherentAtomSize & (s->properties.limits.nonCoherentAtomSize - 1)) == 0); - ret = ret && (s->properties.limits.pointSizeGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.pointSizeGranularity)); - ret = ret && (s->properties.limits.pointSizeRange[0] <= 1.0); - ret = ret && (s->properties.limits.pointSizeRange[1] >= 1.0); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.sparseAddressSpaceSize >= 0); - ret = ret && (vpCheckFlags(s->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (s->properties.limits.subPixelInterpolationOffsetBits >= 0); - ret = ret && (s->properties.limits.subPixelPrecisionBits >= 4); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 4); - ret = ret && (s->properties.limits.viewportBoundsRange[0] <= -8192); - ret = ret && (s->properties.limits.viewportBoundsRange[1] >= 8192); - ret = ret && (s->properties.limits.viewportSubPixelBits >= 0); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyNonResidentStrict, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard3DBlockShape, VK_FALSE)); - } break; - default: break; - } - return ret; - } +namespace vulkan13requirements_roadmap2024 +{ +static const VpVariantDesc variants[] = { + { + "vulkan13requirements_roadmap2024", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan13requirements_roadmap2024::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan13requirements_roadmap2024::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan13requirements_roadmap2024::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan13requirements_roadmap2024 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceMultiviewFeatures)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceSubgroupProperties physicalDeviceSubgroupProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, nullptr }; - VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, &physicalDeviceSubgroupProperties }; - VkPhysicalDeviceMaintenance3Properties physicalDeviceMaintenance3Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, &physicalDeviceMultiviewProperties }; - p->pNext = static_cast(static_cast(&physicalDeviceMaintenance3Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkanextensionrequirements_roadmap2024 +{ +static const VpVariantDesc variants[] = { + { + "vulkanextensionrequirements_roadmap2024", + 0, + nullptr, + static_cast(std::size(blocks::vulkanextensionrequirements_roadmap2024::deviceExtensions)), + blocks::vulkanextensionrequirements_roadmap2024::deviceExtensions, + 0, + nullptr, + blocks::vulkanextensionrequirements_roadmap2024::featureDesc, + 0, + nullptr, + blocks::vulkanextensionrequirements_roadmap2024::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkanextensionrequirements_roadmap2024::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan10requirements -namespace vulkan11requirements_split { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { - VkPhysicalDeviceMultiviewFeatures* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - default: break; - } - return ret; - } +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkanextensionrequirements_roadmap2024 +} // namespace blocks + +static const VpCapabilitiesDesc capabilities[] = { + {blocks::vulkan10requirements_roadmap2024::variantCount, blocks::vulkan10requirements_roadmap2024::variants}, + {blocks::vulkan11requirements_roadmap2024::variantCount, blocks::vulkan11requirements_roadmap2024::variants}, + {blocks::vulkan12requirements_roadmap2024::variantCount, blocks::vulkan12requirements_roadmap2024::variants}, + {blocks::vulkan13requirements_roadmap2024::variantCount, blocks::vulkan13requirements_roadmap2024::variants}, + {blocks::vulkanextensionrequirements_roadmap2024::variantCount, blocks::vulkanextensionrequirements_roadmap2024::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: { - VkPhysicalDeviceSubgroupProperties* s = static_cast(static_cast(p)); - s->subgroupSize = 1; - s->supportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); - s->supportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: { - VkPhysicalDeviceMultiviewProperties* s = static_cast(static_cast(p)); - s->maxMultiviewInstanceIndex = 134217727; - s->maxMultiviewViewCount = 6; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: { - VkPhysicalDeviceMaintenance3Properties* s = static_cast(static_cast(p)); - s->maxMemoryAllocationSize = 1073741824; - s->maxPerSetDescriptors = 1024; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: { - VkPhysicalDeviceSubgroupProperties* s = static_cast(static_cast(p)); - ret = ret && (s->subgroupSize >= 1); - ret = ret && ((s->subgroupSize & (s->subgroupSize - 1)) == 0); - ret = ret && (vpCheckFlags(s->supportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); - ret = ret && (vpCheckFlags(s->supportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: { - VkPhysicalDeviceMultiviewProperties* s = static_cast(static_cast(p)); - ret = ret && (s->maxMultiviewInstanceIndex >= 134217727); - ret = ret && (s->maxMultiviewViewCount >= 6); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: { - VkPhysicalDeviceMaintenance3Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxMemoryAllocationSize >= 1073741824); - ret = ret && (s->maxPerSetDescriptors >= 1024); - } break; - default: break; - } - return ret; - } +static const VpProfileProperties profiles[] = { + {VP_KHR_ROADMAP_2022_NAME, VP_KHR_ROADMAP_2022_SPEC_VERSION}, }; +static const uint32_t profileCount = static_cast(std::size(profiles)); +} // namespace VP_KHR_ROADMAP_2024 +#endif // VP_KHR_roadmap_2024 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr }; - p->pNext = static_cast(static_cast(&physicalDeviceMultiviewFeatures)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceSubgroupProperties physicalDeviceSubgroupProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, nullptr }; - VkPhysicalDeviceMultiviewProperties physicalDeviceMultiviewProperties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, &physicalDeviceSubgroupProperties }; - VkPhysicalDeviceMaintenance3Properties physicalDeviceMaintenance3Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, &physicalDeviceMultiviewProperties }; - p->pNext = static_cast(static_cast(&physicalDeviceMaintenance3Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +#ifdef VP_LUNARG_desktop_baseline_2022 +namespace VP_LUNARG_DESKTOP_BASELINE_2022 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan11requirements_split -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 -#endif // VP_LUNARG_minimum_requirements_1_1 - -#ifdef VP_LUNARG_minimum_requirements_1_2 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 { - -static const VkStructureType featureStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, -}; -static const VkStructureType propertyStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, +namespace blocks +{ +namespace VP_LUNARG_desktop_baseline_2022_block +{ +static const VpVariantDesc variants[] = { + { + "VP_LUNARG_desktop_baseline_2022_block", + 0, + nullptr, + static_cast(std::size(blocks::VP_LUNARG_desktop_baseline_2022_block::deviceExtensions)), + blocks::VP_LUNARG_desktop_baseline_2022_block::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::VP_LUNARG_desktop_baseline_2022_block::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::VP_LUNARG_desktop_baseline_2022_block::propertyDesc, + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(formatStructTypes)), + formatStructTypes, + static_cast(std::size(blocks::VP_LUNARG_desktop_baseline_2022_block::formatDesc)), + blocks::VP_LUNARG_desktop_baseline_2022_block::formatDesc, + blocks::VP_LUNARG_desktop_baseline_2022_block::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace VP_LUNARG_desktop_baseline_2022_block +} // namespace blocks -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::VP_LUNARG_desktop_baseline_2022_block::variantCount, blocks::VP_LUNARG_desktop_baseline_2022_block::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_DESKTOP_BASELINE_2022 +#endif // VP_LUNARG_desktop_baseline_2022 -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +#ifdef VP_LUNARG_desktop_baseline_2023 +namespace VP_LUNARG_DESKTOP_BASELINE_2023 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace blocks +{ +namespace VP_LUNARG_desktop_baseline_2023_block +{ +static const VpVariantDesc variants[] = { + { + "VP_LUNARG_desktop_baseline_2023_block", + 0, + nullptr, + static_cast(std::size(blocks::VP_LUNARG_desktop_baseline_2023_block::deviceExtensions)), + blocks::VP_LUNARG_desktop_baseline_2023_block::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::VP_LUNARG_desktop_baseline_2023_block::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::VP_LUNARG_desktop_baseline_2023_block::propertyDesc, + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(formatStructTypes)), + formatStructTypes, + static_cast(std::size(blocks::VP_LUNARG_desktop_baseline_2023_block::formatDesc)), + blocks::VP_LUNARG_desktop_baseline_2023_block::formatDesc, + blocks::VP_LUNARG_desktop_baseline_2023_block::chainerDesc, + 0, + nullptr, }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace VP_LUNARG_desktop_baseline_2023_block +} // namespace blocks -namespace vulkan10requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::VP_LUNARG_desktop_baseline_2023_block::variantCount, blocks::VP_LUNARG_desktop_baseline_2023_block::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_DESKTOP_BASELINE_2023 +#endif // VP_LUNARG_desktop_baseline_2023 -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.bufferImageGranularity = 131072; - s->properties.limits.discreteQueuePriorities = 2; - s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.lineWidthGranularity = 1.0f; - s->properties.limits.lineWidthRange[0] = 1.0f; - s->properties.limits.lineWidthRange[1] = 1.0f; - s->properties.limits.maxBoundDescriptorSets = 4; - s->properties.limits.maxClipDistances = 0; - s->properties.limits.maxColorAttachments = 4; - s->properties.limits.maxCombinedClipAndCullDistances = 0; - s->properties.limits.maxComputeSharedMemorySize = 16384; - s->properties.limits.maxComputeWorkGroupCount[0] = 65535; - s->properties.limits.maxComputeWorkGroupCount[1] = 65535; - s->properties.limits.maxComputeWorkGroupCount[2] = 65535; - s->properties.limits.maxComputeWorkGroupInvocations = 128; - s->properties.limits.maxComputeWorkGroupSize[0] = 128; - s->properties.limits.maxComputeWorkGroupSize[1] = 128; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxCullDistances = 0; - s->properties.limits.maxDescriptorSetInputAttachments = 4; - s->properties.limits.maxDescriptorSetSampledImages = 96; - s->properties.limits.maxDescriptorSetSamplers = 96; - s->properties.limits.maxDescriptorSetStorageBuffers = 24; - s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; - s->properties.limits.maxDescriptorSetStorageImages = 24; - s->properties.limits.maxDescriptorSetUniformBuffers = 72; - s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; - s->properties.limits.maxDrawIndexedIndexValue = 16777216; - s->properties.limits.maxDrawIndirectCount = 1; - s->properties.limits.maxFragmentCombinedOutputResources = 4; - s->properties.limits.maxFragmentDualSrcAttachments = 0; - s->properties.limits.maxFragmentInputComponents = 64; - s->properties.limits.maxFragmentOutputAttachments = 4; - s->properties.limits.maxFramebufferHeight = 4096; - s->properties.limits.maxFramebufferLayers = 256; - s->properties.limits.maxFramebufferWidth = 4096; - s->properties.limits.maxGeometryInputComponents = 0; - s->properties.limits.maxGeometryOutputComponents = 0; - s->properties.limits.maxGeometryOutputVertices = 0; - s->properties.limits.maxGeometryShaderInvocations = 0; - s->properties.limits.maxGeometryTotalOutputComponents = 0; - s->properties.limits.maxImageArrayLayers = 256; - s->properties.limits.maxImageDimension1D = 4096; - s->properties.limits.maxImageDimension2D = 4096; - s->properties.limits.maxImageDimension3D = 256; - s->properties.limits.maxImageDimensionCube = 4096; - s->properties.limits.maxInterpolationOffset = 0.0f; - s->properties.limits.maxMemoryAllocationCount = 4096; - s->properties.limits.maxPerStageDescriptorInputAttachments = 4; - s->properties.limits.maxPerStageDescriptorSampledImages = 16; - s->properties.limits.maxPerStageDescriptorSamplers = 16; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; - s->properties.limits.maxPerStageDescriptorStorageImages = 4; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; - s->properties.limits.maxPerStageResources = 128; - s->properties.limits.maxPushConstantsSize = 128; - s->properties.limits.maxSampleMaskWords = 1; - s->properties.limits.maxSamplerAllocationCount = 4000; - s->properties.limits.maxSamplerAnisotropy = 1; - s->properties.limits.maxSamplerLodBias = 2; - s->properties.limits.maxStorageBufferRange = 134217728; - s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; - s->properties.limits.maxTessellationControlTotalOutputComponents = 0; - s->properties.limits.maxTessellationEvaluationInputComponents = 0; - s->properties.limits.maxTessellationEvaluationOutputComponents = 0; - s->properties.limits.maxTessellationGenerationLevel = 0; - s->properties.limits.maxTessellationPatchSize = 0; - s->properties.limits.maxTexelBufferElements = 65536; - s->properties.limits.maxTexelGatherOffset = 7; - s->properties.limits.maxTexelOffset = 7; - s->properties.limits.maxUniformBufferRange = 16384; - s->properties.limits.maxVertexInputAttributeOffset = 2047; - s->properties.limits.maxVertexInputAttributes = 16; - s->properties.limits.maxVertexInputBindingStride = 2048; - s->properties.limits.maxVertexInputBindings = 16; - s->properties.limits.maxVertexOutputComponents = 64; - s->properties.limits.maxViewportDimensions[0] = 4096; - s->properties.limits.maxViewportDimensions[1] = 4096; - s->properties.limits.maxViewports = 1; - s->properties.limits.minInterpolationOffset = 0.0f; - s->properties.limits.minMemoryMapAlignment = 64; - s->properties.limits.minStorageBufferOffsetAlignment = 256; - s->properties.limits.minTexelBufferOffsetAlignment = 256; - s->properties.limits.minTexelGatherOffset = -8; - s->properties.limits.minTexelOffset = -8; - s->properties.limits.minUniformBufferOffsetAlignment = 256; - s->properties.limits.mipmapPrecisionBits = 4; - s->properties.limits.nonCoherentAtomSize = 256; - s->properties.limits.pointSizeGranularity = 1.0f; - s->properties.limits.pointSizeRange[0] = 1.0f; - s->properties.limits.pointSizeRange[1] = 1.0f; - s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sparseAddressSpaceSize = 0; - s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.subPixelInterpolationOffsetBits = 0; - s->properties.limits.subPixelPrecisionBits = 4; - s->properties.limits.subTexelPrecisionBits = 4; - s->properties.limits.viewportBoundsRange[0] = -8192; - s->properties.limits.viewportBoundsRange[1] = 8192; - s->properties.limits.viewportSubPixelBits = 0; - s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.bufferImageGranularity <= 131072); - ret = ret && ((131072 % s->properties.limits.bufferImageGranularity) == 0); - ret = ret && (s->properties.limits.discreteQueuePriorities >= 2); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.lineWidthGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.lineWidthGranularity)); - ret = ret && (s->properties.limits.lineWidthRange[0] <= 1.0); - ret = ret && (s->properties.limits.lineWidthRange[1] >= 1.0); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 4); - ret = ret && (s->properties.limits.maxClipDistances >= 0); - ret = ret && (s->properties.limits.maxColorAttachments >= 4); - ret = ret && (s->properties.limits.maxCombinedClipAndCullDistances >= 0); - ret = ret && (s->properties.limits.maxComputeSharedMemorySize >= 16384); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[0] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[1] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[2] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxCullDistances >= 0); - ret = ret && (s->properties.limits.maxDescriptorSetInputAttachments >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 72); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); - ret = ret && (s->properties.limits.maxDrawIndexedIndexValue >= 16777216); - ret = ret && (s->properties.limits.maxDrawIndirectCount >= 1); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 4); - ret = ret && (s->properties.limits.maxFragmentDualSrcAttachments >= 0); - ret = ret && (s->properties.limits.maxFragmentInputComponents >= 64); - ret = ret && (s->properties.limits.maxFragmentOutputAttachments >= 4); - ret = ret && (s->properties.limits.maxFramebufferHeight >= 4096); - ret = ret && (s->properties.limits.maxFramebufferLayers >= 256); - ret = ret && (s->properties.limits.maxFramebufferWidth >= 4096); - ret = ret && (s->properties.limits.maxGeometryInputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputVertices >= 0); - ret = ret && (s->properties.limits.maxGeometryShaderInvocations >= 0); - ret = ret && (s->properties.limits.maxGeometryTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 256); - ret = ret && (s->properties.limits.maxImageDimension1D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension2D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension3D >= 256); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 4096); - ret = ret && (s->properties.limits.maxInterpolationOffset >= 0.0); - ret = ret && (s->properties.limits.maxMemoryAllocationCount >= 4096); - ret = ret && (s->properties.limits.maxPerStageDescriptorInputAttachments >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageResources >= 128); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 128); - ret = ret && (s->properties.limits.maxSampleMaskWords >= 1); - ret = ret && (s->properties.limits.maxSamplerAllocationCount >= 4000); - ret = ret && (s->properties.limits.maxSamplerAnisotropy >= 1); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 2); - ret = ret && (s->properties.limits.maxStorageBufferRange >= 134217728); - ret = ret && (s->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationGenerationLevel >= 0); - ret = ret && (s->properties.limits.maxTessellationPatchSize >= 0); - ret = ret && (s->properties.limits.maxTexelBufferElements >= 65536); - ret = ret && (s->properties.limits.maxTexelGatherOffset >= 7); - ret = ret && (s->properties.limits.maxTexelOffset >= 7); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 16384); - ret = ret && (s->properties.limits.maxVertexInputAttributeOffset >= 2047); - ret = ret && (s->properties.limits.maxVertexInputAttributes >= 16); - ret = ret && (s->properties.limits.maxVertexInputBindingStride >= 2048); - ret = ret && (s->properties.limits.maxVertexInputBindings >= 16); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 64); - ret = ret && (s->properties.limits.maxViewportDimensions[0] >= 4096); - ret = ret && (s->properties.limits.maxViewportDimensions[1] >= 4096); - ret = ret && (s->properties.limits.maxViewports >= 1); - ret = ret && (s->properties.limits.minInterpolationOffset <= 0.0); - ret = ret && (s->properties.limits.minMemoryMapAlignment <= 64); - ret = ret && ((s->properties.limits.minMemoryMapAlignment & (s->properties.limits.minMemoryMapAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minStorageBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minStorageBufferOffsetAlignment & (s->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minTexelBufferOffsetAlignment & (s->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelGatherOffset <= -8); - ret = ret && (s->properties.limits.minTexelOffset <= -8); - ret = ret && (s->properties.limits.minUniformBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minUniformBufferOffsetAlignment & (s->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 4); - ret = ret && (s->properties.limits.nonCoherentAtomSize <= 256); - ret = ret && ((s->properties.limits.nonCoherentAtomSize & (s->properties.limits.nonCoherentAtomSize - 1)) == 0); - ret = ret && (s->properties.limits.pointSizeGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.pointSizeGranularity)); - ret = ret && (s->properties.limits.pointSizeRange[0] <= 1.0); - ret = ret && (s->properties.limits.pointSizeRange[1] >= 1.0); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.sparseAddressSpaceSize >= 0); - ret = ret && (vpCheckFlags(s->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (s->properties.limits.subPixelInterpolationOffsetBits >= 0); - ret = ret && (s->properties.limits.subPixelPrecisionBits >= 4); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 4); - ret = ret && (s->properties.limits.viewportBoundsRange[0] <= -8192); - ret = ret && (s->properties.limits.viewportBoundsRange[1] >= 8192); - ret = ret && (s->properties.limits.viewportSubPixelBits >= 0); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyNonResidentStrict, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard3DBlockShape, VK_FALSE)); - } break; - default: break; - } - return ret; - } +#ifdef VP_LUNARG_desktop_baseline_2024 +namespace VP_LUNARG_DESKTOP_BASELINE_2024 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + static_cast(std::size(deviceExtensions)), + deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, + }, }; -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace blocks +{ +namespace VP_LUNARG_desktop_baseline_2024_block +{ +static const VpVariantDesc variants[] = { + { + "VP_LUNARG_desktop_baseline_2024_block", + 0, + nullptr, + static_cast(std::size(blocks::VP_LUNARG_desktop_baseline_2024_block::deviceExtensions)), + blocks::VP_LUNARG_desktop_baseline_2024_block::deviceExtensions, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::VP_LUNARG_desktop_baseline_2024_block::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::VP_LUNARG_desktop_baseline_2024_block::propertyDesc, + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(formatStructTypes)), + formatStructTypes, + static_cast(std::size(blocks::VP_LUNARG_desktop_baseline_2024_block::formatDesc)), + blocks::VP_LUNARG_desktop_baseline_2024_block::formatDesc, + blocks::VP_LUNARG_desktop_baseline_2024_block::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan10requirements -namespace vulkan11requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace VP_LUNARG_desktop_baseline_2024_block +} // namespace blocks -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - s->maxMemoryAllocationSize = 1073741824; - s->maxMultiviewInstanceIndex = 134217727; - s->maxMultiviewViewCount = 6; - s->maxPerSetDescriptors = 1024; - s->subgroupSize = 1; - s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); - s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxMemoryAllocationSize >= 1073741824); - ret = ret && (s->maxMultiviewInstanceIndex >= 134217727); - ret = ret && (s->maxMultiviewViewCount >= 6); - ret = ret && (s->maxPerSetDescriptors >= 1024); - ret = ret && (s->subgroupSize >= 1); - ret = ret && ((s->subgroupSize & (s->subgroupSize - 1)) == 0); - ret = ret && (vpCheckFlags(s->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); - ret = ret && (vpCheckFlags(s->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::VP_LUNARG_desktop_baseline_2024_block::variantCount, blocks::VP_LUNARG_desktop_baseline_2024_block::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_DESKTOP_BASELINE_2024 +#endif // VP_LUNARG_desktop_baseline_2024 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +#ifdef VP_LUNARG_minimum_requirements_1_0 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan11requirements -namespace vulkan12requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - } break; - default: break; - } - return ret; - } + +namespace blocks +{ +namespace vulkan10requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan10requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements +} // namespace blocks -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - s->filterMinmaxImageComponentMapping = VK_FALSE; - s->filterMinmaxSingleComponentFormats = VK_FALSE; - s->framebufferIntegerColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->independentResolve = VK_FALSE; - s->independentResolveNone = VK_FALSE; - s->maxDescriptorSetUpdateAfterBindInputAttachments = 0; - s->maxDescriptorSetUpdateAfterBindSampledImages = 0; - s->maxDescriptorSetUpdateAfterBindSamplers = 0; - s->maxDescriptorSetUpdateAfterBindStorageBuffers = 0; - s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 0; - s->maxDescriptorSetUpdateAfterBindStorageImages = 0; - s->maxDescriptorSetUpdateAfterBindUniformBuffers = 0; - s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 0; - s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 0; - s->maxPerStageDescriptorUpdateAfterBindSampledImages = 0; - s->maxPerStageDescriptorUpdateAfterBindSamplers = 0; - s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 0; - s->maxPerStageDescriptorUpdateAfterBindStorageImages = 0; - s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 0; - s->maxPerStageUpdateAfterBindResources = 0; - s->maxTimelineSemaphoreValueDifference = 2147483647; - s->maxUpdateAfterBindDescriptorsInAllPools = 0; - s->quadDivergentImplicitLod = VK_FALSE; - s->robustBufferAccessUpdateAfterBind = VK_FALSE; - s->shaderDenormFlushToZeroFloat16 = VK_FALSE; - s->shaderDenormFlushToZeroFloat32 = VK_FALSE; - s->shaderDenormFlushToZeroFloat64 = VK_FALSE; - s->shaderDenormPreserveFloat16 = VK_FALSE; - s->shaderDenormPreserveFloat32 = VK_FALSE; - s->shaderDenormPreserveFloat64 = VK_FALSE; - s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; - s->shaderRoundingModeRTEFloat16 = VK_FALSE; - s->shaderRoundingModeRTEFloat32 = VK_FALSE; - s->shaderRoundingModeRTEFloat64 = VK_FALSE; - s->shaderRoundingModeRTZFloat16 = VK_FALSE; - s->shaderRoundingModeRTZFloat32 = VK_FALSE; - s->shaderRoundingModeRTZFloat64 = VK_FALSE; - s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; - s->shaderSignedZeroInfNanPreserveFloat16 = VK_FALSE; - s->shaderSignedZeroInfNanPreserveFloat32 = VK_FALSE; - s->shaderSignedZeroInfNanPreserveFloat64 = VK_FALSE; - s->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE; - s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; - s->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->filterMinmaxImageComponentMapping, VK_FALSE)); - ret = ret && (vpCheckFlags(s->filterMinmaxSingleComponentFormats, VK_FALSE)); - ret = ret && (vpCheckFlags(s->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (vpCheckFlags(s->independentResolve, VK_FALSE)); - ret = ret && (vpCheckFlags(s->independentResolveNone, VK_FALSE)); - ret = ret && (s->maxDescriptorSetUpdateAfterBindInputAttachments >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindSampledImages >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindSamplers >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageBuffers >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageImages >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindUniformBuffers >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindSampledImages >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindSamplers >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindStorageImages >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0); - ret = ret && (s->maxPerStageUpdateAfterBindResources >= 0); - ret = ret && (s->maxTimelineSemaphoreValueDifference >= 2147483647); - ret = ret && (s->maxUpdateAfterBindDescriptorsInAllPools >= 0); - ret = ret && (vpCheckFlags(s->quadDivergentImplicitLod, VK_FALSE)); - ret = ret && (vpCheckFlags(s->robustBufferAccessUpdateAfterBind, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormFlushToZeroFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormFlushToZeroFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormFlushToZeroFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormPreserveFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormPreserveFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormPreserveFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderInputAttachmentArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTZFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTZFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTZFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSampledImageArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderStorageBufferArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderStorageImageArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderUniformBufferArrayNonUniformIndexingNative, VK_FALSE)); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::vulkan10requirements::variantCount, blocks::vulkan10requirements::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 +#endif // VP_LUNARG_minimum_requirements_1_0 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan12Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +#ifdef VP_LUNARG_minimum_requirements_1_1 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan12requirements -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 -#endif // VP_LUNARG_minimum_requirements_1_2 - -#ifdef VP_LUNARG_minimum_requirements_1_3 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 { -static const VkStructureType featureStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, +namespace blocks +{ +namespace vulkan10requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan10requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements -static const VkStructureType propertyStructTypes[] = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, +namespace vulkan11requirements_split +{ +static const VpVariantDesc variants[] = { + { + "vulkan11requirements_split", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan11requirements_split::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan11requirements_split::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan11requirements_split::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan11requirements_split +} // namespace blocks -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->bufferDeviceAddress = VK_TRUE; - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - s->vulkanMemoryModel = VK_TRUE; - s->vulkanMemoryModelDeviceScope = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - s->computeFullSubgroups = VK_TRUE; - s->dynamicRendering = VK_TRUE; - s->inlineUniformBlock = VK_TRUE; - s->maintenance4 = VK_TRUE; - s->pipelineCreationCacheControl = VK_TRUE; - s->robustImageAccess = VK_TRUE; - s->shaderDemoteToHelperInvocation = VK_TRUE; - s->shaderIntegerDotProduct = VK_TRUE; - s->shaderTerminateInvocation = VK_TRUE; - s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; - s->subgroupSizeControl = VK_TRUE; - s->synchronization2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->bufferDeviceAddress == VK_TRUE); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - ret = ret && (s->vulkanMemoryModel == VK_TRUE); - ret = ret && (s->vulkanMemoryModelDeviceScope == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - ret = ret && (s->computeFullSubgroups == VK_TRUE); - ret = ret && (s->dynamicRendering == VK_TRUE); - ret = ret && (s->inlineUniformBlock == VK_TRUE); - ret = ret && (s->maintenance4 == VK_TRUE); - ret = ret && (s->pipelineCreationCacheControl == VK_TRUE); - ret = ret && (s->robustImageAccess == VK_TRUE); - ret = ret && (s->shaderDemoteToHelperInvocation == VK_TRUE); - ret = ret && (s->shaderIntegerDotProduct == VK_TRUE); - ret = ret && (s->shaderTerminateInvocation == VK_TRUE); - ret = ret && (s->shaderZeroInitializeWorkgroupMemory == VK_TRUE); - ret = ret && (s->subgroupSizeControl == VK_TRUE); - ret = ret && (s->synchronization2 == VK_TRUE); - } break; - default: break; - } - return ret; - } +static const VpCapabilitiesDesc capabilities[] = { + {blocks::vulkan10requirements::variantCount, blocks::vulkan10requirements::variants}, + {blocks::vulkan11requirements_split::variantCount, blocks::vulkan11requirements_split::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 +#endif // VP_LUNARG_minimum_requirements_1_1 -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; +#ifdef VP_LUNARG_minimum_requirements_1_2 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - return ret; - } }; -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace blocks +{ +namespace vulkan10requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan10requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements::chainerDesc, + 0, + nullptr, }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements -namespace vulkan10requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - s->features.robustBufferAccess = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR: { - VkPhysicalDeviceFeatures2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->features.robustBufferAccess == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; - -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - s->properties.limits.bufferImageGranularity = 131072; - s->properties.limits.discreteQueuePriorities = 2; - s->properties.limits.framebufferColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferNoAttachmentsSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.framebufferStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.lineWidthGranularity = 1.0f; - s->properties.limits.lineWidthRange[0] = 1.0f; - s->properties.limits.lineWidthRange[1] = 1.0f; - s->properties.limits.maxBoundDescriptorSets = 4; - s->properties.limits.maxClipDistances = 0; - s->properties.limits.maxColorAttachments = 4; - s->properties.limits.maxCombinedClipAndCullDistances = 0; - s->properties.limits.maxComputeSharedMemorySize = 16384; - s->properties.limits.maxComputeWorkGroupCount[0] = 65535; - s->properties.limits.maxComputeWorkGroupCount[1] = 65535; - s->properties.limits.maxComputeWorkGroupCount[2] = 65535; - s->properties.limits.maxComputeWorkGroupInvocations = 128; - s->properties.limits.maxComputeWorkGroupSize[0] = 128; - s->properties.limits.maxComputeWorkGroupSize[1] = 128; - s->properties.limits.maxComputeWorkGroupSize[2] = 64; - s->properties.limits.maxCullDistances = 0; - s->properties.limits.maxDescriptorSetInputAttachments = 4; - s->properties.limits.maxDescriptorSetSampledImages = 96; - s->properties.limits.maxDescriptorSetSamplers = 96; - s->properties.limits.maxDescriptorSetStorageBuffers = 24; - s->properties.limits.maxDescriptorSetStorageBuffersDynamic = 4; - s->properties.limits.maxDescriptorSetStorageImages = 24; - s->properties.limits.maxDescriptorSetUniformBuffers = 72; - s->properties.limits.maxDescriptorSetUniformBuffersDynamic = 8; - s->properties.limits.maxDrawIndexedIndexValue = 16777216; - s->properties.limits.maxDrawIndirectCount = 1; - s->properties.limits.maxFragmentCombinedOutputResources = 4; - s->properties.limits.maxFragmentDualSrcAttachments = 0; - s->properties.limits.maxFragmentInputComponents = 64; - s->properties.limits.maxFragmentOutputAttachments = 4; - s->properties.limits.maxFramebufferHeight = 4096; - s->properties.limits.maxFramebufferLayers = 256; - s->properties.limits.maxFramebufferWidth = 4096; - s->properties.limits.maxGeometryInputComponents = 0; - s->properties.limits.maxGeometryOutputComponents = 0; - s->properties.limits.maxGeometryOutputVertices = 0; - s->properties.limits.maxGeometryShaderInvocations = 0; - s->properties.limits.maxGeometryTotalOutputComponents = 0; - s->properties.limits.maxImageArrayLayers = 256; - s->properties.limits.maxImageDimension1D = 4096; - s->properties.limits.maxImageDimension2D = 4096; - s->properties.limits.maxImageDimension3D = 256; - s->properties.limits.maxImageDimensionCube = 4096; - s->properties.limits.maxInterpolationOffset = 0.0f; - s->properties.limits.maxMemoryAllocationCount = 4096; - s->properties.limits.maxPerStageDescriptorInputAttachments = 4; - s->properties.limits.maxPerStageDescriptorSampledImages = 16; - s->properties.limits.maxPerStageDescriptorSamplers = 16; - s->properties.limits.maxPerStageDescriptorStorageBuffers = 4; - s->properties.limits.maxPerStageDescriptorStorageImages = 4; - s->properties.limits.maxPerStageDescriptorUniformBuffers = 12; - s->properties.limits.maxPerStageResources = 128; - s->properties.limits.maxPushConstantsSize = 128; - s->properties.limits.maxSampleMaskWords = 1; - s->properties.limits.maxSamplerAllocationCount = 4000; - s->properties.limits.maxSamplerAnisotropy = 1; - s->properties.limits.maxSamplerLodBias = 2; - s->properties.limits.maxStorageBufferRange = 134217728; - s->properties.limits.maxTessellationControlPerPatchOutputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexInputComponents = 0; - s->properties.limits.maxTessellationControlPerVertexOutputComponents = 0; - s->properties.limits.maxTessellationControlTotalOutputComponents = 0; - s->properties.limits.maxTessellationEvaluationInputComponents = 0; - s->properties.limits.maxTessellationEvaluationOutputComponents = 0; - s->properties.limits.maxTessellationGenerationLevel = 0; - s->properties.limits.maxTessellationPatchSize = 0; - s->properties.limits.maxTexelBufferElements = 65536; - s->properties.limits.maxTexelGatherOffset = 7; - s->properties.limits.maxTexelOffset = 7; - s->properties.limits.maxUniformBufferRange = 16384; - s->properties.limits.maxVertexInputAttributeOffset = 2047; - s->properties.limits.maxVertexInputAttributes = 16; - s->properties.limits.maxVertexInputBindingStride = 2048; - s->properties.limits.maxVertexInputBindings = 16; - s->properties.limits.maxVertexOutputComponents = 64; - s->properties.limits.maxViewportDimensions[0] = 4096; - s->properties.limits.maxViewportDimensions[1] = 4096; - s->properties.limits.maxViewports = 1; - s->properties.limits.minInterpolationOffset = 0.0f; - s->properties.limits.minMemoryMapAlignment = 64; - s->properties.limits.minStorageBufferOffsetAlignment = 256; - s->properties.limits.minTexelBufferOffsetAlignment = 256; - s->properties.limits.minTexelGatherOffset = -8; - s->properties.limits.minTexelOffset = -8; - s->properties.limits.minUniformBufferOffsetAlignment = 256; - s->properties.limits.mipmapPrecisionBits = 4; - s->properties.limits.nonCoherentAtomSize = 256; - s->properties.limits.pointSizeGranularity = 1.0f; - s->properties.limits.pointSizeRange[0] = 1.0f; - s->properties.limits.pointSizeRange[1] = 1.0f; - s->properties.limits.sampledImageColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageDepthSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageIntegerSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sampledImageStencilSampleCounts |= (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT); - s->properties.limits.sparseAddressSpaceSize = 0; - s->properties.limits.storageImageSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->properties.limits.subPixelInterpolationOffsetBits = 0; - s->properties.limits.subPixelPrecisionBits = 4; - s->properties.limits.subTexelPrecisionBits = 4; - s->properties.limits.viewportBoundsRange[0] = -8192; - s->properties.limits.viewportBoundsRange[1] = 8192; - s->properties.limits.viewportSubPixelBits = 0; - s->properties.sparseProperties.residencyNonResidentStrict = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape = VK_FALSE; - s->properties.sparseProperties.residencyStandard3DBlockShape = VK_FALSE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR: { - VkPhysicalDeviceProperties2KHR* s = static_cast(static_cast(p)); - ret = ret && (s->properties.limits.bufferImageGranularity <= 131072); - ret = ret && ((131072 % s->properties.limits.bufferImageGranularity) == 0); - ret = ret && (s->properties.limits.discreteQueuePriorities >= 2); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferNoAttachmentsSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.framebufferStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.lineWidthGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.lineWidthGranularity)); - ret = ret && (s->properties.limits.lineWidthRange[0] <= 1.0); - ret = ret && (s->properties.limits.lineWidthRange[1] >= 1.0); - ret = ret && (s->properties.limits.maxBoundDescriptorSets >= 4); - ret = ret && (s->properties.limits.maxClipDistances >= 0); - ret = ret && (s->properties.limits.maxColorAttachments >= 4); - ret = ret && (s->properties.limits.maxCombinedClipAndCullDistances >= 0); - ret = ret && (s->properties.limits.maxComputeSharedMemorySize >= 16384); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[0] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[1] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupCount[2] >= 65535); - ret = ret && (s->properties.limits.maxComputeWorkGroupInvocations >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[0] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[1] >= 128); - ret = ret && (s->properties.limits.maxComputeWorkGroupSize[2] >= 64); - ret = ret && (s->properties.limits.maxCullDistances >= 0); - ret = ret && (s->properties.limits.maxDescriptorSetInputAttachments >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetSampledImages >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetSamplers >= 96); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffers >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetStorageBuffersDynamic >= 4); - ret = ret && (s->properties.limits.maxDescriptorSetStorageImages >= 24); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffers >= 72); - ret = ret && (s->properties.limits.maxDescriptorSetUniformBuffersDynamic >= 8); - ret = ret && (s->properties.limits.maxDrawIndexedIndexValue >= 16777216); - ret = ret && (s->properties.limits.maxDrawIndirectCount >= 1); - ret = ret && (s->properties.limits.maxFragmentCombinedOutputResources >= 4); - ret = ret && (s->properties.limits.maxFragmentDualSrcAttachments >= 0); - ret = ret && (s->properties.limits.maxFragmentInputComponents >= 64); - ret = ret && (s->properties.limits.maxFragmentOutputAttachments >= 4); - ret = ret && (s->properties.limits.maxFramebufferHeight >= 4096); - ret = ret && (s->properties.limits.maxFramebufferLayers >= 256); - ret = ret && (s->properties.limits.maxFramebufferWidth >= 4096); - ret = ret && (s->properties.limits.maxGeometryInputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputComponents >= 0); - ret = ret && (s->properties.limits.maxGeometryOutputVertices >= 0); - ret = ret && (s->properties.limits.maxGeometryShaderInvocations >= 0); - ret = ret && (s->properties.limits.maxGeometryTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxImageArrayLayers >= 256); - ret = ret && (s->properties.limits.maxImageDimension1D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension2D >= 4096); - ret = ret && (s->properties.limits.maxImageDimension3D >= 256); - ret = ret && (s->properties.limits.maxImageDimensionCube >= 4096); - ret = ret && (s->properties.limits.maxInterpolationOffset >= 0.0); - ret = ret && (s->properties.limits.maxMemoryAllocationCount >= 4096); - ret = ret && (s->properties.limits.maxPerStageDescriptorInputAttachments >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorSampledImages >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorSamplers >= 16); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageBuffers >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorStorageImages >= 4); - ret = ret && (s->properties.limits.maxPerStageDescriptorUniformBuffers >= 12); - ret = ret && (s->properties.limits.maxPerStageResources >= 128); - ret = ret && (s->properties.limits.maxPushConstantsSize >= 128); - ret = ret && (s->properties.limits.maxSampleMaskWords >= 1); - ret = ret && (s->properties.limits.maxSamplerAllocationCount >= 4000); - ret = ret && (s->properties.limits.maxSamplerAnisotropy >= 1); - ret = ret && (s->properties.limits.maxSamplerLodBias >= 2); - ret = ret && (s->properties.limits.maxStorageBufferRange >= 134217728); - ret = ret && (s->properties.limits.maxTessellationControlPerPatchOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlPerVertexOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationControlTotalOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationInputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationEvaluationOutputComponents >= 0); - ret = ret && (s->properties.limits.maxTessellationGenerationLevel >= 0); - ret = ret && (s->properties.limits.maxTessellationPatchSize >= 0); - ret = ret && (s->properties.limits.maxTexelBufferElements >= 65536); - ret = ret && (s->properties.limits.maxTexelGatherOffset >= 7); - ret = ret && (s->properties.limits.maxTexelOffset >= 7); - ret = ret && (s->properties.limits.maxUniformBufferRange >= 16384); - ret = ret && (s->properties.limits.maxVertexInputAttributeOffset >= 2047); - ret = ret && (s->properties.limits.maxVertexInputAttributes >= 16); - ret = ret && (s->properties.limits.maxVertexInputBindingStride >= 2048); - ret = ret && (s->properties.limits.maxVertexInputBindings >= 16); - ret = ret && (s->properties.limits.maxVertexOutputComponents >= 64); - ret = ret && (s->properties.limits.maxViewportDimensions[0] >= 4096); - ret = ret && (s->properties.limits.maxViewportDimensions[1] >= 4096); - ret = ret && (s->properties.limits.maxViewports >= 1); - ret = ret && (s->properties.limits.minInterpolationOffset <= 0.0); - ret = ret && (s->properties.limits.minMemoryMapAlignment <= 64); - ret = ret && ((s->properties.limits.minMemoryMapAlignment & (s->properties.limits.minMemoryMapAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minStorageBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minStorageBufferOffsetAlignment & (s->properties.limits.minStorageBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minTexelBufferOffsetAlignment & (s->properties.limits.minTexelBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.minTexelGatherOffset <= -8); - ret = ret && (s->properties.limits.minTexelOffset <= -8); - ret = ret && (s->properties.limits.minUniformBufferOffsetAlignment <= 256); - ret = ret && ((s->properties.limits.minUniformBufferOffsetAlignment & (s->properties.limits.minUniformBufferOffsetAlignment - 1)) == 0); - ret = ret && (s->properties.limits.mipmapPrecisionBits >= 4); - ret = ret && (s->properties.limits.nonCoherentAtomSize <= 256); - ret = ret && ((s->properties.limits.nonCoherentAtomSize & (s->properties.limits.nonCoherentAtomSize - 1)) == 0); - ret = ret && (s->properties.limits.pointSizeGranularity <= 1.0); - ret = ret && (isMultiple(1.0, s->properties.limits.pointSizeGranularity)); - ret = ret && (s->properties.limits.pointSizeRange[0] <= 1.0); - ret = ret && (s->properties.limits.pointSizeRange[1] >= 1.0); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageDepthSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageIntegerSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (vpCheckFlags(s->properties.limits.sampledImageStencilSampleCounts, (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT))); - ret = ret && (s->properties.limits.sparseAddressSpaceSize >= 0); - ret = ret && (vpCheckFlags(s->properties.limits.storageImageSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (s->properties.limits.subPixelInterpolationOffsetBits >= 0); - ret = ret && (s->properties.limits.subPixelPrecisionBits >= 4); - ret = ret && (s->properties.limits.subTexelPrecisionBits >= 4); - ret = ret && (s->properties.limits.viewportBoundsRange[0] <= -8192); - ret = ret && (s->properties.limits.viewportBoundsRange[1] >= 8192); - ret = ret && (s->properties.limits.viewportSubPixelBits >= 0); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyNonResidentStrict, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard2DMultisampleBlockShape, VK_FALSE)); - ret = ret && (vpCheckFlags(s->properties.sparseProperties.residencyStandard3DBlockShape, VK_FALSE)); - } break; - default: break; - } - return ret; - } +namespace vulkan11requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan11requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan11requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan11requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan11requirements::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan11requirements -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan12requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan12requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan12requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan12requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan12requirements::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan10requirements -namespace vulkan11requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - s->multiview = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { - VkPhysicalDeviceVulkan11Features* s = static_cast(static_cast(p)); - ret = ret && (s->multiview == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; - -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - s->maxMemoryAllocationSize = 1073741824; - s->maxMultiviewInstanceIndex = 134217727; - s->maxMultiviewViewCount = 6; - s->maxPerSetDescriptors = 1024; - s->subgroupSize = 1; - s->subgroupSupportedOperations |= (VK_SUBGROUP_FEATURE_BASIC_BIT); - s->subgroupSupportedStages |= (VK_SHADER_STAGE_COMPUTE_BIT); - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: { - VkPhysicalDeviceVulkan11Properties* s = static_cast(static_cast(p)); - ret = ret && (s->maxMemoryAllocationSize >= 1073741824); - ret = ret && (s->maxMultiviewInstanceIndex >= 134217727); - ret = ret && (s->maxMultiviewViewCount >= 6); - ret = ret && (s->maxPerSetDescriptors >= 1024); - ret = ret && (s->subgroupSize >= 1); - ret = ret && ((s->subgroupSize & (s->subgroupSize - 1)) == 0); - ret = ret && (vpCheckFlags(s->subgroupSupportedOperations, (VK_SUBGROUP_FEATURE_BASIC_BIT))); - ret = ret && (vpCheckFlags(s->subgroupSupportedStages, (VK_SHADER_STAGE_COMPUTE_BIT))); - } break; - default: break; - } - return ret; - } +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan12requirements +} // namespace blocks + +static const VpCapabilitiesDesc capabilities[] = { + {blocks::vulkan10requirements::variantCount, blocks::vulkan10requirements::variants}, + {blocks::vulkan11requirements::variantCount, blocks::vulkan11requirements::variants}, + {blocks::vulkan12requirements::variantCount, blocks::vulkan12requirements::variants}, }; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 +#endif // VP_LUNARG_minimum_requirements_1_2 -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +#ifdef VP_LUNARG_minimum_requirements_1_3 +namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 +{ +static const VpVariantDesc mergedCapabilities[] = { + { + "MERGED", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + featureDesc, + 0, + nullptr, + propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan11requirements -namespace vulkan12requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->hostQueryReset = VK_TRUE; - s->imagelessFramebuffer = VK_TRUE; - s->separateDepthStencilLayouts = VK_TRUE; - s->shaderSubgroupExtendedTypes = VK_TRUE; - s->subgroupBroadcastDynamicId = VK_TRUE; - s->timelineSemaphore = VK_TRUE; - s->uniformBufferStandardLayout = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->hostQueryReset == VK_TRUE); - ret = ret && (s->imagelessFramebuffer == VK_TRUE); - ret = ret && (s->separateDepthStencilLayouts == VK_TRUE); - ret = ret && (s->shaderSubgroupExtendedTypes == VK_TRUE); - ret = ret && (s->subgroupBroadcastDynamicId == VK_TRUE); - ret = ret && (s->timelineSemaphore == VK_TRUE); - ret = ret && (s->uniformBufferStandardLayout == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - s->filterMinmaxImageComponentMapping = VK_FALSE; - s->filterMinmaxSingleComponentFormats = VK_FALSE; - s->framebufferIntegerColorSampleCounts |= (VK_SAMPLE_COUNT_1_BIT); - s->independentResolve = VK_FALSE; - s->independentResolveNone = VK_FALSE; - s->maxDescriptorSetUpdateAfterBindInputAttachments = 0; - s->maxDescriptorSetUpdateAfterBindSampledImages = 0; - s->maxDescriptorSetUpdateAfterBindSamplers = 0; - s->maxDescriptorSetUpdateAfterBindStorageBuffers = 0; - s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = 0; - s->maxDescriptorSetUpdateAfterBindStorageImages = 0; - s->maxDescriptorSetUpdateAfterBindUniformBuffers = 0; - s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = 0; - s->maxPerStageDescriptorUpdateAfterBindInputAttachments = 0; - s->maxPerStageDescriptorUpdateAfterBindSampledImages = 0; - s->maxPerStageDescriptorUpdateAfterBindSamplers = 0; - s->maxPerStageDescriptorUpdateAfterBindStorageBuffers = 0; - s->maxPerStageDescriptorUpdateAfterBindStorageImages = 0; - s->maxPerStageDescriptorUpdateAfterBindUniformBuffers = 0; - s->maxPerStageUpdateAfterBindResources = 0; - s->maxTimelineSemaphoreValueDifference = 2147483647; - s->maxUpdateAfterBindDescriptorsInAllPools = 0; - s->quadDivergentImplicitLod = VK_FALSE; - s->robustBufferAccessUpdateAfterBind = VK_FALSE; - s->shaderDenormFlushToZeroFloat16 = VK_FALSE; - s->shaderDenormFlushToZeroFloat32 = VK_FALSE; - s->shaderDenormFlushToZeroFloat64 = VK_FALSE; - s->shaderDenormPreserveFloat16 = VK_FALSE; - s->shaderDenormPreserveFloat32 = VK_FALSE; - s->shaderDenormPreserveFloat64 = VK_FALSE; - s->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE; - s->shaderRoundingModeRTEFloat16 = VK_FALSE; - s->shaderRoundingModeRTEFloat32 = VK_FALSE; - s->shaderRoundingModeRTEFloat64 = VK_FALSE; - s->shaderRoundingModeRTZFloat16 = VK_FALSE; - s->shaderRoundingModeRTZFloat32 = VK_FALSE; - s->shaderRoundingModeRTZFloat64 = VK_FALSE; - s->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE; - s->shaderSignedZeroInfNanPreserveFloat16 = VK_FALSE; - s->shaderSignedZeroInfNanPreserveFloat32 = VK_FALSE; - s->shaderSignedZeroInfNanPreserveFloat64 = VK_FALSE; - s->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE; - s->shaderStorageImageArrayNonUniformIndexingNative = VK_FALSE; - s->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: { - VkPhysicalDeviceVulkan12Properties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->filterMinmaxImageComponentMapping, VK_FALSE)); - ret = ret && (vpCheckFlags(s->filterMinmaxSingleComponentFormats, VK_FALSE)); - ret = ret && (vpCheckFlags(s->framebufferIntegerColorSampleCounts, (VK_SAMPLE_COUNT_1_BIT))); - ret = ret && (vpCheckFlags(s->independentResolve, VK_FALSE)); - ret = ret && (vpCheckFlags(s->independentResolveNone, VK_FALSE)); - ret = ret && (s->maxDescriptorSetUpdateAfterBindInputAttachments >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindSampledImages >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindSamplers >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageBuffers >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindStorageImages >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindUniformBuffers >= 0); - ret = ret && (s->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindInputAttachments >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindSampledImages >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindSamplers >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindStorageImages >= 0); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 0); - ret = ret && (s->maxPerStageUpdateAfterBindResources >= 0); - ret = ret && (s->maxTimelineSemaphoreValueDifference >= 2147483647); - ret = ret && (s->maxUpdateAfterBindDescriptorsInAllPools >= 0); - ret = ret && (vpCheckFlags(s->quadDivergentImplicitLod, VK_FALSE)); - ret = ret && (vpCheckFlags(s->robustBufferAccessUpdateAfterBind, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormFlushToZeroFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormFlushToZeroFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormFlushToZeroFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormPreserveFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormPreserveFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderDenormPreserveFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderInputAttachmentArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTEFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTZFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTZFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderRoundingModeRTZFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSampledImageArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat16, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat32, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderSignedZeroInfNanPreserveFloat64, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderStorageBufferArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderStorageImageArrayNonUniformIndexingNative, VK_FALSE)); - ret = ret && (vpCheckFlags(s->shaderUniformBufferArrayNonUniformIndexingNative, VK_FALSE)); - } break; - default: break; - } - return ret; - } +namespace blocks +{ +namespace vulkan10requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan10requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan10requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan10requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan10requirements::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan10requirements -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan11requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan11requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan11requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan11requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan11requirements::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan12requirements -namespace vulkan13requirements { -static const VpFeatureDesc featureDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - s->bufferDeviceAddress = VK_TRUE; - s->vulkanMemoryModel = VK_TRUE; - s->vulkanMemoryModelDeviceScope = VK_TRUE; - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - s->computeFullSubgroups = VK_TRUE; - s->dynamicRendering = VK_TRUE; - s->inlineUniformBlock = VK_TRUE; - s->maintenance4 = VK_TRUE; - s->pipelineCreationCacheControl = VK_TRUE; - s->robustImageAccess = VK_TRUE; - s->shaderDemoteToHelperInvocation = VK_TRUE; - s->shaderIntegerDotProduct = VK_TRUE; - s->shaderTerminateInvocation = VK_TRUE; - s->shaderZeroInitializeWorkgroupMemory = VK_TRUE; - s->subgroupSizeControl = VK_TRUE; - s->synchronization2 = VK_TRUE; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { - VkPhysicalDeviceVulkan12Features* s = static_cast(static_cast(p)); - ret = ret && (s->bufferDeviceAddress == VK_TRUE); - ret = ret && (s->vulkanMemoryModel == VK_TRUE); - ret = ret && (s->vulkanMemoryModelDeviceScope == VK_TRUE); - } break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: { - VkPhysicalDeviceVulkan13Features* s = static_cast(static_cast(p)); - ret = ret && (s->computeFullSubgroups == VK_TRUE); - ret = ret && (s->dynamicRendering == VK_TRUE); - ret = ret && (s->inlineUniformBlock == VK_TRUE); - ret = ret && (s->maintenance4 == VK_TRUE); - ret = ret && (s->pipelineCreationCacheControl == VK_TRUE); - ret = ret && (s->robustImageAccess == VK_TRUE); - ret = ret && (s->shaderDemoteToHelperInvocation == VK_TRUE); - ret = ret && (s->shaderIntegerDotProduct == VK_TRUE); - ret = ret && (s->shaderTerminateInvocation == VK_TRUE); - ret = ret && (s->shaderZeroInitializeWorkgroupMemory == VK_TRUE); - ret = ret && (s->subgroupSizeControl == VK_TRUE); - ret = ret && (s->synchronization2 == VK_TRUE); - } break; - default: break; - } - return ret; - } -}; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan11requirements -static const VpPropertyDesc propertyDesc = { - [](VkBaseOutStructure* p) { (void)p; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: { - VkPhysicalDeviceVulkan13Properties* s = static_cast(static_cast(p)); - s->integerDotProduct16BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProduct16BitSignedAccelerated = VK_FALSE; - s->integerDotProduct16BitUnsignedAccelerated = VK_FALSE; - s->integerDotProduct32BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProduct32BitSignedAccelerated = VK_FALSE; - s->integerDotProduct32BitUnsignedAccelerated = VK_FALSE; - s->integerDotProduct4x8BitPackedMixedSignednessAccelerated = VK_FALSE; - s->integerDotProduct4x8BitPackedSignedAccelerated = VK_FALSE; - s->integerDotProduct4x8BitPackedUnsignedAccelerated = VK_FALSE; - s->integerDotProduct64BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProduct64BitSignedAccelerated = VK_FALSE; - s->integerDotProduct64BitUnsignedAccelerated = VK_FALSE; - s->integerDotProduct8BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProduct8BitSignedAccelerated = VK_FALSE; - s->integerDotProduct8BitUnsignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating16BitSignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating32BitSignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating64BitSignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating8BitSignedAccelerated = VK_FALSE; - s->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated = VK_FALSE; - s->maxBufferSize = 1073741824; - s->maxComputeWorkgroupSubgroups = 0; - s->maxDescriptorSetInlineUniformBlocks = 4; - s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks = 4; - s->maxInlineUniformBlockSize = 256; - s->maxInlineUniformTotalSize = 256; - s->maxPerStageDescriptorInlineUniformBlocks = 4; - s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = 4; - } break; - default: break; - } - }, - [](VkBaseOutStructure* p) -> bool { (void)p; - bool ret = true; - switch (p->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES: { - VkPhysicalDeviceVulkan13Properties* s = static_cast(static_cast(p)); - ret = ret && (vpCheckFlags(s->integerDotProduct16BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct16BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct16BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct32BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct32BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct32BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct4x8BitPackedMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct4x8BitPackedSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct4x8BitPackedUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct64BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct64BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct64BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct8BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct8BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProduct8BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating16BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating32BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating64BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating8BitSignedAccelerated, VK_FALSE)); - ret = ret && (vpCheckFlags(s->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated, VK_FALSE)); - ret = ret && (s->maxBufferSize >= 1073741824); - ret = ret && (s->maxComputeWorkgroupSubgroups >= 0); - ret = ret && (s->maxDescriptorSetInlineUniformBlocks >= 4); - ret = ret && (s->maxDescriptorSetUpdateAfterBindInlineUniformBlocks >= 4); - ret = ret && (s->maxInlineUniformBlockSize >= 256); - ret = ret && (s->maxInlineUniformTotalSize >= 256); - ret = ret && (s->maxPerStageDescriptorInlineUniformBlocks >= 4); - ret = ret && (s->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks >= 4); - } break; - default: break; - } - return ret; - } +namespace vulkan12requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan12requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan12requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan12requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan12requirements::chainerDesc, + 0, + nullptr, + }, }; +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan12requirements -static const VpStructChainerDesc chainerDesc = { - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, &physicalDeviceVulkan11Features }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, &physicalDeviceVulkan12Features }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Features)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, nullptr }; - VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, &physicalDeviceVulkan11Properties }; - VkPhysicalDeviceVulkan13Properties physicalDeviceVulkan13Properties{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES, &physicalDeviceVulkan12Properties }; - p->pNext = static_cast(static_cast(&physicalDeviceVulkan13Properties)); - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); - }, - [](VkBaseOutStructure* p, void* pUser, PFN_vpStructChainerCb pfnCb) { - pfnCb(p, pUser); +namespace vulkan13requirements +{ +static const VpVariantDesc variants[] = { + { + "vulkan13requirements", + 0, + nullptr, + 0, + nullptr, + static_cast(std::size(featureStructTypes)), + featureStructTypes, + blocks::vulkan13requirements::featureDesc, + static_cast(std::size(propertyStructTypes)), + propertyStructTypes, + blocks::vulkan13requirements::propertyDesc, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + 0, + nullptr, + blocks::vulkan13requirements::chainerDesc, + 0, + nullptr, }, }; -} //namespace vulkan13requirements -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 -#endif // VP_LUNARG_minimum_requirements_1_3 - - -#ifdef VP_ANDROID_15_minimums -namespace VP_ANDROID_15_MINIMUMS { - namespace MUST { - static const VpVariantDesc variants[] = { - { - "MUST", - static_cast(std::size(MUST::instanceExtensions)), MUST::instanceExtensions, - static_cast(std::size(MUST::deviceExtensions)), MUST::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - MUST::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - MUST::propertyDesc, - 0, nullptr, - 0, nullptr, - static_cast(std::size(formatStructTypes)), formatStructTypes, - static_cast(std::size(MUST::formatDesc)), MUST::formatDesc, - MUST::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace MUST - - namespace primitivesGeneratedQuery_pipelineStatisticsQuery_ { - static const VpVariantDesc variants[] = { - { - "primitivesGeneratedQuery", - 0, nullptr, - static_cast(std::size(primitivesGeneratedQuery::deviceExtensions)), primitivesGeneratedQuery::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - primitivesGeneratedQuery::featureDesc, - 0, nullptr, - primitivesGeneratedQuery::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - primitivesGeneratedQuery::chainerDesc, - }, - { - "pipelineStatisticsQuery", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - pipelineStatisticsQuery::featureDesc, - 0, nullptr, - pipelineStatisticsQuery::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - pipelineStatisticsQuery::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace primitivesGeneratedQuery_pipelineStatisticsQuery_ - - namespace swBresenhamLines_hwBresenhamLines_ { - static const VpVariantDesc variants[] = { - { - "swBresenhamLines", - 0, nullptr, - static_cast(std::size(swBresenhamLines::deviceExtensions)), swBresenhamLines::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - swBresenhamLines::featureDesc, - 0, nullptr, - swBresenhamLines::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - swBresenhamLines::chainerDesc, - }, - { - "hwBresenhamLines", - 0, nullptr, - static_cast(std::size(hwBresenhamLines::deviceExtensions)), hwBresenhamLines::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - hwBresenhamLines::featureDesc, - 0, nullptr, - hwBresenhamLines::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - hwBresenhamLines::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace swBresenhamLines_hwBresenhamLines_ - - static const VpCapabilitiesDesc capabilities[] = { - { MUST::variantCount, MUST::variants }, - { primitivesGeneratedQuery_pipelineStatisticsQuery_::variantCount, primitivesGeneratedQuery_pipelineStatisticsQuery_::variants }, - { swBresenhamLines_hwBresenhamLines_::variantCount, swBresenhamLines_hwBresenhamLines_::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); - - static const VpProfileProperties profiles[] = { - {VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION}, - }; - static const uint32_t profileCount = static_cast(std::size(profiles)); -} // namespace VP_ANDROID_15_MINIMUMS -#endif //VP_ANDROID_15_minimums - -#ifdef VP_ANDROID_16_minimums -namespace VP_ANDROID_16_MINIMUMS { - namespace MUST { - static const VpVariantDesc variants[] = { - { - "MUST", - 0, nullptr, - static_cast(std::size(MUST::deviceExtensions)), MUST::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - MUST::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - MUST::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - MUST::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace MUST - - namespace multisampledToSingleSampled_shaderStencilExport_ { - static const VpVariantDesc variants[] = { - { - "multisampledToSingleSampled", - 0, nullptr, - static_cast(std::size(multisampledToSingleSampled::deviceExtensions)), multisampledToSingleSampled::deviceExtensions, - 0, nullptr, - multisampledToSingleSampled::featureDesc, - 0, nullptr, - multisampledToSingleSampled::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - multisampledToSingleSampled::chainerDesc, - }, - { - "shaderStencilExport", - 0, nullptr, - static_cast(std::size(shaderStencilExport::deviceExtensions)), shaderStencilExport::deviceExtensions, - 0, nullptr, - shaderStencilExport::featureDesc, - 0, nullptr, - shaderStencilExport::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - shaderStencilExport::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace multisampledToSingleSampled_shaderStencilExport_ - - static const VpCapabilitiesDesc capabilities[] = { - { MUST::variantCount, MUST::variants }, - { multisampledToSingleSampled_shaderStencilExport_::variantCount, multisampledToSingleSampled_shaderStencilExport_::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); - - static const VpProfileProperties profiles[] = { - {VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION}, - {VP_ANDROID_15_MINIMUMS_NAME, VP_ANDROID_15_MINIMUMS_SPEC_VERSION}, - }; - static const uint32_t profileCount = static_cast(std::size(profiles)); -} // namespace VP_ANDROID_16_MINIMUMS -#endif //VP_ANDROID_16_minimums - -#ifdef VP_ANDROID_baseline_2021 -namespace VP_ANDROID_BASELINE_2021 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - static_cast(std::size(instanceExtensions)), instanceExtensions, - static_cast(std::size(deviceExtensions)), deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace baseline { - static const VpVariantDesc variants[] = { - { - "baseline", - static_cast(std::size(baseline::instanceExtensions)), baseline::instanceExtensions, - static_cast(std::size(baseline::deviceExtensions)), baseline::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - baseline::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - baseline::propertyDesc, - 0, nullptr, - 0, nullptr, - static_cast(std::size(formatStructTypes)), formatStructTypes, - static_cast(std::size(baseline::formatDesc)), baseline::formatDesc, - baseline::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace baseline - - static const VpCapabilitiesDesc capabilities[] = { - { baseline::variantCount, baseline::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_ANDROID_BASELINE_2021 -#endif //VP_ANDROID_baseline_2021 - -#ifdef VP_ANDROID_baseline_2022 -namespace VP_ANDROID_BASELINE_2022 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - static_cast(std::size(instanceExtensions)), instanceExtensions, - static_cast(std::size(deviceExtensions)), deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace baseline { - static const VpVariantDesc variants[] = { - { - "baseline", - static_cast(std::size(baseline::instanceExtensions)), baseline::instanceExtensions, - static_cast(std::size(baseline::deviceExtensions)), baseline::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - baseline::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - baseline::propertyDesc, - 0, nullptr, - 0, nullptr, - static_cast(std::size(formatStructTypes)), formatStructTypes, - static_cast(std::size(baseline::formatDesc)), baseline::formatDesc, - baseline::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace baseline - - static const VpCapabilitiesDesc capabilities[] = { - { baseline::variantCount, baseline::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_ANDROID_BASELINE_2022 -#endif //VP_ANDROID_baseline_2022 - -#ifdef VP_KHR_roadmap_2022 -namespace VP_KHR_ROADMAP_2022 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - 0, nullptr, - static_cast(std::size(deviceExtensions)), deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace vulkan10requirements { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements::featureDesc, - 0, nullptr, - vulkan10requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements - - namespace vulkan10requirements_roadmap2022 { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements_roadmap2022", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements_roadmap2022::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan10requirements_roadmap2022::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements_roadmap2022::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements_roadmap2022 - - namespace vulkan11requirements { - static const VpVariantDesc variants[] = { - { - "vulkan11requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan11requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan11requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan11requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan11requirements - - namespace vulkan11requirements_roadmap2022 { - static const VpVariantDesc variants[] = { - { - "vulkan11requirements_roadmap2022", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan11requirements_roadmap2022::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan11requirements_roadmap2022::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan11requirements_roadmap2022::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan11requirements_roadmap2022 - - namespace vulkan12requirements { - static const VpVariantDesc variants[] = { - { - "vulkan12requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan12requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan12requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan12requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan12requirements - - namespace vulkan12requirements_roadmap2022 { - static const VpVariantDesc variants[] = { - { - "vulkan12requirements_roadmap2022", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan12requirements_roadmap2022::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan12requirements_roadmap2022::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan12requirements_roadmap2022::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan12requirements_roadmap2022 - - namespace vulkan13requirements { - static const VpVariantDesc variants[] = { - { - "vulkan13requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan13requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan13requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan13requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan13requirements - - namespace vulkan13requirements_roadmap2022 { - static const VpVariantDesc variants[] = { - { - "vulkan13requirements_roadmap2022", - 0, nullptr, - static_cast(std::size(vulkan13requirements_roadmap2022::deviceExtensions)), vulkan13requirements_roadmap2022::deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan13requirements_roadmap2022::featureDesc, - 0, nullptr, - vulkan13requirements_roadmap2022::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan13requirements_roadmap2022::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan13requirements_roadmap2022 - - static const VpCapabilitiesDesc capabilities[] = { - { vulkan10requirements::variantCount, vulkan10requirements::variants }, - { vulkan10requirements_roadmap2022::variantCount, vulkan10requirements_roadmap2022::variants }, - { vulkan11requirements::variantCount, vulkan11requirements::variants }, - { vulkan11requirements_roadmap2022::variantCount, vulkan11requirements_roadmap2022::variants }, - { vulkan12requirements::variantCount, vulkan12requirements::variants }, - { vulkan12requirements_roadmap2022::variantCount, vulkan12requirements_roadmap2022::variants }, - { vulkan13requirements::variantCount, vulkan13requirements::variants }, - { vulkan13requirements_roadmap2022::variantCount, vulkan13requirements_roadmap2022::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_KHR_ROADMAP_2022 -#endif //VP_KHR_roadmap_2022 - -#ifdef VP_KHR_roadmap_2024 -namespace VP_KHR_ROADMAP_2024 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - 0, nullptr, - static_cast(std::size(deviceExtensions)), deviceExtensions, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace vulkan10requirements_roadmap2024 { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements_roadmap2024", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements_roadmap2024::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan10requirements_roadmap2024::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements_roadmap2024::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements_roadmap2024 - - namespace vulkan11requirements_roadmap2024 { - static const VpVariantDesc variants[] = { - { - "vulkan11requirements_roadmap2024", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan11requirements_roadmap2024::featureDesc, - 0, nullptr, - vulkan11requirements_roadmap2024::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan11requirements_roadmap2024::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan11requirements_roadmap2024 - - namespace vulkan12requirements_roadmap2024 { - static const VpVariantDesc variants[] = { - { - "vulkan12requirements_roadmap2024", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan12requirements_roadmap2024::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan12requirements_roadmap2024::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan12requirements_roadmap2024::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan12requirements_roadmap2024 - - namespace vulkan13requirements_roadmap2024 { - static const VpVariantDesc variants[] = { - { - "vulkan13requirements_roadmap2024", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan13requirements_roadmap2024::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan13requirements_roadmap2024::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan13requirements_roadmap2024::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan13requirements_roadmap2024 - - namespace vulkanextensionrequirements_roadmap2024 { - static const VpVariantDesc variants[] = { - { - "vulkanextensionrequirements_roadmap2024", - 0, nullptr, - static_cast(std::size(vulkanextensionrequirements_roadmap2024::deviceExtensions)), vulkanextensionrequirements_roadmap2024::deviceExtensions, - 0, nullptr, - vulkanextensionrequirements_roadmap2024::featureDesc, - 0, nullptr, - vulkanextensionrequirements_roadmap2024::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkanextensionrequirements_roadmap2024::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkanextensionrequirements_roadmap2024 - - static const VpCapabilitiesDesc capabilities[] = { - { vulkan10requirements_roadmap2024::variantCount, vulkan10requirements_roadmap2024::variants }, - { vulkan11requirements_roadmap2024::variantCount, vulkan11requirements_roadmap2024::variants }, - { vulkan12requirements_roadmap2024::variantCount, vulkan12requirements_roadmap2024::variants }, - { vulkan13requirements_roadmap2024::variantCount, vulkan13requirements_roadmap2024::variants }, - { vulkanextensionrequirements_roadmap2024::variantCount, vulkanextensionrequirements_roadmap2024::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); - - static const VpProfileProperties profiles[] = { - {VP_KHR_ROADMAP_2022_NAME, VP_KHR_ROADMAP_2022_SPEC_VERSION}, - }; - static const uint32_t profileCount = static_cast(std::size(profiles)); -} // namespace VP_KHR_ROADMAP_2024 -#endif //VP_KHR_roadmap_2024 - -#ifdef VP_LUNARG_minimum_requirements_1_0 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace vulkan10requirements { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan10requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements - - static const VpCapabilitiesDesc capabilities[] = { - { vulkan10requirements::variantCount, vulkan10requirements::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 -#endif //VP_LUNARG_minimum_requirements_1_0 - -#ifdef VP_LUNARG_minimum_requirements_1_1 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace vulkan10requirements { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan10requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements - - namespace vulkan11requirements_split { - static const VpVariantDesc variants[] = { - { - "vulkan11requirements_split", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan11requirements_split::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan11requirements_split::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan11requirements_split::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan11requirements_split - - static const VpCapabilitiesDesc capabilities[] = { - { vulkan10requirements::variantCount, vulkan10requirements::variants }, - { vulkan11requirements_split::variantCount, vulkan11requirements_split::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 -#endif //VP_LUNARG_minimum_requirements_1_1 - -#ifdef VP_LUNARG_minimum_requirements_1_2 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace vulkan10requirements { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan10requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements - - namespace vulkan11requirements { - static const VpVariantDesc variants[] = { - { - "vulkan11requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan11requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan11requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan11requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan11requirements - - namespace vulkan12requirements { - static const VpVariantDesc variants[] = { - { - "vulkan12requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan12requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan12requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan12requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan12requirements - - static const VpCapabilitiesDesc capabilities[] = { - { vulkan10requirements::variantCount, vulkan10requirements::variants }, - { vulkan11requirements::variantCount, vulkan11requirements::variants }, - { vulkan12requirements::variantCount, vulkan12requirements::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 -#endif //VP_LUNARG_minimum_requirements_1_2 - -#ifdef VP_LUNARG_minimum_requirements_1_3 -namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 { - static const VpVariantDesc mergedCapabilities[] = { - { - "MERGED", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - featureDesc, - 0, nullptr, - propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - chainerDesc, - }, - }; - - namespace vulkan10requirements { - static const VpVariantDesc variants[] = { - { - "vulkan10requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan10requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan10requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan10requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan10requirements - - namespace vulkan11requirements { - static const VpVariantDesc variants[] = { - { - "vulkan11requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan11requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan11requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan11requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan11requirements - - namespace vulkan12requirements { - static const VpVariantDesc variants[] = { - { - "vulkan12requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan12requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan12requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan12requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan12requirements - - namespace vulkan13requirements { - static const VpVariantDesc variants[] = { - { - "vulkan13requirements", - 0, nullptr, - 0, nullptr, - static_cast(std::size(featureStructTypes)), featureStructTypes, - vulkan13requirements::featureDesc, - static_cast(std::size(propertyStructTypes)), propertyStructTypes, - vulkan13requirements::propertyDesc, - 0, nullptr, - 0, nullptr, - 0, nullptr, - 0, nullptr, - vulkan13requirements::chainerDesc, - }, - }; - static const uint32_t variantCount = static_cast(std::size(variants)); - } // namespace vulkan13requirements - - static const VpCapabilitiesDesc capabilities[] = { - { vulkan10requirements::variantCount, vulkan10requirements::variants }, - { vulkan11requirements::variantCount, vulkan11requirements::variants }, - { vulkan12requirements::variantCount, vulkan12requirements::variants }, - { vulkan13requirements::variantCount, vulkan13requirements::variants }, - }; - static const uint32_t capabilityCount = static_cast(std::size(capabilities)); -} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 -#endif //VP_LUNARG_minimum_requirements_1_3 +static const uint32_t variantCount = static_cast(std::size(variants)); +} // namespace vulkan13requirements +} // namespace blocks + +static const VpCapabilitiesDesc capabilities[] = { + {blocks::vulkan10requirements::variantCount, blocks::vulkan10requirements::variants}, + {blocks::vulkan11requirements::variantCount, blocks::vulkan11requirements::variants}, + {blocks::vulkan12requirements::variantCount, blocks::vulkan12requirements::variants}, + {blocks::vulkan13requirements::variantCount, blocks::vulkan13requirements::variants}, +}; +static const uint32_t capabilityCount = static_cast(std::size(capabilities)); +} // namespace VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 +#endif // VP_LUNARG_minimum_requirements_1_3 static const VpProfileDesc profiles[] = { #ifdef VP_ANDROID_15_minimums VpProfileDesc{ - VpProfileProperties{ VP_ANDROID_15_MINIMUMS_NAME, VP_ANDROID_15_MINIMUMS_SPEC_VERSION }, + VpProfileProperties{VP_ANDROID_15_MINIMUMS_NAME, VP_ANDROID_15_MINIMUMS_SPEC_VERSION}, VP_ANDROID_15_MINIMUMS_MIN_API_VERSION, nullptr, - VP_ANDROID_15_MINIMUMS::profileCount, VP_ANDROID_15_MINIMUMS::profiles, - VP_ANDROID_15_MINIMUMS::capabilityCount, VP_ANDROID_15_MINIMUMS::capabilities, - 0, nullptr, + VP_ANDROID_15_MINIMUMS::profileCount, + VP_ANDROID_15_MINIMUMS::profiles, + VP_ANDROID_15_MINIMUMS::capabilityCount, + VP_ANDROID_15_MINIMUMS::capabilities, + 0, + nullptr, }, -#endif // VP_ANDROID_15_MINIMUMS +#endif // VP_ANDROID_15_MINIMUMS #ifdef VP_ANDROID_16_minimums VpProfileDesc{ - VpProfileProperties{ VP_ANDROID_16_MINIMUMS_NAME, VP_ANDROID_16_MINIMUMS_SPEC_VERSION }, + VpProfileProperties{VP_ANDROID_16_MINIMUMS_NAME, VP_ANDROID_16_MINIMUMS_SPEC_VERSION}, VP_ANDROID_16_MINIMUMS_MIN_API_VERSION, nullptr, - VP_ANDROID_16_MINIMUMS::profileCount, VP_ANDROID_16_MINIMUMS::profiles, - VP_ANDROID_16_MINIMUMS::capabilityCount, VP_ANDROID_16_MINIMUMS::capabilities, - 0, nullptr, + VP_ANDROID_16_MINIMUMS::profileCount, + VP_ANDROID_16_MINIMUMS::profiles, + VP_ANDROID_16_MINIMUMS::capabilityCount, + VP_ANDROID_16_MINIMUMS::capabilities, + 0, + nullptr, }, -#endif // VP_ANDROID_16_MINIMUMS +#endif // VP_ANDROID_16_MINIMUMS #ifdef VP_ANDROID_baseline_2021 VpProfileDesc{ - VpProfileProperties{ VP_ANDROID_BASELINE_2021_NAME, VP_ANDROID_BASELINE_2021_SPEC_VERSION }, + VpProfileProperties{VP_ANDROID_BASELINE_2021_NAME, VP_ANDROID_BASELINE_2021_SPEC_VERSION}, VP_ANDROID_BASELINE_2021_MIN_API_VERSION, VP_ANDROID_BASELINE_2021::mergedCapabilities, - 0, nullptr, - VP_ANDROID_BASELINE_2021::capabilityCount, VP_ANDROID_BASELINE_2021::capabilities, - 0, nullptr, + 0, + nullptr, + VP_ANDROID_BASELINE_2021::capabilityCount, + VP_ANDROID_BASELINE_2021::capabilities, + 0, + nullptr, }, -#endif // VP_ANDROID_BASELINE_2021 +#endif // VP_ANDROID_BASELINE_2021 #ifdef VP_ANDROID_baseline_2022 VpProfileDesc{ - VpProfileProperties{ VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION }, + VpProfileProperties{VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION}, VP_ANDROID_BASELINE_2022_MIN_API_VERSION, VP_ANDROID_BASELINE_2022::mergedCapabilities, - 0, nullptr, - VP_ANDROID_BASELINE_2022::capabilityCount, VP_ANDROID_BASELINE_2022::capabilities, - 0, nullptr, + 0, + nullptr, + VP_ANDROID_BASELINE_2022::capabilityCount, + VP_ANDROID_BASELINE_2022::capabilities, + 0, + nullptr, }, -#endif // VP_ANDROID_BASELINE_2022 +#endif // VP_ANDROID_BASELINE_2022 #ifdef VP_KHR_roadmap_2022 VpProfileDesc{ - VpProfileProperties{ VP_KHR_ROADMAP_2022_NAME, VP_KHR_ROADMAP_2022_SPEC_VERSION }, + VpProfileProperties{VP_KHR_ROADMAP_2022_NAME, VP_KHR_ROADMAP_2022_SPEC_VERSION}, VP_KHR_ROADMAP_2022_MIN_API_VERSION, VP_KHR_ROADMAP_2022::mergedCapabilities, - 0, nullptr, - VP_KHR_ROADMAP_2022::capabilityCount, VP_KHR_ROADMAP_2022::capabilities, - 0, nullptr, + 0, + nullptr, + VP_KHR_ROADMAP_2022::capabilityCount, + VP_KHR_ROADMAP_2022::capabilities, + 0, + nullptr, }, -#endif // VP_KHR_ROADMAP_2022 +#endif // VP_KHR_ROADMAP_2022 #ifdef VP_KHR_roadmap_2024 VpProfileDesc{ - VpProfileProperties{ VP_KHR_ROADMAP_2024_NAME, VP_KHR_ROADMAP_2024_SPEC_VERSION }, + VpProfileProperties{VP_KHR_ROADMAP_2024_NAME, VP_KHR_ROADMAP_2024_SPEC_VERSION}, VP_KHR_ROADMAP_2024_MIN_API_VERSION, VP_KHR_ROADMAP_2024::mergedCapabilities, - VP_KHR_ROADMAP_2024::profileCount, VP_KHR_ROADMAP_2024::profiles, - VP_KHR_ROADMAP_2024::capabilityCount, VP_KHR_ROADMAP_2024::capabilities, - 0, nullptr, + VP_KHR_ROADMAP_2024::profileCount, + VP_KHR_ROADMAP_2024::profiles, + VP_KHR_ROADMAP_2024::capabilityCount, + VP_KHR_ROADMAP_2024::capabilities, + 0, + nullptr, + }, +#endif // VP_KHR_ROADMAP_2024 +#ifdef VP_LUNARG_desktop_baseline_2022 + VpProfileDesc{ + VpProfileProperties{VP_LUNARG_DESKTOP_BASELINE_2022_NAME, VP_LUNARG_DESKTOP_BASELINE_2022_SPEC_VERSION}, + VP_LUNARG_DESKTOP_BASELINE_2022_MIN_API_VERSION, + VP_LUNARG_DESKTOP_BASELINE_2022::mergedCapabilities, + 0, + nullptr, + VP_LUNARG_DESKTOP_BASELINE_2022::capabilityCount, + VP_LUNARG_DESKTOP_BASELINE_2022::capabilities, + 0, + nullptr, + }, +#endif // VP_LUNARG_DESKTOP_BASELINE_2022 +#ifdef VP_LUNARG_desktop_baseline_2023 + VpProfileDesc{ + VpProfileProperties{VP_LUNARG_DESKTOP_BASELINE_2023_NAME, VP_LUNARG_DESKTOP_BASELINE_2023_SPEC_VERSION}, + VP_LUNARG_DESKTOP_BASELINE_2023_MIN_API_VERSION, + VP_LUNARG_DESKTOP_BASELINE_2023::mergedCapabilities, + 0, + nullptr, + VP_LUNARG_DESKTOP_BASELINE_2023::capabilityCount, + VP_LUNARG_DESKTOP_BASELINE_2023::capabilities, + 0, + nullptr, + }, +#endif // VP_LUNARG_DESKTOP_BASELINE_2023 +#ifdef VP_LUNARG_desktop_baseline_2024 + VpProfileDesc{ + VpProfileProperties{VP_LUNARG_DESKTOP_BASELINE_2024_NAME, VP_LUNARG_DESKTOP_BASELINE_2024_SPEC_VERSION}, + VP_LUNARG_DESKTOP_BASELINE_2024_MIN_API_VERSION, + VP_LUNARG_DESKTOP_BASELINE_2024::mergedCapabilities, + 0, + nullptr, + VP_LUNARG_DESKTOP_BASELINE_2024::capabilityCount, + VP_LUNARG_DESKTOP_BASELINE_2024::capabilities, + 0, + nullptr, }, -#endif // VP_KHR_ROADMAP_2024 +#endif // VP_LUNARG_DESKTOP_BASELINE_2024 #ifdef VP_LUNARG_minimum_requirements_1_0 VpProfileDesc{ - VpProfileProperties{ VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_SPEC_VERSION }, + VpProfileProperties{VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_SPEC_VERSION}, VP_LUNARG_MINIMUM_REQUIREMENTS_1_0_MIN_API_VERSION, VP_LUNARG_MINIMUM_REQUIREMENTS_1_0::mergedCapabilities, - 0, nullptr, - VP_LUNARG_MINIMUM_REQUIREMENTS_1_0::capabilityCount, VP_LUNARG_MINIMUM_REQUIREMENTS_1_0::capabilities, - 0, nullptr, + 0, + nullptr, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_0::capabilityCount, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_0::capabilities, + 0, + nullptr, }, -#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 +#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_0 #ifdef VP_LUNARG_minimum_requirements_1_1 VpProfileDesc{ - VpProfileProperties{ VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_SPEC_VERSION }, + VpProfileProperties{VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_SPEC_VERSION}, VP_LUNARG_MINIMUM_REQUIREMENTS_1_1_MIN_API_VERSION, VP_LUNARG_MINIMUM_REQUIREMENTS_1_1::mergedCapabilities, - 0, nullptr, - VP_LUNARG_MINIMUM_REQUIREMENTS_1_1::capabilityCount, VP_LUNARG_MINIMUM_REQUIREMENTS_1_1::capabilities, - 0, nullptr, + 0, + nullptr, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_1::capabilityCount, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_1::capabilities, + 0, + nullptr, }, -#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 +#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_1 #ifdef VP_LUNARG_minimum_requirements_1_2 VpProfileDesc{ - VpProfileProperties{ VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_SPEC_VERSION }, + VpProfileProperties{VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_SPEC_VERSION}, VP_LUNARG_MINIMUM_REQUIREMENTS_1_2_MIN_API_VERSION, VP_LUNARG_MINIMUM_REQUIREMENTS_1_2::mergedCapabilities, - 0, nullptr, - VP_LUNARG_MINIMUM_REQUIREMENTS_1_2::capabilityCount, VP_LUNARG_MINIMUM_REQUIREMENTS_1_2::capabilities, - 0, nullptr, + 0, + nullptr, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_2::capabilityCount, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_2::capabilities, + 0, + nullptr, }, -#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 +#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_2 #ifdef VP_LUNARG_minimum_requirements_1_3 VpProfileDesc{ - VpProfileProperties{ VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_SPEC_VERSION }, + VpProfileProperties{VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_NAME, VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_SPEC_VERSION}, VP_LUNARG_MINIMUM_REQUIREMENTS_1_3_MIN_API_VERSION, VP_LUNARG_MINIMUM_REQUIREMENTS_1_3::mergedCapabilities, - 0, nullptr, - VP_LUNARG_MINIMUM_REQUIREMENTS_1_3::capabilityCount, VP_LUNARG_MINIMUM_REQUIREMENTS_1_3::capabilities, - 0, nullptr, + 0, + nullptr, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_3::capabilityCount, + VP_LUNARG_MINIMUM_REQUIREMENTS_1_3::capabilities, + 0, + nullptr, }, -#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 +#endif // VP_LUNARG_MINIMUM_REQUIREMENTS_1_3 }; static const uint32_t profileCount = static_cast(std::size(profiles)); +struct FeaturesChain +{ + std::map structureSize; -struct FeaturesChain { - std::map structureSize; - - template - constexpr std::size_t size() const { - return (sizeof(T) - sizeof(VkBaseOutStructure)) / sizeof(VkBool32); - } + template + constexpr std::size_t size() const + { + return (sizeof(T) - sizeof(VkBaseOutStructure)) / sizeof(VkBool32); + } // Chain with all Vulkan Features structures - VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV physicalDeviceDeviceGeneratedCommandsFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, nullptr }; - VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV, nullptr }; - VkPhysicalDevicePrivateDataFeatures physicalDevicePrivateDataFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, nullptr }; - VkPhysicalDeviceVariablePointersFeatures physicalDeviceVariablePointersFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, nullptr }; - VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr }; - VkPhysicalDevicePresentIdFeaturesKHR physicalDevicePresentIdFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, nullptr }; - VkPhysicalDevicePresentWaitFeaturesKHR physicalDevicePresentWaitFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, nullptr }; - VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, nullptr }; - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, nullptr }; - VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, nullptr }; - VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, nullptr }; - VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT physicalDeviceBlendOperationAdvancedFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, nullptr }; - VkPhysicalDeviceMultiDrawFeaturesEXT physicalDeviceMultiDrawFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, nullptr }; - VkPhysicalDeviceInlineUniformBlockFeatures physicalDeviceInlineUniformBlockFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, nullptr }; - VkPhysicalDeviceMaintenance4Features physicalDeviceMaintenance4Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, nullptr }; - VkPhysicalDeviceMaintenance5FeaturesKHR physicalDeviceMaintenance5FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, nullptr }; - VkPhysicalDeviceMaintenance6FeaturesKHR physicalDeviceMaintenance6FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR, nullptr }; - VkPhysicalDeviceMaintenance7FeaturesKHR physicalDeviceMaintenance7FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderDrawParametersFeatures physicalDeviceShaderDrawParametersFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, nullptr }; - VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, nullptr }; - VkPhysicalDeviceHostQueryResetFeatures physicalDeviceHostQueryResetFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, nullptr }; - VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR physicalDeviceGlobalPriorityQueryFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR, nullptr }; - VkPhysicalDeviceDeviceMemoryReportFeaturesEXT physicalDeviceDeviceMemoryReportFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDescriptorIndexingFeatures physicalDeviceDescriptorIndexingFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, nullptr }; - VkPhysicalDeviceTimelineSemaphoreFeatures physicalDeviceTimelineSemaphoreFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, nullptr }; - VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, nullptr }; - VkPhysicalDeviceConditionalRenderingFeaturesEXT physicalDeviceConditionalRenderingFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, nullptr }; - VkPhysicalDeviceVulkanMemoryModelFeatures physicalDeviceVulkanMemoryModelFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, nullptr }; - VkPhysicalDeviceShaderAtomicInt64Features physicalDeviceShaderAtomicInt64Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, nullptr }; - VkPhysicalDeviceShaderAtomicFloatFeaturesEXT physicalDeviceShaderAtomicFloatFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, nullptr }; - VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT physicalDeviceShaderAtomicFloat2FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, nullptr }; - VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR physicalDeviceVertexAttributeDivisorFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, nullptr }; - VkPhysicalDeviceASTCDecodeFeaturesEXT physicalDeviceASTCDecodeFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, nullptr }; - VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV physicalDeviceRepresentativeFragmentTestFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, nullptr }; - VkPhysicalDeviceExclusiveScissorFeaturesNV physicalDeviceExclusiveScissorFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, nullptr }; - VkPhysicalDeviceCornerSampledImageFeaturesNV physicalDeviceCornerSampledImageFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, nullptr }; - VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR physicalDeviceComputeShaderDerivativesFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderImageFootprintFeaturesNV physicalDeviceShaderImageFootprintFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, nullptr }; - VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV physicalDeviceDedicatedAllocationImageAliasingFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, nullptr }; - VkPhysicalDeviceCopyMemoryIndirectFeaturesNV physicalDeviceCopyMemoryIndirectFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, nullptr }; - VkPhysicalDeviceMemoryDecompressionFeaturesNV physicalDeviceMemoryDecompressionFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, nullptr }; - VkPhysicalDeviceShadingRateImageFeaturesNV physicalDeviceShadingRateImageFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, nullptr }; - VkPhysicalDeviceInvocationMaskFeaturesHUAWEI physicalDeviceInvocationMaskFeaturesHUAWEI{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, nullptr }; - VkPhysicalDeviceMeshShaderFeaturesNV physicalDeviceMeshShaderFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, nullptr }; - VkPhysicalDeviceMeshShaderFeaturesEXT physicalDeviceMeshShaderFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, nullptr }; - VkPhysicalDeviceAccelerationStructureFeaturesKHR physicalDeviceAccelerationStructureFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, nullptr }; - VkPhysicalDeviceRayTracingPipelineFeaturesKHR physicalDeviceRayTracingPipelineFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, nullptr }; - VkPhysicalDeviceRayQueryFeaturesKHR physicalDeviceRayQueryFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, nullptr }; - VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR physicalDeviceRayTracingMaintenance1FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, nullptr }; - VkPhysicalDeviceFragmentDensityMapFeaturesEXT physicalDeviceFragmentDensityMapFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, nullptr }; - VkPhysicalDeviceFragmentDensityMap2FeaturesEXT physicalDeviceFragmentDensityMap2FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, nullptr }; - VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM physicalDeviceFragmentDensityMapOffsetFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceScalarBlockLayoutFeatures physicalDeviceScalarBlockLayoutFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, nullptr }; - VkPhysicalDeviceUniformBufferStandardLayoutFeatures physicalDeviceUniformBufferStandardLayoutFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, nullptr }; - VkPhysicalDeviceDepthClipEnableFeaturesEXT physicalDeviceDepthClipEnableFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceMemoryPriorityFeaturesEXT physicalDeviceMemoryPriorityFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, nullptr }; - VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT physicalDevicePageableDeviceLocalMemoryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, nullptr }; - VkPhysicalDeviceBufferDeviceAddressFeatures physicalDeviceBufferDeviceAddressFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, nullptr }; - VkPhysicalDeviceBufferDeviceAddressFeaturesEXT physicalDeviceBufferDeviceAddressFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceImagelessFramebufferFeatures physicalDeviceImagelessFramebufferFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, nullptr }; - VkPhysicalDeviceTextureCompressionASTCHDRFeatures physicalDeviceTextureCompressionASTCHDRFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, nullptr }; - VkPhysicalDeviceCooperativeMatrixFeaturesNV physicalDeviceCooperativeMatrixFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, nullptr }; - VkPhysicalDeviceYcbcrImageArraysFeaturesEXT physicalDeviceYcbcrImageArraysFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, nullptr }; - VkPhysicalDevicePresentBarrierFeaturesNV physicalDevicePresentBarrierFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, nullptr }; - VkPhysicalDevicePerformanceQueryFeaturesKHR physicalDevicePerformanceQueryFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, nullptr }; - VkPhysicalDeviceCoverageReductionModeFeaturesNV physicalDeviceCoverageReductionModeFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, nullptr }; - VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL physicalDeviceShaderIntegerFunctions2FeaturesINTEL{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, nullptr }; - VkPhysicalDeviceShaderClockFeaturesKHR physicalDeviceShaderClockFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, nullptr }; - VkPhysicalDeviceIndexTypeUint8FeaturesKHR physicalDeviceIndexTypeUint8FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderSMBuiltinsFeaturesNV physicalDeviceShaderSMBuiltinsFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, nullptr }; - VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT physicalDeviceFragmentShaderInterlockFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, nullptr }; - VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures physicalDeviceSeparateDepthStencilLayoutsFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, nullptr }; - VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, nullptr }; - VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR physicalDevicePipelineExecutablePropertiesFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures physicalDeviceShaderDemoteToHelperInvocationFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, nullptr }; - VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, nullptr }; - VkPhysicalDeviceSubgroupSizeControlFeatures physicalDeviceSubgroupSizeControlFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, nullptr }; - VkPhysicalDeviceLineRasterizationFeaturesKHR physicalDeviceLineRasterizationFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR, nullptr }; - VkPhysicalDevicePipelineCreationCacheControlFeatures physicalDevicePipelineCreationCacheControlFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, nullptr }; - VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr }; - VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr }; - VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, nullptr }; - VkPhysicalDeviceCoherentMemoryFeaturesAMD physicalDeviceCoherentMemoryFeaturesAMD{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, nullptr }; - VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, nullptr }; - VkPhysicalDeviceBorderColorSwizzleFeaturesEXT physicalDeviceBorderColorSwizzleFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT physicalDeviceExtendedDynamicStateFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceExtendedDynamicState2FeaturesEXT physicalDeviceExtendedDynamicState2FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, nullptr }; - VkPhysicalDeviceExtendedDynamicState3FeaturesEXT physicalDeviceExtendedDynamicState3FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDiagnosticsConfigFeaturesNV physicalDeviceDiagnosticsConfigFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, nullptr }; - VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures physicalDeviceZeroInitializeWorkgroupMemoryFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, nullptr }; - VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, nullptr }; - VkPhysicalDeviceRobustness2FeaturesEXT physicalDeviceRobustness2FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, nullptr }; - VkPhysicalDeviceImageRobustnessFeatures physicalDeviceImageRobustnessFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, nullptr }; - VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, nullptr }; + VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV physicalDeviceDeviceGeneratedCommandsFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, nullptr}; + VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV, nullptr}; + VkPhysicalDevicePrivateDataFeatures physicalDevicePrivateDataFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, nullptr}; + VkPhysicalDeviceClusterAccelerationStructureFeaturesNV physicalDeviceClusterAccelerationStructureFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV, nullptr}; + VkPhysicalDeviceVariablePointersFeatures physicalDeviceVariablePointersFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, nullptr}; + VkPhysicalDeviceMultiviewFeatures physicalDeviceMultiviewFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, nullptr}; + VkPhysicalDevicePresentIdFeaturesKHR physicalDevicePresentIdFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, nullptr}; + VkPhysicalDevicePresentId2FeaturesKHR physicalDevicePresentId2FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR, nullptr}; + VkPhysicalDevicePresentWaitFeaturesKHR physicalDevicePresentWaitFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, nullptr}; + VkPhysicalDevicePresentWait2FeaturesKHR physicalDevicePresentWait2FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR, nullptr}; + VkPhysicalDevice16BitStorageFeatures physicalDevice16BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, nullptr}; + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures physicalDeviceShaderSubgroupExtendedTypesFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, nullptr}; + VkPhysicalDeviceSamplerYcbcrConversionFeatures physicalDeviceSamplerYcbcrConversionFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, nullptr}; + VkPhysicalDeviceProtectedMemoryFeatures physicalDeviceProtectedMemoryFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, nullptr}; + VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT physicalDeviceBlendOperationAdvancedFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, nullptr}; + VkPhysicalDeviceMultiDrawFeaturesEXT physicalDeviceMultiDrawFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, nullptr}; + VkPhysicalDeviceInlineUniformBlockFeatures physicalDeviceInlineUniformBlockFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, nullptr}; + VkPhysicalDeviceMaintenance4Features physicalDeviceMaintenance4Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, nullptr}; + VkPhysicalDeviceMaintenance5Features physicalDeviceMaintenance5Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES, nullptr}; + VkPhysicalDeviceMaintenance6Features physicalDeviceMaintenance6Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES, nullptr}; + VkPhysicalDeviceMaintenance7FeaturesKHR physicalDeviceMaintenance7FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR, nullptr}; + VkPhysicalDeviceMaintenance8FeaturesKHR physicalDeviceMaintenance8FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR, nullptr}; + VkPhysicalDeviceMaintenance9FeaturesKHR physicalDeviceMaintenance9FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR, nullptr}; + VkPhysicalDeviceShaderDrawParametersFeatures physicalDeviceShaderDrawParametersFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, nullptr}; + VkPhysicalDeviceShaderFloat16Int8Features physicalDeviceShaderFloat16Int8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, nullptr}; + VkPhysicalDeviceHostQueryResetFeatures physicalDeviceHostQueryResetFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, nullptr}; + VkPhysicalDeviceGlobalPriorityQueryFeatures physicalDeviceGlobalPriorityQueryFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, nullptr}; + VkPhysicalDeviceDeviceMemoryReportFeaturesEXT physicalDeviceDeviceMemoryReportFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDescriptorIndexingFeatures physicalDeviceDescriptorIndexingFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, nullptr}; + VkPhysicalDeviceTimelineSemaphoreFeatures physicalDeviceTimelineSemaphoreFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, nullptr}; + VkPhysicalDevice8BitStorageFeatures physicalDevice8BitStorageFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, nullptr}; + VkPhysicalDeviceConditionalRenderingFeaturesEXT physicalDeviceConditionalRenderingFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, nullptr}; + VkPhysicalDeviceVulkanMemoryModelFeatures physicalDeviceVulkanMemoryModelFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, nullptr}; + VkPhysicalDeviceShaderAtomicInt64Features physicalDeviceShaderAtomicInt64Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, nullptr}; + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT physicalDeviceShaderAtomicFloatFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT physicalDeviceShaderAtomicFloat2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, nullptr}; + VkPhysicalDeviceVertexAttributeDivisorFeatures physicalDeviceVertexAttributeDivisorFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, nullptr}; + VkPhysicalDeviceASTCDecodeFeaturesEXT physicalDeviceASTCDecodeFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceTransformFeedbackFeaturesEXT physicalDeviceTransformFeedbackFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, nullptr}; + VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV physicalDeviceRepresentativeFragmentTestFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, nullptr}; + VkPhysicalDeviceExclusiveScissorFeaturesNV physicalDeviceExclusiveScissorFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, nullptr}; + VkPhysicalDeviceCornerSampledImageFeaturesNV physicalDeviceCornerSampledImageFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, nullptr}; + VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR physicalDeviceComputeShaderDerivativesFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR, nullptr}; + VkPhysicalDeviceShaderImageFootprintFeaturesNV physicalDeviceShaderImageFootprintFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, nullptr}; + VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV physicalDeviceDedicatedAllocationImageAliasingFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, nullptr}; + VkPhysicalDeviceCopyMemoryIndirectFeaturesNV physicalDeviceCopyMemoryIndirectFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, nullptr}; + VkPhysicalDeviceMemoryDecompressionFeaturesNV physicalDeviceMemoryDecompressionFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, nullptr}; + VkPhysicalDeviceShadingRateImageFeaturesNV physicalDeviceShadingRateImageFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, nullptr}; + VkPhysicalDeviceInvocationMaskFeaturesHUAWEI physicalDeviceInvocationMaskFeaturesHUAWEI{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, nullptr}; + VkPhysicalDeviceMeshShaderFeaturesNV physicalDeviceMeshShaderFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, nullptr}; + VkPhysicalDeviceMeshShaderFeaturesEXT physicalDeviceMeshShaderFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, nullptr}; + VkPhysicalDeviceAccelerationStructureFeaturesKHR physicalDeviceAccelerationStructureFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, nullptr}; + VkPhysicalDeviceRayTracingPipelineFeaturesKHR physicalDeviceRayTracingPipelineFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, nullptr}; + VkPhysicalDeviceRayQueryFeaturesKHR physicalDeviceRayQueryFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, nullptr}; + VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR physicalDeviceRayTracingMaintenance1FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, nullptr}; + VkPhysicalDeviceFragmentDensityMapFeaturesEXT physicalDeviceFragmentDensityMapFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, nullptr}; + VkPhysicalDeviceFragmentDensityMap2FeaturesEXT physicalDeviceFragmentDensityMap2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, nullptr}; + VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT physicalDeviceFragmentDensityMapOffsetFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT, nullptr}; + VkPhysicalDeviceScalarBlockLayoutFeatures physicalDeviceScalarBlockLayoutFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, nullptr}; + VkPhysicalDeviceUniformBufferStandardLayoutFeatures physicalDeviceUniformBufferStandardLayoutFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, nullptr}; + VkPhysicalDeviceDepthClipEnableFeaturesEXT physicalDeviceDepthClipEnableFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceMemoryPriorityFeaturesEXT physicalDeviceMemoryPriorityFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, nullptr}; + VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT physicalDevicePageableDeviceLocalMemoryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, nullptr}; + VkPhysicalDeviceBufferDeviceAddressFeatures physicalDeviceBufferDeviceAddressFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, nullptr}; + VkPhysicalDeviceBufferDeviceAddressFeaturesEXT physicalDeviceBufferDeviceAddressFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceImagelessFramebufferFeatures physicalDeviceImagelessFramebufferFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, nullptr}; + VkPhysicalDeviceTextureCompressionASTCHDRFeatures physicalDeviceTextureCompressionASTCHDRFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, nullptr}; + VkPhysicalDeviceCooperativeMatrixFeaturesNV physicalDeviceCooperativeMatrixFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, nullptr}; + VkPhysicalDeviceYcbcrImageArraysFeaturesEXT physicalDeviceYcbcrImageArraysFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, nullptr}; + VkPhysicalDevicePresentBarrierFeaturesNV physicalDevicePresentBarrierFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, nullptr}; + VkPhysicalDevicePerformanceQueryFeaturesKHR physicalDevicePerformanceQueryFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, nullptr}; + VkPhysicalDeviceCoverageReductionModeFeaturesNV physicalDeviceCoverageReductionModeFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, nullptr}; + VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL physicalDeviceShaderIntegerFunctions2FeaturesINTEL{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, nullptr}; + VkPhysicalDeviceShaderClockFeaturesKHR physicalDeviceShaderClockFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, nullptr}; + VkPhysicalDeviceIndexTypeUint8Features physicalDeviceIndexTypeUint8Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, nullptr}; + VkPhysicalDeviceShaderSMBuiltinsFeaturesNV physicalDeviceShaderSMBuiltinsFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, nullptr}; + VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT physicalDeviceFragmentShaderInterlockFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, nullptr}; + VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures physicalDeviceSeparateDepthStencilLayoutsFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, nullptr}; + VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physicalDevicePrimitiveTopologyListRestartFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, nullptr}; + VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR physicalDevicePipelineExecutablePropertiesFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, nullptr}; + VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures physicalDeviceShaderDemoteToHelperInvocationFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, nullptr}; + VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physicalDeviceTexelBufferAlignmentFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, nullptr}; + VkPhysicalDeviceSubgroupSizeControlFeatures physicalDeviceSubgroupSizeControlFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, nullptr}; + VkPhysicalDeviceLineRasterizationFeatures physicalDeviceLineRasterizationFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, nullptr}; + VkPhysicalDevicePipelineCreationCacheControlFeatures physicalDevicePipelineCreationCacheControlFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, nullptr}; + VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, nullptr}; + VkPhysicalDeviceVulkan12Features physicalDeviceVulkan12Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr}; + VkPhysicalDeviceVulkan13Features physicalDeviceVulkan13Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, nullptr}; + VkPhysicalDeviceVulkan14Features physicalDeviceVulkan14Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES, nullptr}; + VkPhysicalDeviceCoherentMemoryFeaturesAMD physicalDeviceCoherentMemoryFeaturesAMD{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, nullptr}; + VkPhysicalDeviceCustomBorderColorFeaturesEXT physicalDeviceCustomBorderColorFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, nullptr}; + VkPhysicalDeviceBorderColorSwizzleFeaturesEXT physicalDeviceBorderColorSwizzleFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT physicalDeviceExtendedDynamicStateFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceExtendedDynamicState2FeaturesEXT physicalDeviceExtendedDynamicState2FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, nullptr}; + VkPhysicalDeviceExtendedDynamicState3FeaturesEXT physicalDeviceExtendedDynamicState3FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, nullptr}; + VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV physicalDevicePartitionedAccelerationStructureFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV, nullptr}; + VkPhysicalDeviceDiagnosticsConfigFeaturesNV physicalDeviceDiagnosticsConfigFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, nullptr}; + VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures physicalDeviceZeroInitializeWorkgroupMemoryFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, nullptr}; + VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, nullptr}; + VkPhysicalDeviceRobustness2FeaturesKHR physicalDeviceRobustness2FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR, nullptr}; + VkPhysicalDeviceImageRobustnessFeatures physicalDeviceImageRobustnessFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, nullptr}; + VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, nullptr}; #ifdef VK_ENABLE_BETA_EXTENSIONS - VkPhysicalDevicePortabilitySubsetFeaturesKHR physicalDevicePortabilitySubsetFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, nullptr }; + VkPhysicalDevicePortabilitySubsetFeaturesKHR physicalDevicePortabilitySubsetFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, nullptr}; #endif - VkPhysicalDevice4444FormatsFeaturesEXT physicalDevice4444FormatsFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceSubpassShadingFeaturesHUAWEI physicalDeviceSubpassShadingFeaturesHUAWEI{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, nullptr }; - VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI physicalDeviceClusterCullingShaderFeaturesHUAWEI{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI, nullptr }; - VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT physicalDeviceShaderImageAtomicInt64FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, nullptr }; - VkPhysicalDeviceFragmentShadingRateFeaturesKHR physicalDeviceFragmentShadingRateFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderTerminateInvocationFeatures physicalDeviceShaderTerminateInvocationFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, nullptr }; - VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV physicalDeviceFragmentShadingRateEnumsFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, nullptr }; - VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, nullptr }; - VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT physicalDeviceImageSlicedViewOf3DFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT, nullptr }; - VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT physicalDeviceLegacyVertexAttributesFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT, nullptr }; - VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT physicalDeviceMutableDescriptorTypeFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDepthClipControlFeaturesEXT physicalDeviceDepthClipControlFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT physicalDeviceDeviceGeneratedCommandsFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDepthClampControlFeaturesEXT physicalDeviceDepthClampControlFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT, nullptr }; - VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT physicalDeviceVertexInputDynamicStateFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceExternalMemoryRDMAFeaturesNV physicalDeviceExternalMemoryRDMAFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, nullptr }; - VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR, nullptr }; - VkPhysicalDeviceColorWriteEnableFeaturesEXT physicalDeviceColorWriteEnableFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceSynchronization2Features physicalDeviceSynchronization2Features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, nullptr }; - VkPhysicalDeviceHostImageCopyFeaturesEXT physicalDeviceHostImageCopyFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT, nullptr }; - VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, nullptr }; - VkPhysicalDeviceLegacyDitheringFeaturesEXT physicalDeviceLegacyDitheringFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, nullptr }; - VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, nullptr }; - VkPhysicalDevicePipelineProtectedAccessFeaturesEXT physicalDevicePipelineProtectedAccessFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceVideoMaintenance1FeaturesKHR physicalDeviceVideoMaintenance1FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR, nullptr }; - VkPhysicalDeviceInheritedViewportScissorFeaturesNV physicalDeviceInheritedViewportScissorFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, nullptr }; - VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT physicalDeviceYcbcr2Plane444FormatsFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDescriptorBufferFeaturesEXT physicalDeviceDescriptorBufferFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, nullptr }; - VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, nullptr }; - VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR physicalDeviceFragmentShaderBarycentricFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, nullptr }; - VkPhysicalDeviceRayTracingMotionBlurFeaturesNV physicalDeviceRayTracingMotionBlurFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, nullptr }; - VkPhysicalDeviceRayTracingValidationFeaturesNV physicalDeviceRayTracingValidationFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV, nullptr }; - VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT physicalDeviceRGBA10X6FormatsFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDynamicRenderingFeatures physicalDeviceDynamicRenderingFeatures{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, nullptr }; - VkPhysicalDeviceImageViewMinLodFeaturesEXT physicalDeviceImageViewMinLodFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, nullptr }; - VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceLinearColorAttachmentFeaturesNV physicalDeviceLinearColorAttachmentFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, nullptr }; - VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT physicalDeviceGraphicsPipelineLibraryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, nullptr }; - VkPhysicalDevicePipelineBinaryFeaturesKHR physicalDevicePipelineBinaryFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR, nullptr }; - VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE physicalDeviceDescriptorSetHostMappingFeaturesVALVE{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, nullptr }; - VkPhysicalDeviceNestedCommandBufferFeaturesEXT physicalDeviceNestedCommandBufferFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT, nullptr }; - VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT physicalDeviceShaderModuleIdentifierFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, nullptr }; - VkPhysicalDeviceImageCompressionControlFeaturesEXT physicalDeviceImageCompressionControlFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, nullptr }; - VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT physicalDeviceImageCompressionControlSwapchainFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, nullptr }; - VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT physicalDeviceSubpassMergeFeedbackFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, nullptr }; - VkPhysicalDeviceOpacityMicromapFeaturesEXT physicalDeviceOpacityMicromapFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, nullptr }; + VkPhysicalDevice4444FormatsFeaturesEXT physicalDevice4444FormatsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceSubpassShadingFeaturesHUAWEI physicalDeviceSubpassShadingFeaturesHUAWEI{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, nullptr}; + VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI physicalDeviceClusterCullingShaderFeaturesHUAWEI{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI, nullptr}; + VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT physicalDeviceShaderImageAtomicInt64FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, nullptr}; + VkPhysicalDeviceFragmentShadingRateFeaturesKHR physicalDeviceFragmentShadingRateFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, nullptr}; + VkPhysicalDeviceShaderTerminateInvocationFeatures physicalDeviceShaderTerminateInvocationFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, nullptr}; + VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV physicalDeviceFragmentShadingRateEnumsFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, nullptr}; + VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physicalDeviceImage2DViewOf3DFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, nullptr}; + VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT physicalDeviceImageSlicedViewOf3DFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT, nullptr}; + VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT physicalDeviceLegacyVertexAttributesFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT, nullptr}; + VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT physicalDeviceMutableDescriptorTypeFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDepthClipControlFeaturesEXT physicalDeviceDepthClipControlFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, nullptr}; + VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT physicalDeviceZeroInitializeDeviceMemoryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT physicalDeviceDeviceGeneratedCommandsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDepthClampControlFeaturesEXT physicalDeviceDepthClampControlFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT, nullptr}; + VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT physicalDeviceVertexInputDynamicStateFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceExternalMemoryRDMAFeaturesNV physicalDeviceExternalMemoryRDMAFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, nullptr}; + VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR, nullptr}; + VkPhysicalDeviceColorWriteEnableFeaturesEXT physicalDeviceColorWriteEnableFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, nullptr}; + VkPhysicalDeviceSynchronization2Features physicalDeviceSynchronization2Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, nullptr}; + VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR physicalDeviceUnifiedImageLayoutsFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR, nullptr}; + VkPhysicalDeviceHostImageCopyFeatures physicalDeviceHostImageCopyFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES, nullptr}; + VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physicalDevicePrimitivesGeneratedQueryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, nullptr}; + VkPhysicalDeviceLegacyDitheringFeaturesEXT physicalDeviceLegacyDitheringFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, nullptr}; + VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, nullptr}; + VkPhysicalDevicePipelineProtectedAccessFeatures physicalDevicePipelineProtectedAccessFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES, nullptr}; + VkPhysicalDeviceVideoMaintenance1FeaturesKHR physicalDeviceVideoMaintenance1FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR, nullptr}; + VkPhysicalDeviceVideoMaintenance2FeaturesKHR physicalDeviceVideoMaintenance2FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR, nullptr}; + VkPhysicalDeviceVideoDecodeVP9FeaturesKHR physicalDeviceVideoDecodeVP9FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR, nullptr}; + VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR physicalDeviceVideoEncodeQuantizationMapFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR, nullptr}; + VkPhysicalDeviceVideoEncodeAV1FeaturesKHR physicalDeviceVideoEncodeAV1FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR, nullptr}; + VkPhysicalDeviceInheritedViewportScissorFeaturesNV physicalDeviceInheritedViewportScissorFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, nullptr}; + VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT physicalDeviceYcbcr2Plane444FormatsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceProvokingVertexFeaturesEXT physicalDeviceProvokingVertexFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, nullptr}; + VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR physicalDeviceVideoEncodeIntraRefreshFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR, nullptr}; + VkPhysicalDeviceDescriptorBufferFeaturesEXT physicalDeviceDescriptorBufferFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderIntegerDotProductFeatures physicalDeviceShaderIntegerDotProductFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, nullptr}; + VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR physicalDeviceFragmentShaderBarycentricFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, nullptr}; + VkPhysicalDeviceRayTracingMotionBlurFeaturesNV physicalDeviceRayTracingMotionBlurFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, nullptr}; + VkPhysicalDeviceRayTracingValidationFeaturesNV physicalDeviceRayTracingValidationFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV, nullptr}; + VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV physicalDeviceRayTracingLinearSweptSpheresFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV, nullptr}; + VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT physicalDeviceRGBA10X6FormatsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDynamicRenderingFeatures physicalDeviceDynamicRenderingFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, nullptr}; + VkPhysicalDeviceImageViewMinLodFeaturesEXT physicalDeviceImageViewMinLodFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, nullptr}; + VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceLinearColorAttachmentFeaturesNV physicalDeviceLinearColorAttachmentFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, nullptr}; + VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT physicalDeviceGraphicsPipelineLibraryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, nullptr}; + VkPhysicalDevicePipelineBinaryFeaturesKHR physicalDevicePipelineBinaryFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR, nullptr}; + VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE physicalDeviceDescriptorSetHostMappingFeaturesVALVE{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, nullptr}; + VkPhysicalDeviceNestedCommandBufferFeaturesEXT physicalDeviceNestedCommandBufferFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT physicalDeviceShaderModuleIdentifierFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, nullptr}; + VkPhysicalDeviceImageCompressionControlFeaturesEXT physicalDeviceImageCompressionControlFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, nullptr}; + VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT physicalDeviceImageCompressionControlSwapchainFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, nullptr}; + VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT physicalDeviceSubpassMergeFeedbackFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, nullptr}; + VkPhysicalDeviceOpacityMicromapFeaturesEXT physicalDeviceOpacityMicromapFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, nullptr}; #ifdef VK_ENABLE_BETA_EXTENSIONS - VkPhysicalDeviceDisplacementMicromapFeaturesNV physicalDeviceDisplacementMicromapFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV, nullptr }; + VkPhysicalDeviceDisplacementMicromapFeaturesNV physicalDeviceDisplacementMicromapFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV, nullptr}; #endif - VkPhysicalDevicePipelinePropertiesFeaturesEXT physicalDevicePipelinePropertiesFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, nullptr }; - VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, nullptr }; - VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT physicalDeviceNonSeamlessCubeMapFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, nullptr }; - VkPhysicalDevicePipelineRobustnessFeaturesEXT physicalDevicePipelineRobustnessFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceImageProcessingFeaturesQCOM physicalDeviceImageProcessingFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceTilePropertiesFeaturesQCOM physicalDeviceTilePropertiesFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceAmigoProfilingFeaturesSEC physicalDeviceAmigoProfilingFeaturesSEC{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, nullptr }; - VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDepthClampZeroOneFeaturesEXT physicalDeviceDepthClampZeroOneFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT, nullptr }; - VkPhysicalDeviceAddressBindingReportFeaturesEXT physicalDeviceAddressBindingReportFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, nullptr }; - VkPhysicalDeviceOpticalFlowFeaturesNV physicalDeviceOpticalFlowFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, nullptr }; - VkPhysicalDeviceFaultFeaturesEXT physicalDeviceFaultFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, nullptr }; - VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT physicalDevicePipelineLibraryGroupHandlesFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT, nullptr }; - VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM physicalDeviceShaderCoreBuiltinsFeaturesARM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM, nullptr }; - VkPhysicalDeviceFrameBoundaryFeaturesEXT physicalDeviceFrameBoundaryFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT, nullptr }; - VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT physicalDeviceSwapchainMaintenance1FeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, nullptr }; - VkPhysicalDeviceDepthBiasControlFeaturesEXT physicalDeviceDepthBiasControlFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT, nullptr }; - VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV physicalDeviceRayTracingInvocationReorderFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, nullptr }; - VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV physicalDeviceExtendedSparseAddressSpaceFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV, nullptr }; - VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM physicalDeviceMultiviewPerViewViewportsFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR physicalDeviceRayTracingPositionFetchFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, nullptr }; - VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceShaderObjectFeaturesEXT physicalDeviceShaderObjectFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT, nullptr }; - VkPhysicalDeviceShaderTileImageFeaturesEXT physicalDeviceShaderTileImageFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT, nullptr }; + VkPhysicalDevicePipelinePropertiesFeaturesEXT physicalDevicePipelinePropertiesFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, nullptr}; + VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT physicalDeviceNonSeamlessCubeMapFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, nullptr}; + VkPhysicalDevicePipelineRobustnessFeatures physicalDevicePipelineRobustnessFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, nullptr}; + VkPhysicalDeviceImageProcessingFeaturesQCOM physicalDeviceImageProcessingFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceTilePropertiesFeaturesQCOM physicalDeviceTilePropertiesFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceAmigoProfilingFeaturesSEC physicalDeviceAmigoProfilingFeaturesSEC{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, nullptr}; + VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, nullptr}; + VkPhysicalDeviceAddressBindingReportFeaturesEXT physicalDeviceAddressBindingReportFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, nullptr}; + VkPhysicalDeviceOpticalFlowFeaturesNV physicalDeviceOpticalFlowFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, nullptr}; + VkPhysicalDeviceFaultFeaturesEXT physicalDeviceFaultFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, nullptr}; + VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT physicalDevicePipelineLibraryGroupHandlesFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM physicalDeviceShaderCoreBuiltinsFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM, nullptr}; + VkPhysicalDeviceFrameBoundaryFeaturesEXT physicalDeviceFrameBoundaryFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR physicalDeviceSwapchainMaintenance1FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR, nullptr}; + VkPhysicalDeviceDepthBiasControlFeaturesEXT physicalDeviceDepthBiasControlFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT, nullptr}; + VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV physicalDeviceRayTracingInvocationReorderFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, nullptr}; + VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV physicalDeviceExtendedSparseAddressSpaceFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV, nullptr}; + VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM physicalDeviceMultiviewPerViewViewportsFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR physicalDeviceRayTracingPositionFetchFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, nullptr}; + VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceShaderObjectFeaturesEXT physicalDeviceShaderObjectFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderTileImageFeaturesEXT physicalDeviceShaderTileImageFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT, nullptr}; #ifdef VK_USE_PLATFORM_SCREEN_QNX - VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX physicalDeviceExternalMemoryScreenBufferFeaturesQNX{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX, nullptr }; + VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX physicalDeviceExternalMemoryScreenBufferFeaturesQNX{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX, nullptr}; #endif - VkPhysicalDeviceCooperativeMatrixFeaturesKHR physicalDeviceCooperativeMatrixFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, nullptr }; + VkPhysicalDeviceCooperativeMatrixFeaturesKHR physicalDeviceCooperativeMatrixFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, nullptr}; #ifdef VK_ENABLE_BETA_EXTENSIONS - VkPhysicalDeviceShaderEnqueueFeaturesAMDX physicalDeviceShaderEnqueueFeaturesAMDX{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX, nullptr }; + VkPhysicalDeviceShaderEnqueueFeaturesAMDX physicalDeviceShaderEnqueueFeaturesAMDX{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX, nullptr}; #endif - VkPhysicalDeviceAntiLagFeaturesAMD physicalDeviceAntiLagFeaturesAMD{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD, nullptr }; - VkPhysicalDeviceCubicClampFeaturesQCOM physicalDeviceCubicClampFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceYcbcrDegammaFeaturesQCOM physicalDeviceYcbcrDegammaFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceCubicWeightsFeaturesQCOM physicalDeviceCubicWeightsFeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceImageProcessing2FeaturesQCOM physicalDeviceImageProcessing2FeaturesQCOM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM, nullptr }; - VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV physicalDeviceDescriptorPoolOverallocationFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV, nullptr }; - VkPhysicalDevicePerStageDescriptorSetFeaturesNV physicalDevicePerStageDescriptorSetFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV, nullptr }; + VkPhysicalDeviceAntiLagFeaturesAMD physicalDeviceAntiLagFeaturesAMD{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD, nullptr}; + VkPhysicalDeviceTileMemoryHeapFeaturesQCOM physicalDeviceTileMemoryHeapFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceCubicClampFeaturesQCOM physicalDeviceCubicClampFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceYcbcrDegammaFeaturesQCOM physicalDeviceYcbcrDegammaFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceCubicWeightsFeaturesQCOM physicalDeviceCubicWeightsFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceImageProcessing2FeaturesQCOM physicalDeviceImageProcessing2FeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV physicalDeviceDescriptorPoolOverallocationFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV, nullptr}; + VkPhysicalDevicePerStageDescriptorSetFeaturesNV physicalDevicePerStageDescriptorSetFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV, nullptr}; #ifdef VK_USE_PLATFORM_ANDROID_KHR - VkPhysicalDeviceExternalFormatResolveFeaturesANDROID physicalDeviceExternalFormatResolveFeaturesANDROID{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID, nullptr }; + VkPhysicalDeviceExternalFormatResolveFeaturesANDROID physicalDeviceExternalFormatResolveFeaturesANDROID{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID, nullptr}; +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VkPhysicalDeviceCudaKernelLaunchFeaturesNV physicalDeviceCudaKernelLaunchFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV, nullptr}; +#endif + VkPhysicalDeviceSchedulingControlsFeaturesARM physicalDeviceSchedulingControlsFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM, nullptr}; + VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, nullptr}; + VkPhysicalDeviceRenderPassStripedFeaturesARM physicalDeviceRenderPassStripedFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM, nullptr}; + VkPhysicalDevicePipelineOpacityMicromapFeaturesARM physicalDevicePipelineOpacityMicromapFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM, nullptr}; + VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR physicalDeviceShaderMaximalReconvergenceFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR, nullptr}; + VkPhysicalDeviceShaderSubgroupRotateFeatures physicalDeviceShaderSubgroupRotateFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES, nullptr}; + VkPhysicalDeviceShaderExpectAssumeFeatures physicalDeviceShaderExpectAssumeFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES, nullptr}; + VkPhysicalDeviceShaderFloatControls2Features physicalDeviceShaderFloatControls2Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES, nullptr}; + VkPhysicalDeviceDynamicRenderingLocalReadFeatures physicalDeviceDynamicRenderingLocalReadFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES, nullptr}; + VkPhysicalDeviceShaderQuadControlFeaturesKHR physicalDeviceShaderQuadControlFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR, nullptr}; + VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV physicalDeviceShaderAtomicFloat16VectorFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV, nullptr}; + VkPhysicalDeviceMapMemoryPlacedFeaturesEXT physicalDeviceMapMemoryPlacedFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT, nullptr}; + VkPhysicalDeviceShaderBfloat16FeaturesKHR physicalDeviceShaderBfloat16FeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR, nullptr}; + VkPhysicalDeviceRawAccessChainsFeaturesNV physicalDeviceRawAccessChainsFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV, nullptr}; + VkPhysicalDeviceCommandBufferInheritanceFeaturesNV physicalDeviceCommandBufferInheritanceFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV, nullptr}; + VkPhysicalDeviceImageAlignmentControlFeaturesMESA physicalDeviceImageAlignmentControlFeaturesMESA{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA, nullptr}; + VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT physicalDeviceShaderReplicatedCompositesFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT, nullptr}; + VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR physicalDevicePresentModeFifoLatestReadyFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR, nullptr}; + VkPhysicalDeviceCooperativeMatrix2FeaturesNV physicalDeviceCooperativeMatrix2FeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV, nullptr}; + VkPhysicalDeviceHdrVividFeaturesHUAWEI physicalDeviceHdrVividFeaturesHUAWEI{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI, nullptr}; + VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT physicalDeviceVertexAttributeRobustnessFeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDepthClampZeroOneFeaturesKHR physicalDeviceDepthClampZeroOneFeaturesKHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR, nullptr}; + VkPhysicalDeviceCooperativeVectorFeaturesNV physicalDeviceCooperativeVectorFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV, nullptr}; + VkPhysicalDeviceTileShadingFeaturesQCOM physicalDeviceTileShadingFeaturesQCOM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM, nullptr}; + VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE physicalDeviceFragmentDensityMapLayeredFeaturesVALVE{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE, nullptr}; +#ifdef VK_ENABLE_BETA_EXTENSIONS + VkPhysicalDevicePresentMeteringFeaturesNV physicalDevicePresentMeteringFeaturesNV{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV, nullptr}; #endif - VkPhysicalDeviceCudaKernelLaunchFeaturesNV physicalDeviceCudaKernelLaunchFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV, nullptr }; - VkPhysicalDeviceSchedulingControlsFeaturesARM physicalDeviceSchedulingControlsFeaturesARM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM, nullptr }; - VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physicalDeviceRelaxedLineRasterizationFeaturesIMG{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, nullptr }; - VkPhysicalDeviceRenderPassStripedFeaturesARM physicalDeviceRenderPassStripedFeaturesARM{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM, nullptr }; - VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR physicalDeviceShaderMaximalReconvergenceFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR physicalDeviceShaderSubgroupRotateFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderExpectAssumeFeaturesKHR physicalDeviceShaderExpectAssumeFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderFloatControls2FeaturesKHR physicalDeviceShaderFloatControls2FeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR, nullptr }; - VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR physicalDeviceDynamicRenderingLocalReadFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderQuadControlFeaturesKHR physicalDeviceShaderQuadControlFeaturesKHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR, nullptr }; - VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV physicalDeviceShaderAtomicFloat16VectorFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV, nullptr }; - VkPhysicalDeviceMapMemoryPlacedFeaturesEXT physicalDeviceMapMemoryPlacedFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT, nullptr }; - VkPhysicalDeviceRawAccessChainsFeaturesNV physicalDeviceRawAccessChainsFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV, nullptr }; - VkPhysicalDeviceCommandBufferInheritanceFeaturesNV physicalDeviceCommandBufferInheritanceFeaturesNV{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV, nullptr }; - VkPhysicalDeviceImageAlignmentControlFeaturesMESA physicalDeviceImageAlignmentControlFeaturesMESA{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA, nullptr }; - VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT physicalDeviceShaderReplicatedCompositesFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT, nullptr }; - VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT physicalDevicePresentModeFifoLatestReadyFeaturesEXT{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT, nullptr }; - VkPhysicalDeviceFeatures2KHR physicalDeviceFeatures2KHR{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, nullptr }; - - FeaturesChain() { - // Initializing all feature structures, number of Features (VkBool32) per structure. - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, size() }); + VkPhysicalDeviceFormatPackFeaturesARM physicalDeviceFormatPackFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM, nullptr}; + VkPhysicalDeviceTensorFeaturesARM physicalDeviceTensorFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM, nullptr}; + VkPhysicalDeviceDescriptorBufferTensorFeaturesARM physicalDeviceDescriptorBufferTensorFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM, nullptr}; + VkPhysicalDeviceShaderFloat8FeaturesEXT physicalDeviceShaderFloat8FeaturesEXT{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT, nullptr}; + VkPhysicalDeviceDataGraphFeaturesARM physicalDeviceDataGraphFeaturesARM{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM, nullptr}; + VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC physicalDevicePipelineCacheIncrementalModeFeaturesSEC{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC, nullptr}; + VkPhysicalDeviceFeatures2KHR physicalDeviceFeatures2KHR{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, nullptr}; + + FeaturesChain() + { + // Initializing all feature structures, number of Features (VkBool32) per structure. + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, size()}); #ifdef VK_ENABLE_BETA_EXTENSIONS - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, size()}); #endif - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT, size()}); #ifdef VK_ENABLE_BETA_EXTENSIONS - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV, size()}); #endif - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT, size()}); #ifdef VK_USE_PLATFORM_SCREEN_QNX - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX, size()}); #endif - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, size()}); #ifdef VK_ENABLE_BETA_EXTENSIONS - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX, size()}); #endif - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV, size()}); #ifdef VK_USE_PLATFORM_ANDROID_KHR - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID, size() }); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID, size()}); +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV, size()}); +#endif + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE, size()}); +#ifdef VK_ENABLE_BETA_EXTENSIONS + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV, size()}); #endif - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT, size() }); - this->structureSize.insert({ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, size() }); - - //Initializing the full list of available structure features - void* pNext = nullptr; - physicalDeviceDeviceGeneratedCommandsFeaturesNV.pNext = pNext; - pNext = &physicalDeviceDeviceGeneratedCommandsFeaturesNV; - physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.pNext = pNext; - pNext = &physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV; - physicalDevicePrivateDataFeatures.pNext = pNext; - pNext = &physicalDevicePrivateDataFeatures; - physicalDeviceVariablePointersFeatures.pNext = pNext; - pNext = &physicalDeviceVariablePointersFeatures; - physicalDeviceMultiviewFeatures.pNext = pNext; - pNext = &physicalDeviceMultiviewFeatures; - physicalDevicePresentIdFeaturesKHR.pNext = pNext; - pNext = &physicalDevicePresentIdFeaturesKHR; - physicalDevicePresentWaitFeaturesKHR.pNext = pNext; - pNext = &physicalDevicePresentWaitFeaturesKHR; - physicalDevice16BitStorageFeatures.pNext = pNext; - pNext = &physicalDevice16BitStorageFeatures; - physicalDeviceShaderSubgroupExtendedTypesFeatures.pNext = pNext; - pNext = &physicalDeviceShaderSubgroupExtendedTypesFeatures; - physicalDeviceSamplerYcbcrConversionFeatures.pNext = pNext; - pNext = &physicalDeviceSamplerYcbcrConversionFeatures; - physicalDeviceProtectedMemoryFeatures.pNext = pNext; - pNext = &physicalDeviceProtectedMemoryFeatures; - physicalDeviceBlendOperationAdvancedFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceBlendOperationAdvancedFeaturesEXT; - physicalDeviceMultiDrawFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceMultiDrawFeaturesEXT; - physicalDeviceInlineUniformBlockFeatures.pNext = pNext; - pNext = &physicalDeviceInlineUniformBlockFeatures; - physicalDeviceMaintenance4Features.pNext = pNext; - pNext = &physicalDeviceMaintenance4Features; - physicalDeviceMaintenance5FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceMaintenance5FeaturesKHR; - physicalDeviceMaintenance6FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceMaintenance6FeaturesKHR; - physicalDeviceMaintenance7FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceMaintenance7FeaturesKHR; - physicalDeviceShaderDrawParametersFeatures.pNext = pNext; - pNext = &physicalDeviceShaderDrawParametersFeatures; - physicalDeviceShaderFloat16Int8Features.pNext = pNext; - pNext = &physicalDeviceShaderFloat16Int8Features; - physicalDeviceHostQueryResetFeatures.pNext = pNext; - pNext = &physicalDeviceHostQueryResetFeatures; - physicalDeviceGlobalPriorityQueryFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceGlobalPriorityQueryFeaturesKHR; - physicalDeviceDeviceMemoryReportFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDeviceMemoryReportFeaturesEXT; - physicalDeviceDescriptorIndexingFeatures.pNext = pNext; - pNext = &physicalDeviceDescriptorIndexingFeatures; - physicalDeviceTimelineSemaphoreFeatures.pNext = pNext; - pNext = &physicalDeviceTimelineSemaphoreFeatures; - physicalDevice8BitStorageFeatures.pNext = pNext; - pNext = &physicalDevice8BitStorageFeatures; - physicalDeviceConditionalRenderingFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceConditionalRenderingFeaturesEXT; - physicalDeviceVulkanMemoryModelFeatures.pNext = pNext; - pNext = &physicalDeviceVulkanMemoryModelFeatures; - physicalDeviceShaderAtomicInt64Features.pNext = pNext; - pNext = &physicalDeviceShaderAtomicInt64Features; - physicalDeviceShaderAtomicFloatFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderAtomicFloatFeaturesEXT; - physicalDeviceShaderAtomicFloat2FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderAtomicFloat2FeaturesEXT; - physicalDeviceVertexAttributeDivisorFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceVertexAttributeDivisorFeaturesKHR; - physicalDeviceASTCDecodeFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceASTCDecodeFeaturesEXT; - physicalDeviceTransformFeedbackFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceTransformFeedbackFeaturesEXT; - physicalDeviceRepresentativeFragmentTestFeaturesNV.pNext = pNext; - pNext = &physicalDeviceRepresentativeFragmentTestFeaturesNV; - physicalDeviceExclusiveScissorFeaturesNV.pNext = pNext; - pNext = &physicalDeviceExclusiveScissorFeaturesNV; - physicalDeviceCornerSampledImageFeaturesNV.pNext = pNext; - pNext = &physicalDeviceCornerSampledImageFeaturesNV; - physicalDeviceComputeShaderDerivativesFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceComputeShaderDerivativesFeaturesKHR; - physicalDeviceShaderImageFootprintFeaturesNV.pNext = pNext; - pNext = &physicalDeviceShaderImageFootprintFeaturesNV; - physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.pNext = pNext; - pNext = &physicalDeviceDedicatedAllocationImageAliasingFeaturesNV; - physicalDeviceCopyMemoryIndirectFeaturesNV.pNext = pNext; - pNext = &physicalDeviceCopyMemoryIndirectFeaturesNV; - physicalDeviceMemoryDecompressionFeaturesNV.pNext = pNext; - pNext = &physicalDeviceMemoryDecompressionFeaturesNV; - physicalDeviceShadingRateImageFeaturesNV.pNext = pNext; - pNext = &physicalDeviceShadingRateImageFeaturesNV; - physicalDeviceInvocationMaskFeaturesHUAWEI.pNext = pNext; - pNext = &physicalDeviceInvocationMaskFeaturesHUAWEI; - physicalDeviceMeshShaderFeaturesNV.pNext = pNext; - pNext = &physicalDeviceMeshShaderFeaturesNV; - physicalDeviceMeshShaderFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceMeshShaderFeaturesEXT; - physicalDeviceAccelerationStructureFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceAccelerationStructureFeaturesKHR; - physicalDeviceRayTracingPipelineFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceRayTracingPipelineFeaturesKHR; - physicalDeviceRayQueryFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceRayQueryFeaturesKHR; - physicalDeviceRayTracingMaintenance1FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceRayTracingMaintenance1FeaturesKHR; - physicalDeviceFragmentDensityMapFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceFragmentDensityMapFeaturesEXT; - physicalDeviceFragmentDensityMap2FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceFragmentDensityMap2FeaturesEXT; - physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceFragmentDensityMapOffsetFeaturesQCOM; - physicalDeviceScalarBlockLayoutFeatures.pNext = pNext; - pNext = &physicalDeviceScalarBlockLayoutFeatures; - physicalDeviceUniformBufferStandardLayoutFeatures.pNext = pNext; - pNext = &physicalDeviceUniformBufferStandardLayoutFeatures; - physicalDeviceDepthClipEnableFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDepthClipEnableFeaturesEXT; - physicalDeviceMemoryPriorityFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceMemoryPriorityFeaturesEXT; - physicalDevicePageableDeviceLocalMemoryFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePageableDeviceLocalMemoryFeaturesEXT; - physicalDeviceBufferDeviceAddressFeatures.pNext = pNext; - pNext = &physicalDeviceBufferDeviceAddressFeatures; - physicalDeviceBufferDeviceAddressFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceBufferDeviceAddressFeaturesEXT; - physicalDeviceImagelessFramebufferFeatures.pNext = pNext; - pNext = &physicalDeviceImagelessFramebufferFeatures; - physicalDeviceTextureCompressionASTCHDRFeatures.pNext = pNext; - pNext = &physicalDeviceTextureCompressionASTCHDRFeatures; - physicalDeviceCooperativeMatrixFeaturesNV.pNext = pNext; - pNext = &physicalDeviceCooperativeMatrixFeaturesNV; - physicalDeviceYcbcrImageArraysFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceYcbcrImageArraysFeaturesEXT; - physicalDevicePresentBarrierFeaturesNV.pNext = pNext; - pNext = &physicalDevicePresentBarrierFeaturesNV; - physicalDevicePerformanceQueryFeaturesKHR.pNext = pNext; - pNext = &physicalDevicePerformanceQueryFeaturesKHR; - physicalDeviceCoverageReductionModeFeaturesNV.pNext = pNext; - pNext = &physicalDeviceCoverageReductionModeFeaturesNV; - physicalDeviceShaderIntegerFunctions2FeaturesINTEL.pNext = pNext; - pNext = &physicalDeviceShaderIntegerFunctions2FeaturesINTEL; - physicalDeviceShaderClockFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderClockFeaturesKHR; - physicalDeviceIndexTypeUint8FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceIndexTypeUint8FeaturesKHR; - physicalDeviceShaderSMBuiltinsFeaturesNV.pNext = pNext; - pNext = &physicalDeviceShaderSMBuiltinsFeaturesNV; - physicalDeviceFragmentShaderInterlockFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceFragmentShaderInterlockFeaturesEXT; - physicalDeviceSeparateDepthStencilLayoutsFeatures.pNext = pNext; - pNext = &physicalDeviceSeparateDepthStencilLayoutsFeatures; - physicalDevicePrimitiveTopologyListRestartFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePrimitiveTopologyListRestartFeaturesEXT; - physicalDevicePipelineExecutablePropertiesFeaturesKHR.pNext = pNext; - pNext = &physicalDevicePipelineExecutablePropertiesFeaturesKHR; - physicalDeviceShaderDemoteToHelperInvocationFeatures.pNext = pNext; - pNext = &physicalDeviceShaderDemoteToHelperInvocationFeatures; - physicalDeviceTexelBufferAlignmentFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceTexelBufferAlignmentFeaturesEXT; - physicalDeviceSubgroupSizeControlFeatures.pNext = pNext; - pNext = &physicalDeviceSubgroupSizeControlFeatures; - physicalDeviceLineRasterizationFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceLineRasterizationFeaturesKHR; - physicalDevicePipelineCreationCacheControlFeatures.pNext = pNext; - pNext = &physicalDevicePipelineCreationCacheControlFeatures; - physicalDeviceVulkan11Features.pNext = pNext; - pNext = &physicalDeviceVulkan11Features; - physicalDeviceVulkan12Features.pNext = pNext; - pNext = &physicalDeviceVulkan12Features; - physicalDeviceVulkan13Features.pNext = pNext; - pNext = &physicalDeviceVulkan13Features; - physicalDeviceCoherentMemoryFeaturesAMD.pNext = pNext; - pNext = &physicalDeviceCoherentMemoryFeaturesAMD; - physicalDeviceCustomBorderColorFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceCustomBorderColorFeaturesEXT; - physicalDeviceBorderColorSwizzleFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceBorderColorSwizzleFeaturesEXT; - physicalDeviceExtendedDynamicStateFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceExtendedDynamicStateFeaturesEXT; - physicalDeviceExtendedDynamicState2FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceExtendedDynamicState2FeaturesEXT; - physicalDeviceExtendedDynamicState3FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceExtendedDynamicState3FeaturesEXT; - physicalDeviceDiagnosticsConfigFeaturesNV.pNext = pNext; - pNext = &physicalDeviceDiagnosticsConfigFeaturesNV; - physicalDeviceZeroInitializeWorkgroupMemoryFeatures.pNext = pNext; - pNext = &physicalDeviceZeroInitializeWorkgroupMemoryFeatures; - physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR; - physicalDeviceRobustness2FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceRobustness2FeaturesEXT; - physicalDeviceImageRobustnessFeatures.pNext = pNext; - pNext = &physicalDeviceImageRobustnessFeatures; - physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR; + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC, size()}); + this->structureSize.insert({VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, size()}); + + // Initializing the full list of available structure features + void *pNext = nullptr; + physicalDeviceDeviceGeneratedCommandsFeaturesNV.pNext = pNext; + pNext = &physicalDeviceDeviceGeneratedCommandsFeaturesNV; + physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.pNext = pNext; + pNext = &physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV; + physicalDevicePrivateDataFeatures.pNext = pNext; + pNext = &physicalDevicePrivateDataFeatures; + physicalDeviceClusterAccelerationStructureFeaturesNV.pNext = pNext; + pNext = &physicalDeviceClusterAccelerationStructureFeaturesNV; + physicalDeviceVariablePointersFeatures.pNext = pNext; + pNext = &physicalDeviceVariablePointersFeatures; + physicalDeviceMultiviewFeatures.pNext = pNext; + pNext = &physicalDeviceMultiviewFeatures; + physicalDevicePresentIdFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePresentIdFeaturesKHR; + physicalDevicePresentId2FeaturesKHR.pNext = pNext; + pNext = &physicalDevicePresentId2FeaturesKHR; + physicalDevicePresentWaitFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePresentWaitFeaturesKHR; + physicalDevicePresentWait2FeaturesKHR.pNext = pNext; + pNext = &physicalDevicePresentWait2FeaturesKHR; + physicalDevice16BitStorageFeatures.pNext = pNext; + pNext = &physicalDevice16BitStorageFeatures; + physicalDeviceShaderSubgroupExtendedTypesFeatures.pNext = pNext; + pNext = &physicalDeviceShaderSubgroupExtendedTypesFeatures; + physicalDeviceSamplerYcbcrConversionFeatures.pNext = pNext; + pNext = &physicalDeviceSamplerYcbcrConversionFeatures; + physicalDeviceProtectedMemoryFeatures.pNext = pNext; + pNext = &physicalDeviceProtectedMemoryFeatures; + physicalDeviceBlendOperationAdvancedFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceBlendOperationAdvancedFeaturesEXT; + physicalDeviceMultiDrawFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceMultiDrawFeaturesEXT; + physicalDeviceInlineUniformBlockFeatures.pNext = pNext; + pNext = &physicalDeviceInlineUniformBlockFeatures; + physicalDeviceMaintenance4Features.pNext = pNext; + pNext = &physicalDeviceMaintenance4Features; + physicalDeviceMaintenance5Features.pNext = pNext; + pNext = &physicalDeviceMaintenance5Features; + physicalDeviceMaintenance6Features.pNext = pNext; + pNext = &physicalDeviceMaintenance6Features; + physicalDeviceMaintenance7FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceMaintenance7FeaturesKHR; + physicalDeviceMaintenance8FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceMaintenance8FeaturesKHR; + physicalDeviceMaintenance9FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceMaintenance9FeaturesKHR; + physicalDeviceShaderDrawParametersFeatures.pNext = pNext; + pNext = &physicalDeviceShaderDrawParametersFeatures; + physicalDeviceShaderFloat16Int8Features.pNext = pNext; + pNext = &physicalDeviceShaderFloat16Int8Features; + physicalDeviceHostQueryResetFeatures.pNext = pNext; + pNext = &physicalDeviceHostQueryResetFeatures; + physicalDeviceGlobalPriorityQueryFeatures.pNext = pNext; + pNext = &physicalDeviceGlobalPriorityQueryFeatures; + physicalDeviceDeviceMemoryReportFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDeviceMemoryReportFeaturesEXT; + physicalDeviceDescriptorIndexingFeatures.pNext = pNext; + pNext = &physicalDeviceDescriptorIndexingFeatures; + physicalDeviceTimelineSemaphoreFeatures.pNext = pNext; + pNext = &physicalDeviceTimelineSemaphoreFeatures; + physicalDevice8BitStorageFeatures.pNext = pNext; + pNext = &physicalDevice8BitStorageFeatures; + physicalDeviceConditionalRenderingFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceConditionalRenderingFeaturesEXT; + physicalDeviceVulkanMemoryModelFeatures.pNext = pNext; + pNext = &physicalDeviceVulkanMemoryModelFeatures; + physicalDeviceShaderAtomicInt64Features.pNext = pNext; + pNext = &physicalDeviceShaderAtomicInt64Features; + physicalDeviceShaderAtomicFloatFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderAtomicFloatFeaturesEXT; + physicalDeviceShaderAtomicFloat2FeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderAtomicFloat2FeaturesEXT; + physicalDeviceVertexAttributeDivisorFeatures.pNext = pNext; + pNext = &physicalDeviceVertexAttributeDivisorFeatures; + physicalDeviceASTCDecodeFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceASTCDecodeFeaturesEXT; + physicalDeviceTransformFeedbackFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceTransformFeedbackFeaturesEXT; + physicalDeviceRepresentativeFragmentTestFeaturesNV.pNext = pNext; + pNext = &physicalDeviceRepresentativeFragmentTestFeaturesNV; + physicalDeviceExclusiveScissorFeaturesNV.pNext = pNext; + pNext = &physicalDeviceExclusiveScissorFeaturesNV; + physicalDeviceCornerSampledImageFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCornerSampledImageFeaturesNV; + physicalDeviceComputeShaderDerivativesFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceComputeShaderDerivativesFeaturesKHR; + physicalDeviceShaderImageFootprintFeaturesNV.pNext = pNext; + pNext = &physicalDeviceShaderImageFootprintFeaturesNV; + physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.pNext = pNext; + pNext = &physicalDeviceDedicatedAllocationImageAliasingFeaturesNV; + physicalDeviceCopyMemoryIndirectFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCopyMemoryIndirectFeaturesNV; + physicalDeviceMemoryDecompressionFeaturesNV.pNext = pNext; + pNext = &physicalDeviceMemoryDecompressionFeaturesNV; + physicalDeviceShadingRateImageFeaturesNV.pNext = pNext; + pNext = &physicalDeviceShadingRateImageFeaturesNV; + physicalDeviceInvocationMaskFeaturesHUAWEI.pNext = pNext; + pNext = &physicalDeviceInvocationMaskFeaturesHUAWEI; + physicalDeviceMeshShaderFeaturesNV.pNext = pNext; + pNext = &physicalDeviceMeshShaderFeaturesNV; + physicalDeviceMeshShaderFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceMeshShaderFeaturesEXT; + physicalDeviceAccelerationStructureFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceAccelerationStructureFeaturesKHR; + physicalDeviceRayTracingPipelineFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceRayTracingPipelineFeaturesKHR; + physicalDeviceRayQueryFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceRayQueryFeaturesKHR; + physicalDeviceRayTracingMaintenance1FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceRayTracingMaintenance1FeaturesKHR; + physicalDeviceFragmentDensityMapFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceFragmentDensityMapFeaturesEXT; + physicalDeviceFragmentDensityMap2FeaturesEXT.pNext = pNext; + pNext = &physicalDeviceFragmentDensityMap2FeaturesEXT; + physicalDeviceFragmentDensityMapOffsetFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceFragmentDensityMapOffsetFeaturesEXT; + physicalDeviceScalarBlockLayoutFeatures.pNext = pNext; + pNext = &physicalDeviceScalarBlockLayoutFeatures; + physicalDeviceUniformBufferStandardLayoutFeatures.pNext = pNext; + pNext = &physicalDeviceUniformBufferStandardLayoutFeatures; + physicalDeviceDepthClipEnableFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDepthClipEnableFeaturesEXT; + physicalDeviceMemoryPriorityFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceMemoryPriorityFeaturesEXT; + physicalDevicePageableDeviceLocalMemoryFeaturesEXT.pNext = pNext; + pNext = &physicalDevicePageableDeviceLocalMemoryFeaturesEXT; + physicalDeviceBufferDeviceAddressFeatures.pNext = pNext; + pNext = &physicalDeviceBufferDeviceAddressFeatures; + physicalDeviceBufferDeviceAddressFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceBufferDeviceAddressFeaturesEXT; + physicalDeviceImagelessFramebufferFeatures.pNext = pNext; + pNext = &physicalDeviceImagelessFramebufferFeatures; + physicalDeviceTextureCompressionASTCHDRFeatures.pNext = pNext; + pNext = &physicalDeviceTextureCompressionASTCHDRFeatures; + physicalDeviceCooperativeMatrixFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCooperativeMatrixFeaturesNV; + physicalDeviceYcbcrImageArraysFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceYcbcrImageArraysFeaturesEXT; + physicalDevicePresentBarrierFeaturesNV.pNext = pNext; + pNext = &physicalDevicePresentBarrierFeaturesNV; + physicalDevicePerformanceQueryFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePerformanceQueryFeaturesKHR; + physicalDeviceCoverageReductionModeFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCoverageReductionModeFeaturesNV; + physicalDeviceShaderIntegerFunctions2FeaturesINTEL.pNext = pNext; + pNext = &physicalDeviceShaderIntegerFunctions2FeaturesINTEL; + physicalDeviceShaderClockFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceShaderClockFeaturesKHR; + physicalDeviceIndexTypeUint8Features.pNext = pNext; + pNext = &physicalDeviceIndexTypeUint8Features; + physicalDeviceShaderSMBuiltinsFeaturesNV.pNext = pNext; + pNext = &physicalDeviceShaderSMBuiltinsFeaturesNV; + physicalDeviceFragmentShaderInterlockFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceFragmentShaderInterlockFeaturesEXT; + physicalDeviceSeparateDepthStencilLayoutsFeatures.pNext = pNext; + pNext = &physicalDeviceSeparateDepthStencilLayoutsFeatures; + physicalDevicePrimitiveTopologyListRestartFeaturesEXT.pNext = pNext; + pNext = &physicalDevicePrimitiveTopologyListRestartFeaturesEXT; + physicalDevicePipelineExecutablePropertiesFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePipelineExecutablePropertiesFeaturesKHR; + physicalDeviceShaderDemoteToHelperInvocationFeatures.pNext = pNext; + pNext = &physicalDeviceShaderDemoteToHelperInvocationFeatures; + physicalDeviceTexelBufferAlignmentFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceTexelBufferAlignmentFeaturesEXT; + physicalDeviceSubgroupSizeControlFeatures.pNext = pNext; + pNext = &physicalDeviceSubgroupSizeControlFeatures; + physicalDeviceLineRasterizationFeatures.pNext = pNext; + pNext = &physicalDeviceLineRasterizationFeatures; + physicalDevicePipelineCreationCacheControlFeatures.pNext = pNext; + pNext = &physicalDevicePipelineCreationCacheControlFeatures; + physicalDeviceVulkan11Features.pNext = pNext; + pNext = &physicalDeviceVulkan11Features; + physicalDeviceVulkan12Features.pNext = pNext; + pNext = &physicalDeviceVulkan12Features; + physicalDeviceVulkan13Features.pNext = pNext; + pNext = &physicalDeviceVulkan13Features; + physicalDeviceVulkan14Features.pNext = pNext; + pNext = &physicalDeviceVulkan14Features; + physicalDeviceCoherentMemoryFeaturesAMD.pNext = pNext; + pNext = &physicalDeviceCoherentMemoryFeaturesAMD; + physicalDeviceCustomBorderColorFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceCustomBorderColorFeaturesEXT; + physicalDeviceBorderColorSwizzleFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceBorderColorSwizzleFeaturesEXT; + physicalDeviceExtendedDynamicStateFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceExtendedDynamicStateFeaturesEXT; + physicalDeviceExtendedDynamicState2FeaturesEXT.pNext = pNext; + pNext = &physicalDeviceExtendedDynamicState2FeaturesEXT; + physicalDeviceExtendedDynamicState3FeaturesEXT.pNext = pNext; + pNext = &physicalDeviceExtendedDynamicState3FeaturesEXT; + physicalDevicePartitionedAccelerationStructureFeaturesNV.pNext = pNext; + pNext = &physicalDevicePartitionedAccelerationStructureFeaturesNV; + physicalDeviceDiagnosticsConfigFeaturesNV.pNext = pNext; + pNext = &physicalDeviceDiagnosticsConfigFeaturesNV; + physicalDeviceZeroInitializeWorkgroupMemoryFeatures.pNext = pNext; + pNext = &physicalDeviceZeroInitializeWorkgroupMemoryFeatures; + physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR; + physicalDeviceRobustness2FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceRobustness2FeaturesKHR; + physicalDeviceImageRobustnessFeatures.pNext = pNext; + pNext = &physicalDeviceImageRobustnessFeatures; + physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR; #ifdef VK_ENABLE_BETA_EXTENSIONS - physicalDevicePortabilitySubsetFeaturesKHR.pNext = pNext; - pNext = &physicalDevicePortabilitySubsetFeaturesKHR; + physicalDevicePortabilitySubsetFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePortabilitySubsetFeaturesKHR; #endif - physicalDevice4444FormatsFeaturesEXT.pNext = pNext; - pNext = &physicalDevice4444FormatsFeaturesEXT; - physicalDeviceSubpassShadingFeaturesHUAWEI.pNext = pNext; - pNext = &physicalDeviceSubpassShadingFeaturesHUAWEI; - physicalDeviceClusterCullingShaderFeaturesHUAWEI.pNext = pNext; - pNext = &physicalDeviceClusterCullingShaderFeaturesHUAWEI; - physicalDeviceShaderImageAtomicInt64FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderImageAtomicInt64FeaturesEXT; - physicalDeviceFragmentShadingRateFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceFragmentShadingRateFeaturesKHR; - physicalDeviceShaderTerminateInvocationFeatures.pNext = pNext; - pNext = &physicalDeviceShaderTerminateInvocationFeatures; - physicalDeviceFragmentShadingRateEnumsFeaturesNV.pNext = pNext; - pNext = &physicalDeviceFragmentShadingRateEnumsFeaturesNV; - physicalDeviceImage2DViewOf3DFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceImage2DViewOf3DFeaturesEXT; - physicalDeviceImageSlicedViewOf3DFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceImageSlicedViewOf3DFeaturesEXT; - physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT; - physicalDeviceLegacyVertexAttributesFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceLegacyVertexAttributesFeaturesEXT; - physicalDeviceMutableDescriptorTypeFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceMutableDescriptorTypeFeaturesEXT; - physicalDeviceDepthClipControlFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDepthClipControlFeaturesEXT; - physicalDeviceDeviceGeneratedCommandsFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDeviceGeneratedCommandsFeaturesEXT; - physicalDeviceDepthClampControlFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDepthClampControlFeaturesEXT; - physicalDeviceVertexInputDynamicStateFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceVertexInputDynamicStateFeaturesEXT; - physicalDeviceExternalMemoryRDMAFeaturesNV.pNext = pNext; - pNext = &physicalDeviceExternalMemoryRDMAFeaturesNV; - physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR; - physicalDeviceColorWriteEnableFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceColorWriteEnableFeaturesEXT; - physicalDeviceSynchronization2Features.pNext = pNext; - pNext = &physicalDeviceSynchronization2Features; - physicalDeviceHostImageCopyFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceHostImageCopyFeaturesEXT; - physicalDevicePrimitivesGeneratedQueryFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePrimitivesGeneratedQueryFeaturesEXT; - physicalDeviceLegacyDitheringFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceLegacyDitheringFeaturesEXT; - physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT; - physicalDevicePipelineProtectedAccessFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePipelineProtectedAccessFeaturesEXT; - physicalDeviceVideoMaintenance1FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceVideoMaintenance1FeaturesKHR; - physicalDeviceInheritedViewportScissorFeaturesNV.pNext = pNext; - pNext = &physicalDeviceInheritedViewportScissorFeaturesNV; - physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceYcbcr2Plane444FormatsFeaturesEXT; - physicalDeviceProvokingVertexFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceProvokingVertexFeaturesEXT; - physicalDeviceDescriptorBufferFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDescriptorBufferFeaturesEXT; - physicalDeviceShaderIntegerDotProductFeatures.pNext = pNext; - pNext = &physicalDeviceShaderIntegerDotProductFeatures; - physicalDeviceFragmentShaderBarycentricFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceFragmentShaderBarycentricFeaturesKHR; - physicalDeviceRayTracingMotionBlurFeaturesNV.pNext = pNext; - pNext = &physicalDeviceRayTracingMotionBlurFeaturesNV; - physicalDeviceRayTracingValidationFeaturesNV.pNext = pNext; - pNext = &physicalDeviceRayTracingValidationFeaturesNV; - physicalDeviceRGBA10X6FormatsFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceRGBA10X6FormatsFeaturesEXT; - physicalDeviceDynamicRenderingFeatures.pNext = pNext; - pNext = &physicalDeviceDynamicRenderingFeatures; - physicalDeviceImageViewMinLodFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceImageViewMinLodFeaturesEXT; - physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT; - physicalDeviceLinearColorAttachmentFeaturesNV.pNext = pNext; - pNext = &physicalDeviceLinearColorAttachmentFeaturesNV; - physicalDeviceGraphicsPipelineLibraryFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceGraphicsPipelineLibraryFeaturesEXT; - physicalDevicePipelineBinaryFeaturesKHR.pNext = pNext; - pNext = &physicalDevicePipelineBinaryFeaturesKHR; - physicalDeviceDescriptorSetHostMappingFeaturesVALVE.pNext = pNext; - pNext = &physicalDeviceDescriptorSetHostMappingFeaturesVALVE; - physicalDeviceNestedCommandBufferFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceNestedCommandBufferFeaturesEXT; - physicalDeviceShaderModuleIdentifierFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderModuleIdentifierFeaturesEXT; - physicalDeviceImageCompressionControlFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceImageCompressionControlFeaturesEXT; - physicalDeviceImageCompressionControlSwapchainFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceImageCompressionControlSwapchainFeaturesEXT; - physicalDeviceSubpassMergeFeedbackFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceSubpassMergeFeedbackFeaturesEXT; - physicalDeviceOpacityMicromapFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceOpacityMicromapFeaturesEXT; + physicalDevice4444FormatsFeaturesEXT.pNext = pNext; + pNext = &physicalDevice4444FormatsFeaturesEXT; + physicalDeviceSubpassShadingFeaturesHUAWEI.pNext = pNext; + pNext = &physicalDeviceSubpassShadingFeaturesHUAWEI; + physicalDeviceClusterCullingShaderFeaturesHUAWEI.pNext = pNext; + pNext = &physicalDeviceClusterCullingShaderFeaturesHUAWEI; + physicalDeviceShaderImageAtomicInt64FeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderImageAtomicInt64FeaturesEXT; + physicalDeviceFragmentShadingRateFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceFragmentShadingRateFeaturesKHR; + physicalDeviceShaderTerminateInvocationFeatures.pNext = pNext; + pNext = &physicalDeviceShaderTerminateInvocationFeatures; + physicalDeviceFragmentShadingRateEnumsFeaturesNV.pNext = pNext; + pNext = &physicalDeviceFragmentShadingRateEnumsFeaturesNV; + physicalDeviceImage2DViewOf3DFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceImage2DViewOf3DFeaturesEXT; + physicalDeviceImageSlicedViewOf3DFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceImageSlicedViewOf3DFeaturesEXT; + physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT; + physicalDeviceLegacyVertexAttributesFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceLegacyVertexAttributesFeaturesEXT; + physicalDeviceMutableDescriptorTypeFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceMutableDescriptorTypeFeaturesEXT; + physicalDeviceDepthClipControlFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDepthClipControlFeaturesEXT; + physicalDeviceZeroInitializeDeviceMemoryFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceZeroInitializeDeviceMemoryFeaturesEXT; + physicalDeviceDeviceGeneratedCommandsFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDeviceGeneratedCommandsFeaturesEXT; + physicalDeviceDepthClampControlFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDepthClampControlFeaturesEXT; + physicalDeviceVertexInputDynamicStateFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceVertexInputDynamicStateFeaturesEXT; + physicalDeviceExternalMemoryRDMAFeaturesNV.pNext = pNext; + pNext = &physicalDeviceExternalMemoryRDMAFeaturesNV; + physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR; + physicalDeviceColorWriteEnableFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceColorWriteEnableFeaturesEXT; + physicalDeviceSynchronization2Features.pNext = pNext; + pNext = &physicalDeviceSynchronization2Features; + physicalDeviceUnifiedImageLayoutsFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceUnifiedImageLayoutsFeaturesKHR; + physicalDeviceHostImageCopyFeatures.pNext = pNext; + pNext = &physicalDeviceHostImageCopyFeatures; + physicalDevicePrimitivesGeneratedQueryFeaturesEXT.pNext = pNext; + pNext = &physicalDevicePrimitivesGeneratedQueryFeaturesEXT; + physicalDeviceLegacyDitheringFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceLegacyDitheringFeaturesEXT; + physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT; + physicalDevicePipelineProtectedAccessFeatures.pNext = pNext; + pNext = &physicalDevicePipelineProtectedAccessFeatures; + physicalDeviceVideoMaintenance1FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceVideoMaintenance1FeaturesKHR; + physicalDeviceVideoMaintenance2FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceVideoMaintenance2FeaturesKHR; + physicalDeviceVideoDecodeVP9FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceVideoDecodeVP9FeaturesKHR; + physicalDeviceVideoEncodeQuantizationMapFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceVideoEncodeQuantizationMapFeaturesKHR; + physicalDeviceVideoEncodeAV1FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceVideoEncodeAV1FeaturesKHR; + physicalDeviceInheritedViewportScissorFeaturesNV.pNext = pNext; + pNext = &physicalDeviceInheritedViewportScissorFeaturesNV; + physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceYcbcr2Plane444FormatsFeaturesEXT; + physicalDeviceProvokingVertexFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceProvokingVertexFeaturesEXT; + physicalDeviceVideoEncodeIntraRefreshFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceVideoEncodeIntraRefreshFeaturesKHR; + physicalDeviceDescriptorBufferFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDescriptorBufferFeaturesEXT; + physicalDeviceShaderIntegerDotProductFeatures.pNext = pNext; + pNext = &physicalDeviceShaderIntegerDotProductFeatures; + physicalDeviceFragmentShaderBarycentricFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceFragmentShaderBarycentricFeaturesKHR; + physicalDeviceRayTracingMotionBlurFeaturesNV.pNext = pNext; + pNext = &physicalDeviceRayTracingMotionBlurFeaturesNV; + physicalDeviceRayTracingValidationFeaturesNV.pNext = pNext; + pNext = &physicalDeviceRayTracingValidationFeaturesNV; + physicalDeviceRayTracingLinearSweptSpheresFeaturesNV.pNext = pNext; + pNext = &physicalDeviceRayTracingLinearSweptSpheresFeaturesNV; + physicalDeviceRGBA10X6FormatsFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceRGBA10X6FormatsFeaturesEXT; + physicalDeviceDynamicRenderingFeatures.pNext = pNext; + pNext = &physicalDeviceDynamicRenderingFeatures; + physicalDeviceImageViewMinLodFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceImageViewMinLodFeaturesEXT; + physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT; + physicalDeviceLinearColorAttachmentFeaturesNV.pNext = pNext; + pNext = &physicalDeviceLinearColorAttachmentFeaturesNV; + physicalDeviceGraphicsPipelineLibraryFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceGraphicsPipelineLibraryFeaturesEXT; + physicalDevicePipelineBinaryFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePipelineBinaryFeaturesKHR; + physicalDeviceDescriptorSetHostMappingFeaturesVALVE.pNext = pNext; + pNext = &physicalDeviceDescriptorSetHostMappingFeaturesVALVE; + physicalDeviceNestedCommandBufferFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceNestedCommandBufferFeaturesEXT; + physicalDeviceShaderModuleIdentifierFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderModuleIdentifierFeaturesEXT; + physicalDeviceImageCompressionControlFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceImageCompressionControlFeaturesEXT; + physicalDeviceImageCompressionControlSwapchainFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceImageCompressionControlSwapchainFeaturesEXT; + physicalDeviceSubpassMergeFeedbackFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceSubpassMergeFeedbackFeaturesEXT; + physicalDeviceOpacityMicromapFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceOpacityMicromapFeaturesEXT; #ifdef VK_ENABLE_BETA_EXTENSIONS - physicalDeviceDisplacementMicromapFeaturesNV.pNext = pNext; - pNext = &physicalDeviceDisplacementMicromapFeaturesNV; + physicalDeviceDisplacementMicromapFeaturesNV.pNext = pNext; + pNext = &physicalDeviceDisplacementMicromapFeaturesNV; #endif - physicalDevicePipelinePropertiesFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePipelinePropertiesFeaturesEXT; - physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD.pNext = pNext; - pNext = &physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD; - physicalDeviceNonSeamlessCubeMapFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceNonSeamlessCubeMapFeaturesEXT; - physicalDevicePipelineRobustnessFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePipelineRobustnessFeaturesEXT; - physicalDeviceImageProcessingFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceImageProcessingFeaturesQCOM; - physicalDeviceTilePropertiesFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceTilePropertiesFeaturesQCOM; - physicalDeviceAmigoProfilingFeaturesSEC.pNext = pNext; - pNext = &physicalDeviceAmigoProfilingFeaturesSEC; - physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT; - physicalDeviceDepthClampZeroOneFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDepthClampZeroOneFeaturesEXT; - physicalDeviceAddressBindingReportFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceAddressBindingReportFeaturesEXT; - physicalDeviceOpticalFlowFeaturesNV.pNext = pNext; - pNext = &physicalDeviceOpticalFlowFeaturesNV; - physicalDeviceFaultFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceFaultFeaturesEXT; - physicalDevicePipelineLibraryGroupHandlesFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePipelineLibraryGroupHandlesFeaturesEXT; - physicalDeviceShaderCoreBuiltinsFeaturesARM.pNext = pNext; - pNext = &physicalDeviceShaderCoreBuiltinsFeaturesARM; - physicalDeviceFrameBoundaryFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceFrameBoundaryFeaturesEXT; - physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT; - physicalDeviceSwapchainMaintenance1FeaturesEXT.pNext = pNext; - pNext = &physicalDeviceSwapchainMaintenance1FeaturesEXT; - physicalDeviceDepthBiasControlFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceDepthBiasControlFeaturesEXT; - physicalDeviceRayTracingInvocationReorderFeaturesNV.pNext = pNext; - pNext = &physicalDeviceRayTracingInvocationReorderFeaturesNV; - physicalDeviceExtendedSparseAddressSpaceFeaturesNV.pNext = pNext; - pNext = &physicalDeviceExtendedSparseAddressSpaceFeaturesNV; - physicalDeviceMultiviewPerViewViewportsFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceMultiviewPerViewViewportsFeaturesQCOM; - physicalDeviceRayTracingPositionFetchFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceRayTracingPositionFetchFeaturesKHR; - physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM; - physicalDeviceShaderObjectFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderObjectFeaturesEXT; - physicalDeviceShaderTileImageFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderTileImageFeaturesEXT; + physicalDevicePipelinePropertiesFeaturesEXT.pNext = pNext; + pNext = &physicalDevicePipelinePropertiesFeaturesEXT; + physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD.pNext = pNext; + pNext = &physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD; + physicalDeviceNonSeamlessCubeMapFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceNonSeamlessCubeMapFeaturesEXT; + physicalDevicePipelineRobustnessFeatures.pNext = pNext; + pNext = &physicalDevicePipelineRobustnessFeatures; + physicalDeviceImageProcessingFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceImageProcessingFeaturesQCOM; + physicalDeviceTilePropertiesFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceTilePropertiesFeaturesQCOM; + physicalDeviceAmigoProfilingFeaturesSEC.pNext = pNext; + pNext = &physicalDeviceAmigoProfilingFeaturesSEC; + physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT; + physicalDeviceAddressBindingReportFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceAddressBindingReportFeaturesEXT; + physicalDeviceOpticalFlowFeaturesNV.pNext = pNext; + pNext = &physicalDeviceOpticalFlowFeaturesNV; + physicalDeviceFaultFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceFaultFeaturesEXT; + physicalDevicePipelineLibraryGroupHandlesFeaturesEXT.pNext = pNext; + pNext = &physicalDevicePipelineLibraryGroupHandlesFeaturesEXT; + physicalDeviceShaderCoreBuiltinsFeaturesARM.pNext = pNext; + pNext = &physicalDeviceShaderCoreBuiltinsFeaturesARM; + physicalDeviceFrameBoundaryFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceFrameBoundaryFeaturesEXT; + physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT; + physicalDeviceSwapchainMaintenance1FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceSwapchainMaintenance1FeaturesKHR; + physicalDeviceDepthBiasControlFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceDepthBiasControlFeaturesEXT; + physicalDeviceRayTracingInvocationReorderFeaturesNV.pNext = pNext; + pNext = &physicalDeviceRayTracingInvocationReorderFeaturesNV; + physicalDeviceExtendedSparseAddressSpaceFeaturesNV.pNext = pNext; + pNext = &physicalDeviceExtendedSparseAddressSpaceFeaturesNV; + physicalDeviceMultiviewPerViewViewportsFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceMultiviewPerViewViewportsFeaturesQCOM; + physicalDeviceRayTracingPositionFetchFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceRayTracingPositionFetchFeaturesKHR; + physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM; + physicalDeviceShaderObjectFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderObjectFeaturesEXT; + physicalDeviceShaderTileImageFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderTileImageFeaturesEXT; #ifdef VK_USE_PLATFORM_SCREEN_QNX - physicalDeviceExternalMemoryScreenBufferFeaturesQNX.pNext = pNext; - pNext = &physicalDeviceExternalMemoryScreenBufferFeaturesQNX; + physicalDeviceExternalMemoryScreenBufferFeaturesQNX.pNext = pNext; + pNext = &physicalDeviceExternalMemoryScreenBufferFeaturesQNX; #endif - physicalDeviceCooperativeMatrixFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceCooperativeMatrixFeaturesKHR; + physicalDeviceCooperativeMatrixFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceCooperativeMatrixFeaturesKHR; #ifdef VK_ENABLE_BETA_EXTENSIONS - physicalDeviceShaderEnqueueFeaturesAMDX.pNext = pNext; - pNext = &physicalDeviceShaderEnqueueFeaturesAMDX; + physicalDeviceShaderEnqueueFeaturesAMDX.pNext = pNext; + pNext = &physicalDeviceShaderEnqueueFeaturesAMDX; #endif - physicalDeviceAntiLagFeaturesAMD.pNext = pNext; - pNext = &physicalDeviceAntiLagFeaturesAMD; - physicalDeviceCubicClampFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceCubicClampFeaturesQCOM; - physicalDeviceYcbcrDegammaFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceYcbcrDegammaFeaturesQCOM; - physicalDeviceCubicWeightsFeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceCubicWeightsFeaturesQCOM; - physicalDeviceImageProcessing2FeaturesQCOM.pNext = pNext; - pNext = &physicalDeviceImageProcessing2FeaturesQCOM; - physicalDeviceDescriptorPoolOverallocationFeaturesNV.pNext = pNext; - pNext = &physicalDeviceDescriptorPoolOverallocationFeaturesNV; - physicalDevicePerStageDescriptorSetFeaturesNV.pNext = pNext; - pNext = &physicalDevicePerStageDescriptorSetFeaturesNV; + physicalDeviceAntiLagFeaturesAMD.pNext = pNext; + pNext = &physicalDeviceAntiLagFeaturesAMD; + physicalDeviceTileMemoryHeapFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceTileMemoryHeapFeaturesQCOM; + physicalDeviceCubicClampFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceCubicClampFeaturesQCOM; + physicalDeviceYcbcrDegammaFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceYcbcrDegammaFeaturesQCOM; + physicalDeviceCubicWeightsFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceCubicWeightsFeaturesQCOM; + physicalDeviceImageProcessing2FeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceImageProcessing2FeaturesQCOM; + physicalDeviceDescriptorPoolOverallocationFeaturesNV.pNext = pNext; + pNext = &physicalDeviceDescriptorPoolOverallocationFeaturesNV; + physicalDevicePerStageDescriptorSetFeaturesNV.pNext = pNext; + pNext = &physicalDevicePerStageDescriptorSetFeaturesNV; #ifdef VK_USE_PLATFORM_ANDROID_KHR - physicalDeviceExternalFormatResolveFeaturesANDROID.pNext = pNext; - pNext = &physicalDeviceExternalFormatResolveFeaturesANDROID; + physicalDeviceExternalFormatResolveFeaturesANDROID.pNext = pNext; + pNext = &physicalDeviceExternalFormatResolveFeaturesANDROID; +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + physicalDeviceCudaKernelLaunchFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCudaKernelLaunchFeaturesNV; +#endif + physicalDeviceSchedulingControlsFeaturesARM.pNext = pNext; + pNext = &physicalDeviceSchedulingControlsFeaturesARM; + physicalDeviceRelaxedLineRasterizationFeaturesIMG.pNext = pNext; + pNext = &physicalDeviceRelaxedLineRasterizationFeaturesIMG; + physicalDeviceRenderPassStripedFeaturesARM.pNext = pNext; + pNext = &physicalDeviceRenderPassStripedFeaturesARM; + physicalDevicePipelineOpacityMicromapFeaturesARM.pNext = pNext; + pNext = &physicalDevicePipelineOpacityMicromapFeaturesARM; + physicalDeviceShaderMaximalReconvergenceFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceShaderMaximalReconvergenceFeaturesKHR; + physicalDeviceShaderSubgroupRotateFeatures.pNext = pNext; + pNext = &physicalDeviceShaderSubgroupRotateFeatures; + physicalDeviceShaderExpectAssumeFeatures.pNext = pNext; + pNext = &physicalDeviceShaderExpectAssumeFeatures; + physicalDeviceShaderFloatControls2Features.pNext = pNext; + pNext = &physicalDeviceShaderFloatControls2Features; + physicalDeviceDynamicRenderingLocalReadFeatures.pNext = pNext; + pNext = &physicalDeviceDynamicRenderingLocalReadFeatures; + physicalDeviceShaderQuadControlFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceShaderQuadControlFeaturesKHR; + physicalDeviceShaderAtomicFloat16VectorFeaturesNV.pNext = pNext; + pNext = &physicalDeviceShaderAtomicFloat16VectorFeaturesNV; + physicalDeviceMapMemoryPlacedFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceMapMemoryPlacedFeaturesEXT; + physicalDeviceShaderBfloat16FeaturesKHR.pNext = pNext; + pNext = &physicalDeviceShaderBfloat16FeaturesKHR; + physicalDeviceRawAccessChainsFeaturesNV.pNext = pNext; + pNext = &physicalDeviceRawAccessChainsFeaturesNV; + physicalDeviceCommandBufferInheritanceFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCommandBufferInheritanceFeaturesNV; + physicalDeviceImageAlignmentControlFeaturesMESA.pNext = pNext; + pNext = &physicalDeviceImageAlignmentControlFeaturesMESA; + physicalDeviceShaderReplicatedCompositesFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderReplicatedCompositesFeaturesEXT; + physicalDevicePresentModeFifoLatestReadyFeaturesKHR.pNext = pNext; + pNext = &physicalDevicePresentModeFifoLatestReadyFeaturesKHR; + physicalDeviceCooperativeMatrix2FeaturesNV.pNext = pNext; + pNext = &physicalDeviceCooperativeMatrix2FeaturesNV; + physicalDeviceHdrVividFeaturesHUAWEI.pNext = pNext; + pNext = &physicalDeviceHdrVividFeaturesHUAWEI; + physicalDeviceVertexAttributeRobustnessFeaturesEXT.pNext = pNext; + pNext = &physicalDeviceVertexAttributeRobustnessFeaturesEXT; + physicalDeviceDepthClampZeroOneFeaturesKHR.pNext = pNext; + pNext = &physicalDeviceDepthClampZeroOneFeaturesKHR; + physicalDeviceCooperativeVectorFeaturesNV.pNext = pNext; + pNext = &physicalDeviceCooperativeVectorFeaturesNV; + physicalDeviceTileShadingFeaturesQCOM.pNext = pNext; + pNext = &physicalDeviceTileShadingFeaturesQCOM; + physicalDeviceFragmentDensityMapLayeredFeaturesVALVE.pNext = pNext; + pNext = &physicalDeviceFragmentDensityMapLayeredFeaturesVALVE; +#ifdef VK_ENABLE_BETA_EXTENSIONS + physicalDevicePresentMeteringFeaturesNV.pNext = pNext; + pNext = &physicalDevicePresentMeteringFeaturesNV; #endif - physicalDeviceCudaKernelLaunchFeaturesNV.pNext = pNext; - pNext = &physicalDeviceCudaKernelLaunchFeaturesNV; - physicalDeviceSchedulingControlsFeaturesARM.pNext = pNext; - pNext = &physicalDeviceSchedulingControlsFeaturesARM; - physicalDeviceRelaxedLineRasterizationFeaturesIMG.pNext = pNext; - pNext = &physicalDeviceRelaxedLineRasterizationFeaturesIMG; - physicalDeviceRenderPassStripedFeaturesARM.pNext = pNext; - pNext = &physicalDeviceRenderPassStripedFeaturesARM; - physicalDeviceShaderMaximalReconvergenceFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderMaximalReconvergenceFeaturesKHR; - physicalDeviceShaderSubgroupRotateFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderSubgroupRotateFeaturesKHR; - physicalDeviceShaderExpectAssumeFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderExpectAssumeFeaturesKHR; - physicalDeviceShaderFloatControls2FeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderFloatControls2FeaturesKHR; - physicalDeviceDynamicRenderingLocalReadFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceDynamicRenderingLocalReadFeaturesKHR; - physicalDeviceShaderQuadControlFeaturesKHR.pNext = pNext; - pNext = &physicalDeviceShaderQuadControlFeaturesKHR; - physicalDeviceShaderAtomicFloat16VectorFeaturesNV.pNext = pNext; - pNext = &physicalDeviceShaderAtomicFloat16VectorFeaturesNV; - physicalDeviceMapMemoryPlacedFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceMapMemoryPlacedFeaturesEXT; - physicalDeviceRawAccessChainsFeaturesNV.pNext = pNext; - pNext = &physicalDeviceRawAccessChainsFeaturesNV; - physicalDeviceCommandBufferInheritanceFeaturesNV.pNext = pNext; - pNext = &physicalDeviceCommandBufferInheritanceFeaturesNV; - physicalDeviceImageAlignmentControlFeaturesMESA.pNext = pNext; - pNext = &physicalDeviceImageAlignmentControlFeaturesMESA; - physicalDeviceShaderReplicatedCompositesFeaturesEXT.pNext = pNext; - pNext = &physicalDeviceShaderReplicatedCompositesFeaturesEXT; - physicalDevicePresentModeFifoLatestReadyFeaturesEXT.pNext = pNext; - pNext = &physicalDevicePresentModeFifoLatestReadyFeaturesEXT; - physicalDeviceFeatures2KHR.pNext = pNext; - - } - - - VkPhysicalDeviceFeatures2KHR requiredFeaturesChain{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, nullptr}; - VkBaseOutStructure* current = nullptr; - - void ApplyRobustness(const VpDeviceCreateInfo* pCreateInfo) { + physicalDeviceFormatPackFeaturesARM.pNext = pNext; + pNext = &physicalDeviceFormatPackFeaturesARM; + physicalDeviceTensorFeaturesARM.pNext = pNext; + pNext = &physicalDeviceTensorFeaturesARM; + physicalDeviceDescriptorBufferTensorFeaturesARM.pNext = pNext; + pNext = &physicalDeviceDescriptorBufferTensorFeaturesARM; + physicalDeviceShaderFloat8FeaturesEXT.pNext = pNext; + pNext = &physicalDeviceShaderFloat8FeaturesEXT; + physicalDeviceDataGraphFeaturesARM.pNext = pNext; + pNext = &physicalDeviceDataGraphFeaturesARM; + physicalDevicePipelineCacheIncrementalModeFeaturesSEC.pNext = pNext; + pNext = &physicalDevicePipelineCacheIncrementalModeFeaturesSEC; + physicalDeviceFeatures2KHR.pNext = pNext; + } + + VkPhysicalDeviceFeatures2KHR requiredFeaturesChain{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR, nullptr}; + VkBaseOutStructure *current = nullptr; + + void ApplyRobustness(const VpDeviceCreateInfo *pCreateInfo) + { #ifdef VK_VERSION_1_1 - VkPhysicalDeviceFeatures2KHR* pFeatures2 = static_cast( - vpGetStructure(&this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR)); - if (pFeatures2 != nullptr && (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT)) { - pFeatures2->features.robustBufferAccess = VK_FALSE; - } + VkPhysicalDeviceFeatures2KHR *pFeatures2 = static_cast( + vpGetStructure(&this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR)); + if (pFeatures2 != nullptr && (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT)) + { + pFeatures2->features.robustBufferAccess = VK_FALSE; + } #endif #ifdef VK_EXT_robustness2 - VkPhysicalDeviceRobustness2FeaturesEXT* pRobustness2FeaturesEXT = static_cast( - vpGetStructure(&this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT)); - if (pRobustness2FeaturesEXT != nullptr) { - if (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT) { - pRobustness2FeaturesEXT->robustBufferAccess2 = VK_FALSE; - } - if (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT) { - pRobustness2FeaturesEXT->robustImageAccess2 = VK_FALSE; - } - } + VkPhysicalDeviceRobustness2FeaturesEXT *pRobustness2FeaturesEXT = static_cast( + vpGetStructure(&this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT)); + if (pRobustness2FeaturesEXT != nullptr) + { + if (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT) + { + pRobustness2FeaturesEXT->robustBufferAccess2 = VK_FALSE; + } + if (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT) + { + pRobustness2FeaturesEXT->robustImageAccess2 = VK_FALSE; + } + } #endif #ifdef VK_EXT_image_robustness - VkPhysicalDeviceImageRobustnessFeaturesEXT* pImageRobustnessFeaturesEXT = - static_cast(vpGetStructure( - &this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT)); - if (pImageRobustnessFeaturesEXT != nullptr && (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT)) { - pImageRobustnessFeaturesEXT->robustImageAccess = VK_FALSE; - } + VkPhysicalDeviceImageRobustnessFeaturesEXT *pImageRobustnessFeaturesEXT = + static_cast(vpGetStructure( + &this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT)); + if (pImageRobustnessFeaturesEXT != nullptr && (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT)) + { + pImageRobustnessFeaturesEXT->robustImageAccess = VK_FALSE; + } #endif #ifdef VK_VERSION_1_3 - VkPhysicalDeviceVulkan13Features* pVulkan13Features = static_cast( - vpGetStructure(&this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES)); - if (pVulkan13Features != nullptr && (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT)) { - pVulkan13Features->robustImageAccess = VK_FALSE; - } + VkPhysicalDeviceVulkan13Features *pVulkan13Features = static_cast( + vpGetStructure(&this->requiredFeaturesChain, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES)); + if (pVulkan13Features != nullptr && (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_IMAGE_ACCESS_BIT)) + { + pVulkan13Features->robustImageAccess = VK_FALSE; + } #endif - } - - void ApplyFeatures(const VpDeviceCreateInfo* pCreateInfo) { - const std::size_t offset = sizeof(VkBaseOutStructure); - const VkBaseOutStructure* q = reinterpret_cast(pCreateInfo->pCreateInfo->pNext); - while (q) { - const std::size_t count = this->structureSize[q->sType]; - for (std::size_t index = 0; index < count; ++index) { - const VkBaseOutStructure* pInputStruct = reinterpret_cast(q); - VkBaseOutStructure* pOutputStruct = reinterpret_cast(detail::vpGetStructure(&this->requiredFeaturesChain, q->sType)); - const uint8_t* pInputData = reinterpret_cast(pInputStruct) + offset; - uint8_t* pOutputData = reinterpret_cast(pOutputStruct) + offset; - const VkBool32* input = reinterpret_cast(pInputData); - VkBool32* output = reinterpret_cast(pOutputData); - - output[index] = (output[index] == VK_TRUE || input[index] == VK_TRUE) ? VK_TRUE : VK_FALSE; - } - q = q->pNext; - } - - this->ApplyRobustness(pCreateInfo); - } - - void PushBack(VkBaseOutStructure* found) { - VkBaseOutStructure* last = reinterpret_cast(&requiredFeaturesChain); - while (last->pNext != nullptr) { - last = last->pNext; - } - last->pNext = found; - } - - void Build(const std::vector& requiredList) { - for (std::size_t i = 0, n = requiredList.size(); i < n; ++i) { - const VkStructureType sType = requiredList[i]; - if (sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR) { - continue; - } - - VkBaseOutStructure* found = vpExtractStructure(&physicalDeviceFeatures2KHR, sType); - if (found == nullptr) { - continue; - } - - PushBack(found); - } - } -}; // struct FeaturesChain - -VPAPI_ATTR const VpProfileDesc* vpGetProfileDesc(const char profileName[VP_MAX_PROFILE_NAME_SIZE]) { - for (uint32_t profileIndex = 0; profileIndex < profileCount; ++profileIndex) { - if (strncmp(profiles[profileIndex].props.profileName, profileName, VP_MAX_PROFILE_NAME_SIZE) == 0) { - return &profiles[profileIndex]; - } - } - return nullptr; + } + + void ApplyFeatures(const VpDeviceCreateInfo *pCreateInfo) + { + const std::size_t offset = sizeof(VkBaseOutStructure); + const VkBaseOutStructure *q = reinterpret_cast(pCreateInfo->pCreateInfo->pNext); + while (q) + { + const std::size_t count = this->structureSize[q->sType]; + for (std::size_t index = 0; index < count; ++index) + { + const VkBaseOutStructure *pInputStruct = reinterpret_cast(q); + VkBaseOutStructure *pOutputStruct = reinterpret_cast(detail::vpGetStructure(&this->requiredFeaturesChain, q->sType)); + const uint8_t *pInputData = reinterpret_cast(pInputStruct) + offset; + uint8_t *pOutputData = reinterpret_cast(pOutputStruct) + offset; + const VkBool32 *input = reinterpret_cast(pInputData); + VkBool32 *output = reinterpret_cast(pOutputData); + + output[index] = (output[index] == VK_TRUE || input[index] == VK_TRUE) ? VK_TRUE : VK_FALSE; + } + q = q->pNext; + } + + this->ApplyRobustness(pCreateInfo); + } + + void PushBack(VkBaseOutStructure *found) + { + VkBaseOutStructure *last = reinterpret_cast(&requiredFeaturesChain); + while (last->pNext != nullptr) + { + last = last->pNext; + } + last->pNext = found; + } + + void Build(const std::vector &requiredList) + { + for (std::size_t i = 0, n = requiredList.size(); i < n; ++i) + { + const VkStructureType sType = requiredList[i]; + if (sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR) + { + continue; + } + + VkBaseOutStructure *found = vpExtractStructure(&physicalDeviceFeatures2KHR, sType); + if (found == nullptr) + { + continue; + } + + PushBack(found); + } + } +}; // struct FeaturesChain + +VPAPI_ATTR const VpProfileDesc *vpGetProfileDesc(const char profileName[VP_MAX_PROFILE_NAME_SIZE]) +{ + for (uint32_t profileIndex = 0; profileIndex < profileCount; ++profileIndex) + { + if (strncmp(profiles[profileIndex].props.profileName, profileName, VP_MAX_PROFILE_NAME_SIZE) == 0) + { + return &profiles[profileIndex]; + } + } + return nullptr; } -VPAPI_ATTR std::vector GatherProfiles(const VpProfileProperties& profile, const char* pBlockName = nullptr) { - std::vector gatheredProfiles; - - if (pBlockName == nullptr) { - const detail::VpProfileDesc* profileDesc = detail::vpGetProfileDesc(profile.profileName); - if (profileDesc != nullptr) { - for (uint32_t profileIndex = 0; profileIndex < profileDesc->requiredProfileCount; ++profileIndex) { - gatheredProfiles.push_back(profileDesc->pRequiredProfiles[profileIndex]); - } - } - } - - gatheredProfiles.push_back(profile); - - return gatheredProfiles; +VPAPI_ATTR std::vector GatherProfiles(const VpProfileProperties &profile, const char *pBlockName = nullptr) +{ + std::vector gatheredProfiles; + + if (pBlockName == nullptr) + { + const detail::VpProfileDesc *profileDesc = detail::vpGetProfileDesc(profile.profileName); + if (profileDesc != nullptr) + { + for (uint32_t profileIndex = 0; profileIndex < profileDesc->requiredProfileCount; ++profileIndex) + { + gatheredProfiles.push_back(profileDesc->pRequiredProfiles[profileIndex]); + } + } + } + + gatheredProfiles.push_back(profile); + + return gatheredProfiles; } -VPAPI_ATTR bool vpCheckVersion(uint32_t actual, uint32_t expected) { - uint32_t actualMajor = VK_API_VERSION_MAJOR(actual); - uint32_t actualMinor = VK_API_VERSION_MINOR(actual); - uint32_t expectedMajor = VK_API_VERSION_MAJOR(expected); - uint32_t expectedMinor = VK_API_VERSION_MINOR(expected); - return actualMajor > expectedMajor || (actualMajor == expectedMajor && actualMinor >= expectedMinor); +VPAPI_ATTR bool vpCheckVersion(uint32_t actual, uint32_t expected) +{ + uint32_t actualMajor = VK_API_VERSION_MAJOR(actual); + uint32_t actualMinor = VK_API_VERSION_MINOR(actual); + uint32_t expectedMajor = VK_API_VERSION_MAJOR(expected); + uint32_t expectedMinor = VK_API_VERSION_MINOR(expected); + return actualMajor > expectedMajor || (actualMajor == expectedMajor && actualMinor >= expectedMinor); } -VPAPI_ATTR bool HasExtension(const std::vector& list, const VkExtensionProperties& element) { - for (std::size_t i = 0, n = list.size(); i < n; ++i) { - if (strcmp(list[i].extensionName, element.extensionName) == 0) { - return true; - } - } - - return false; +VPAPI_ATTR bool HasExtension(const std::vector &list, const VkExtensionProperties &element) +{ + for (std::size_t i = 0, n = list.size(); i < n; ++i) + { + if (strcmp(list[i].extensionName, element.extensionName) == 0) + { + return true; + } + } + + return false; } -VPAPI_ATTR bool CheckExtension(const VkExtensionProperties* supportedProperties, size_t supportedSize, const char *requestedExtension) { - bool found = false; - for (size_t i = 0, n = supportedSize; i < n; ++i) { - if (strcmp(supportedProperties[i].extensionName, requestedExtension) == 0) { - found = true; - break; - // Drivers don't actually update their spec version, so we cannot rely on this - // if (supportedProperties[i].specVersion >= expectedVersion) found = true; - } - } - return found; +VPAPI_ATTR bool CheckExtension(const VkExtensionProperties *supportedProperties, size_t supportedSize, const char *requestedExtension) +{ + bool found = false; + for (size_t i = 0, n = supportedSize; i < n; ++i) + { + if (strcmp(supportedProperties[i].extensionName, requestedExtension) == 0) + { + found = true; + break; + // Drivers don't actually update their spec version, so we cannot rely on this + // if (supportedProperties[i].specVersion >= expectedVersion) found = true; + } + } + VP_DEBUG_COND_MSGF(!found, "Unsupported extension: %s", requestedExtension); + return found; } -VPAPI_ATTR bool CheckExtension(const std::vector& extensions, const char* extension) { - for (const char* c : extensions) { - if (strcmp(c, extension) == 0) { - return true; - } - } - return false; +VPAPI_ATTR bool CheckExtension(const std::vector &extensions, const char *extension) +{ + for (const char *c : extensions) + { + if (strcmp(c, extension) == 0) + { + return true; + } + } + return false; } -VPAPI_ATTR void GetExtensions(uint32_t extensionCount, const VkExtensionProperties *pExtensions, std::vector &extensions) { - for (uint32_t ext_index = 0; ext_index < extensionCount; ++ext_index) { - if (CheckExtension(extensions, pExtensions[ext_index].extensionName)) { - continue; - } - extensions.push_back(pExtensions[ext_index].extensionName); - } +VPAPI_ATTR void GetExtensions(uint32_t extensionCount, const VkExtensionProperties *pExtensions, std::vector &extensions) +{ + for (uint32_t ext_index = 0; ext_index < extensionCount; ++ext_index) + { + if (CheckExtension(extensions, pExtensions[ext_index].extensionName)) + { + continue; + } + extensions.push_back(pExtensions[ext_index].extensionName); + } } VPAPI_ATTR std::vector GatherBlocks( - uint32_t enabledFullProfileCount, const VpProfileProperties* pEnabledFullProfiles, - uint32_t enabledProfileBlockCount, const VpBlockProperties* pEnabledProfileBlocks) { - std::vector results; + uint32_t enabledFullProfileCount, const VpProfileProperties *pEnabledFullProfiles, + uint32_t enabledProfileBlockCount, const VpBlockProperties *pEnabledProfileBlocks) +{ + std::vector results; - for (std::size_t profile_index = 0; profile_index < enabledFullProfileCount; ++profile_index) { - const std::vector& gathered_profiles = GatherProfiles(pEnabledFullProfiles[profile_index]); + for (std::size_t profile_index = 0; profile_index < enabledFullProfileCount; ++profile_index) + { + const std::vector &gathered_profiles = GatherProfiles(pEnabledFullProfiles[profile_index]); - for (std::size_t gathered_index = 0; gathered_index < gathered_profiles.size(); ++gathered_index) { - VpBlockProperties block{gathered_profiles[gathered_index], 0, ""}; - results.push_back(block); - } - } + for (std::size_t gathered_index = 0; gathered_index < gathered_profiles.size(); ++gathered_index) + { + VpBlockProperties block{gathered_profiles[gathered_index], 0, ""}; + results.push_back(block); + } + } - for (std::size_t block_index = 0; block_index < enabledProfileBlockCount; ++block_index) { - results.push_back(pEnabledProfileBlocks[block_index]); - } + for (std::size_t block_index = 0; block_index < enabledProfileBlockCount; ++block_index) + { + results.push_back(pEnabledProfileBlocks[block_index]); + } - return results; + return results; } VPAPI_ATTR VkResult vpGetInstanceProfileSupportSingleProfile( - uint32_t api_version, - const std::vector& supported_extensions, - const VpProfileProperties* pProfile, - VkBool32* pSupported, - std::vector& supportedBlocks, - std::vector& unsupportedBlocks) { - assert(pProfile != nullptr); - - const detail::VpProfileDesc* pProfileDesc = vpGetProfileDesc(pProfile->profileName); - if (pProfileDesc == nullptr) { - *pSupported = VK_FALSE; - return VK_ERROR_UNKNOWN; - } - - VpBlockProperties block{*pProfile, api_version}; - - if (pProfileDesc->props.specVersion < pProfile->specVersion) { - *pSupported = VK_FALSE; - unsupportedBlocks.push_back(block); - } - - // Required API version is built in root profile, not need to check dependent profile API versions - if (api_version != 0) { - if (!vpCheckVersion(api_version, pProfileDesc->minApiVersion)) { - - *pSupported = VK_FALSE; - unsupportedBlocks.push_back(block); - } - } - - for (uint32_t capability_index = 0; capability_index < pProfileDesc->requiredCapabilityCount; ++capability_index) { - const VpCapabilitiesDesc& capabilities_desc = pProfileDesc->pRequiredCapabilities[capability_index]; - - VkBool32 supported_capabilities = VK_FALSE; - for (uint32_t variant_index = 0; variant_index < capabilities_desc.variantCount; ++variant_index) { - const VpVariantDesc& variant_desc = capabilities_desc.pVariants[variant_index]; - - VkBool32 supported_variant = VK_TRUE; - for (uint32_t i = 0; i < variant_desc.instanceExtensionCount; ++i) { - if (!detail::CheckExtension(supported_extensions.data(), supported_extensions.size(), - variant_desc.pInstanceExtensions[i].extensionName)) { - supported_variant = VK_FALSE; - memcpy(block.blockName, variant_desc.blockName, VP_MAX_PROFILE_NAME_SIZE * sizeof(char)); - unsupportedBlocks.push_back(block); - } - } - - if (supported_variant == VK_TRUE) { - supported_capabilities = VK_TRUE; - memcpy(block.blockName, variant_desc.blockName, VP_MAX_PROFILE_NAME_SIZE * sizeof(char)); - supportedBlocks.push_back(block); - } - } - - if (supported_capabilities == VK_FALSE) { - *pSupported = VK_FALSE; - return VK_SUCCESS; - } - } - - return VK_SUCCESS; + uint32_t api_version, + const std::vector &supported_extensions, + const VpProfileProperties *pProfile, + VkBool32 *pSupported, + std::vector &supportedBlocks, + std::vector &unsupportedBlocks) +{ + assert(pProfile != nullptr); + + const detail::VpProfileDesc *pProfileDesc = vpGetProfileDesc(pProfile->profileName); + if (pProfileDesc == nullptr) + { + *pSupported = VK_FALSE; + return VK_ERROR_UNKNOWN; + } + + VpBlockProperties block{*pProfile, api_version}; + + if (pProfileDesc->props.specVersion < pProfile->specVersion) + { + *pSupported = VK_FALSE; + unsupportedBlocks.push_back(block); + } + + // Required API version is built in root profile, not need to check dependent profile API versions + if (api_version != 0) + { + if (!vpCheckVersion(api_version, pProfileDesc->minApiVersion)) + { + VP_DEBUG_MSGF("Unsupported Profile API version %u.%u.%u on a Vulkan system with version %u.%u.%u", VK_API_VERSION_MAJOR(pProfileDesc->minApiVersion), VK_API_VERSION_MINOR(pProfileDesc->minApiVersion), VK_API_VERSION_PATCH(pProfileDesc->minApiVersion), VK_API_VERSION_MAJOR(api_version), VK_API_VERSION_MINOR(api_version), VK_API_VERSION_PATCH(api_version)); + + *pSupported = VK_FALSE; + unsupportedBlocks.push_back(block); + } + } + + for (uint32_t capability_index = 0; capability_index < pProfileDesc->requiredCapabilityCount; ++capability_index) + { + const VpCapabilitiesDesc &capabilities_desc = pProfileDesc->pRequiredCapabilities[capability_index]; + + VkBool32 supported_capabilities = VK_FALSE; + for (uint32_t variant_index = 0; variant_index < capabilities_desc.variantCount; ++variant_index) + { + const VpVariantDesc &variant_desc = capabilities_desc.pVariants[variant_index]; + + VkBool32 supported_variant = VK_TRUE; + for (uint32_t i = 0; i < variant_desc.instanceExtensionCount; ++i) + { + if (!detail::CheckExtension(supported_extensions.data(), supported_extensions.size(), + variant_desc.pInstanceExtensions[i].extensionName)) + { + supported_variant = VK_FALSE; + memcpy(block.blockName, variant_desc.blockName, VP_MAX_PROFILE_NAME_SIZE * sizeof(char)); + unsupportedBlocks.push_back(block); + } + } + + if (supported_variant == VK_TRUE) + { + supported_capabilities = VK_TRUE; + memcpy(block.blockName, variant_desc.blockName, VP_MAX_PROFILE_NAME_SIZE * sizeof(char)); + supportedBlocks.push_back(block); + } + } + + if (supported_capabilities == VK_FALSE) + { + *pSupported = VK_FALSE; + return VK_SUCCESS; + } + } + + return VK_SUCCESS; } -enum structure_type { - STRUCTURE_FEATURE = 0, - STRUCTURE_PROPERTY, - STRUCTURE_FORMAT +enum structure_type +{ + STRUCTURE_FEATURE = 0, + STRUCTURE_PROPERTY, + STRUCTURE_QUEUE_FAMILY, + STRUCTURE_FORMAT }; VPAPI_ATTR VkResult vpGetProfileStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - structure_type type, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + structure_type type, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - - std::vector results; - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (profile_desc == nullptr) return VK_ERROR_UNKNOWN; - - for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) { - const detail::VpCapabilitiesDesc& cap_desc = profile_desc->pRequiredCapabilities[capability_index]; - - for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) { - const detail::VpVariantDesc& variant = cap_desc.pVariants[variant_index]; - if (pBlockName != nullptr) { - if (strcmp(variant.blockName, pBlockName) != 0) { - continue; - } - result = VK_SUCCESS; - } - - uint32_t count = 0; - const VkStructureType* data = nullptr; - - switch (type) { - default: - case STRUCTURE_FEATURE: - count = variant.featureStructTypeCount; - data = variant.pFeatureStructTypes; - break; - case STRUCTURE_PROPERTY: - count = variant.propertyStructTypeCount; - data = variant.pPropertyStructTypes; - break; - case STRUCTURE_FORMAT: - count = variant.formatStructTypeCount; - data = variant.pFormatStructTypes; - break; - } - - for (uint32_t type_index = 0; type_index < count; ++type_index) { - const VkStructureType dataType = data[type_index]; - if (std::find(results.begin(), results.end(), dataType) == std::end(results)) { - results.push_back(dataType); - } - } - } - } - } - - const uint32_t count = static_cast(results.size()); - std::sort(results.begin(), results.end()); - - if (pStructureTypes == nullptr) { - *pStructureTypeCount = count; - } else { - if (*pStructureTypeCount < count) { - result = VK_INCOMPLETE; - } else { - *pStructureTypeCount = count; - } - - if (*pStructureTypeCount > 0) { - memcpy(pStructureTypes, &results[0], *pStructureTypeCount * sizeof(VkStructureType)); - } - } - - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + std::vector results; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + uint32_t count = 0; + const VkStructureType *data = nullptr; + + switch (type) + { + default: + case STRUCTURE_FEATURE: + count = variant.featureStructTypeCount; + data = variant.pFeatureStructTypes; + break; + case STRUCTURE_PROPERTY: + count = variant.propertyStructTypeCount; + data = variant.pPropertyStructTypes; + break; + case STRUCTURE_QUEUE_FAMILY: + count = variant.queueFamilyStructTypeCount; + data = variant.pQueueFamilyStructTypes; + break; + case STRUCTURE_FORMAT: + count = variant.formatStructTypeCount; + data = variant.pFormatStructTypes; + break; + } + + for (uint32_t type_index = 0; type_index < count; ++type_index) + { + const VkStructureType dataType = data[type_index]; + if (std::find(results.begin(), results.end(), dataType) == std::end(results)) + { + results.push_back(dataType); + } + } + } + } + } + + const uint32_t count = static_cast(results.size()); + std::sort(results.begin(), results.end()); + + if (pStructureTypes == nullptr) + { + *pStructureTypeCount = count; + } + else + { + if (*pStructureTypeCount < count) + { + result = VK_INCOMPLETE; + } + else + { + *pStructureTypeCount = count; + } + + if (*pStructureTypeCount > 0) + { + memcpy(pStructureTypes, &results[0], *pStructureTypeCount * sizeof(VkStructureType)); + } + } + + return result; } -enum ExtensionType { - EXTENSION_INSTANCE, - EXTENSION_DEVICE, +enum ExtensionType +{ + EXTENSION_INSTANCE, + EXTENSION_DEVICE, }; VPAPI_ATTR VkResult vpGetProfileExtensionProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - ExtensionType type, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + ExtensionType type, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - - std::vector results; - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile, pBlockName); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (profile_desc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) { - const detail::VpCapabilitiesDesc& cap_desc = profile_desc->pRequiredCapabilities[capability_index]; - - for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) { - const detail::VpVariantDesc& variant = cap_desc.pVariants[variant_index]; - if (pBlockName != nullptr) { - if (strcmp(variant.blockName, pBlockName) != 0) { - continue; - } - result = VK_SUCCESS; - } - - switch (type) { - default: - case EXTENSION_INSTANCE: - for (uint32_t ext_index = 0; ext_index < variant.instanceExtensionCount; ++ext_index) { - if (detail::HasExtension(results, variant.pInstanceExtensions[ext_index])) { - continue; - } - results.push_back(variant.pInstanceExtensions[ext_index]); - } - break; - case EXTENSION_DEVICE: - for (uint32_t ext_index = 0; ext_index < variant.deviceExtensionCount; ++ext_index) { - if (detail::HasExtension(results, variant.pDeviceExtensions[ext_index])) { - continue; - } - results.push_back(variant.pDeviceExtensions[ext_index]); - } - break; - } - } - } - } - - const uint32_t count = static_cast(results.size()); - - if (pProperties == nullptr) { - *pPropertyCount = count; - } else { - if (*pPropertyCount < count) { - result = VK_INCOMPLETE; - } else { - *pPropertyCount = count; - } - if (*pPropertyCount > 0) { - memcpy(pProperties, &results[0], *pPropertyCount * sizeof(VkExtensionProperties)); - } - } - - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + std::vector results; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile, pBlockName); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + switch (type) + { + default: + case EXTENSION_INSTANCE: + for (uint32_t ext_index = 0; ext_index < variant.instanceExtensionCount; ++ext_index) + { + if (detail::HasExtension(results, variant.pInstanceExtensions[ext_index])) + { + continue; + } + results.push_back(variant.pInstanceExtensions[ext_index]); + } + break; + case EXTENSION_DEVICE: + for (uint32_t ext_index = 0; ext_index < variant.deviceExtensionCount; ++ext_index) + { + if (detail::HasExtension(results, variant.pDeviceExtensions[ext_index])) + { + continue; + } + results.push_back(variant.pDeviceExtensions[ext_index]); + } + break; + } + } + } + } + + const uint32_t count = static_cast(results.size()); + + if (pProperties == nullptr) + { + *pPropertyCount = count; + } + else + { + if (*pPropertyCount < count) + { + result = VK_INCOMPLETE; + } + else + { + *pPropertyCount = count; + } + if (*pPropertyCount > 0) + { + memcpy(pProperties, &results[0], *pPropertyCount * sizeof(VkExtensionProperties)); + } + } + + return result; } -} // namespace detail - -struct VpCapabilities_T : public VpVulkanFunctions { - bool singleton = false; - uint32_t apiVersion = VK_API_VERSION_1_0; - - static VpCapabilities_T& Get() { - static VpCapabilities_T instance; - VpCapabilitiesCreateInfo createInfo{}; - createInfo.flags = VP_PROFILE_CREATE_STATIC_BIT; - instance.init(&createInfo); - instance.singleton = true; - return instance; - } - - VpCapabilities_T() { - this->GetInstanceProcAddr = nullptr; - this->GetDeviceProcAddr = nullptr; - this->EnumerateInstanceVersion = nullptr; - this->EnumerateInstanceExtensionProperties = nullptr; - this->EnumerateDeviceExtensionProperties = nullptr; - this->GetPhysicalDeviceFeatures2 = nullptr; - this->GetPhysicalDeviceProperties2 = nullptr; - this->GetPhysicalDeviceFormatProperties2 = nullptr; - this->GetPhysicalDeviceQueueFamilyProperties2 = nullptr; - this->CreateInstance = nullptr; - this->CreateDevice = nullptr; - } - - VkResult init(const VpCapabilitiesCreateInfo* pCreateInfo) { - assert(pCreateInfo != nullptr); - - return ImportVulkanFunctions(pCreateInfo); - } - - VkResult ImportVulkanFunctions(const VpCapabilitiesCreateInfo* pCreateInfo) { - if (pCreateInfo->flags & VP_PROFILE_CREATE_STATIC_BIT) { - ImportVulkanFunctions_Static(); - } - - if (pCreateInfo->pVulkanFunctions != nullptr) { - ImportVulkanFunctions_Custom((VpVulkanFunctions*)pCreateInfo->pVulkanFunctions); - } -/* - if (pCreateInfo->flags & VP_PROFILE_CREATE_DYNAMIC_BIT) { - ImportVulkanFunctions_Dynamic(); - } -*/ - return ValidateVulkanFunctions(); - } - - void ImportVulkanFunctions_Static() { - // Vulkan 1.1 - this->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)vkGetInstanceProcAddr; - this->GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)vkGetDeviceProcAddr; - - this->EnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vkEnumerateInstanceVersion; - this->EnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vkEnumerateInstanceExtensionProperties; - this->EnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)vkEnumerateDeviceExtensionProperties; - - this->GetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)vkGetPhysicalDeviceFeatures2; - this->GetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)vkGetPhysicalDeviceProperties2; - this->GetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)vkGetPhysicalDeviceFormatProperties2; - this->GetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)vkGetPhysicalDeviceQueueFamilyProperties2; - - this->CreateInstance = (PFN_vkCreateInstance)vkCreateInstance; - this->CreateDevice = (PFN_vkCreateDevice)vkCreateDevice; - } - - void ImportVulkanFunctions_Custom(VpVulkanFunctions* pFunctions) { - #define VP_COPY_IF_NOT_NULL(funcName) if(pFunctions->funcName != nullptr) this->funcName = pFunctions->funcName; - - VP_COPY_IF_NOT_NULL(GetInstanceProcAddr); - VP_COPY_IF_NOT_NULL(GetDeviceProcAddr); - - VP_COPY_IF_NOT_NULL(EnumerateInstanceVersion); - VP_COPY_IF_NOT_NULL(EnumerateInstanceExtensionProperties); - VP_COPY_IF_NOT_NULL(EnumerateDeviceExtensionProperties); - - VP_COPY_IF_NOT_NULL(GetPhysicalDeviceFeatures2); - VP_COPY_IF_NOT_NULL(GetPhysicalDeviceProperties2); - VP_COPY_IF_NOT_NULL(GetPhysicalDeviceFormatProperties2); - VP_COPY_IF_NOT_NULL(GetPhysicalDeviceQueueFamilyProperties2); - - VP_COPY_IF_NOT_NULL(CreateInstance); - VP_COPY_IF_NOT_NULL(CreateDevice); - #undef VP_COPY_IF_NOT_NULL - } -/* - VkResult ImportVulkanFunctions_Dynamic() { - // To use VP_PROFILE_CREATE_DYNAMIC_BIT you have to pass VpVulkanFunctions::vkGetInstanceProcAddr and vkGetDeviceProcAddr as VpCapabilitiesCreateInfo::pVulkanFunctions. Other members can be null. - if (this->GetInstanceProcAddr == nullptr || this->GetDeviceProcAddr == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - #define VP_FETCH_INSTANCE_FUNC(memberName, functionNameString) if(this->memberName == nullptr) this->memberName = (PFN_vk##memberName)this->GetInstanceProcAddr(m_hInstance, functionNameString); - #define VP_FETCH_DEVICE_FUNC(memberName, functionNameString) if(this->memberName == nullptr) this->memberName = (PFN_vk##memberName)this->GetDeviceProcAddr(m_hDevice, functionNameString); - - VP_FETCH_INSTANCE_FUNC(GetInstanceProcAddr, "vkGetInstanceProcAddr"); - VP_FETCH_DEVICE_FUNC(GetDeviceProcAddr, "vkGetDeviceProcAddr"); - - VP_FETCH_INSTANCE_FUNC(EnumerateInstanceVersion, "vkEnumerateInstanceVersion"); - VP_FETCH_INSTANCE_FUNC(EnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties"); - VP_FETCH_DEVICE_FUNC(EnumerateDeviceExtensionProperties, "vkEnumerateDeviceExtensionProperties"); - - VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceFeatures2, "vkGetPhysicalDeviceFeatures2"); - VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceProperties2, "vkGetPhysicalDeviceProperties2"); - VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceFormatProperties2, "vkGetPhysicalDeviceFormatProperties2"); - VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceQueueFamilyProperties2, "vkGetPhysicalDeviceQueueFamilyProperties2"); - - VP_FETCH_INSTANCE_FUNC(CreateInstance, "vkCreateInstance"); - VP_FETCH_DEVICE_FUNC(CreateDevice, "vkCreateDevice"); - #undef VP_FETCH_DEVICE_FUNC - #undef VP_FETCH_INSTANCE_FUNC - } -*/ - VkResult ValidateVulkanFunctions() { - if (this->GetInstanceProcAddr == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - if (this->GetDeviceProcAddr == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - if (this->EnumerateInstanceVersion == nullptr && apiVersion >= VK_API_VERSION_1_1) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - if (this->EnumerateInstanceExtensionProperties == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - if (this->EnumerateDeviceExtensionProperties == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - if (this->GetPhysicalDeviceFeatures2 == nullptr) { - return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; - } - - if (this->GetPhysicalDeviceProperties2 == nullptr) { - return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; - } - - if (this->GetPhysicalDeviceFormatProperties2 == nullptr) { - return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; - } - - if (this->GetPhysicalDeviceQueueFamilyProperties2 == nullptr) { - return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; - } - - if (this->CreateInstance == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - if (this->CreateDevice == nullptr) { - return VK_ERROR_INITIALIZATION_FAILED; - } - - return VK_SUCCESS; - } +VPAPI_ATTR VkResult vpGetProfileVideoProfileDesc( + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + const detail::VpVideoProfileDesc **ppVideoProfileDesc) +{ + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + uint32_t curr_base_video_profile_index = 0; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + if (videoProfileIndex < curr_base_video_profile_index + variant.videoProfileCount) + { + *ppVideoProfileDesc = &variant.pVideoProfiles[videoProfileIndex - curr_base_video_profile_index]; + return result; + } + else + { + curr_base_video_profile_index += variant.videoProfileCount; + } + } + } + } + + *ppVideoProfileDesc = nullptr; + return VK_ERROR_UNKNOWN; +} + +} // namespace detail + +struct VpCapabilities_T : public VpVulkanFunctions +{ + bool singleton = false; + uint32_t apiVersion = VK_API_VERSION_1_0; + + static VpCapabilities_T &Get() + { + static VpCapabilities_T instance; + VpCapabilitiesCreateInfo createInfo{}; + createInfo.flags = VP_PROFILE_CREATE_STATIC_BIT; + instance.init(&createInfo); + instance.singleton = true; + return instance; + } + + VpCapabilities_T() + { + this->GetInstanceProcAddr = nullptr; + this->GetDeviceProcAddr = nullptr; + this->EnumerateInstanceVersion = nullptr; + this->EnumerateInstanceExtensionProperties = nullptr; + this->EnumerateDeviceExtensionProperties = nullptr; + this->GetPhysicalDeviceFeatures2 = nullptr; + this->GetPhysicalDeviceProperties2 = nullptr; + this->GetPhysicalDeviceFormatProperties2 = nullptr; + this->GetPhysicalDeviceQueueFamilyProperties2 = nullptr; + this->CreateInstance = nullptr; + this->CreateDevice = nullptr; + } + + VkResult init(const VpCapabilitiesCreateInfo *pCreateInfo) + { + assert(pCreateInfo != nullptr); + + return ImportVulkanFunctions(pCreateInfo); + } + + VkResult ImportVulkanFunctions(const VpCapabilitiesCreateInfo *pCreateInfo) + { + if (pCreateInfo->flags & VP_PROFILE_CREATE_STATIC_BIT) + { + ImportVulkanFunctions_Static(); + } + + if (pCreateInfo->pVulkanFunctions != nullptr) + { + ImportVulkanFunctions_Custom((VpVulkanFunctions *) pCreateInfo->pVulkanFunctions); + } + /* + if (pCreateInfo->flags & VP_PROFILE_CREATE_DYNAMIC_BIT) { + ImportVulkanFunctions_Dynamic(); + } + */ + return ValidateVulkanFunctions(); + } + + void ImportVulkanFunctions_Static() + { + // Vulkan 1.1 + this->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) vkGetInstanceProcAddr; + this->GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) vkGetDeviceProcAddr; + + this->EnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion) vkEnumerateInstanceVersion; + this->EnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties) vkEnumerateInstanceExtensionProperties; + this->EnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties) vkEnumerateDeviceExtensionProperties; + + this->GetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2) vkGetPhysicalDeviceFeatures2; + this->GetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2) vkGetPhysicalDeviceProperties2; + this->GetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2) vkGetPhysicalDeviceFormatProperties2; + this->GetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2) vkGetPhysicalDeviceQueueFamilyProperties2; + + this->CreateInstance = (PFN_vkCreateInstance) vkCreateInstance; + this->CreateDevice = (PFN_vkCreateDevice) vkCreateDevice; + } + + void ImportVulkanFunctions_Custom(VpVulkanFunctions *pFunctions) + { +#define VP_COPY_IF_NOT_NULL(funcName) \ + if (pFunctions->funcName != nullptr) \ + this->funcName = pFunctions->funcName; + + VP_COPY_IF_NOT_NULL(GetInstanceProcAddr); + VP_COPY_IF_NOT_NULL(GetDeviceProcAddr); + + VP_COPY_IF_NOT_NULL(EnumerateInstanceVersion); + VP_COPY_IF_NOT_NULL(EnumerateInstanceExtensionProperties); + VP_COPY_IF_NOT_NULL(EnumerateDeviceExtensionProperties); + + VP_COPY_IF_NOT_NULL(GetPhysicalDeviceFeatures2); + VP_COPY_IF_NOT_NULL(GetPhysicalDeviceProperties2); + VP_COPY_IF_NOT_NULL(GetPhysicalDeviceFormatProperties2); + VP_COPY_IF_NOT_NULL(GetPhysicalDeviceQueueFamilyProperties2); + + VP_COPY_IF_NOT_NULL(CreateInstance); + VP_COPY_IF_NOT_NULL(CreateDevice); +#undef VP_COPY_IF_NOT_NULL + } + /* + VkResult ImportVulkanFunctions_Dynamic() { + // To use VP_PROFILE_CREATE_DYNAMIC_BIT you have to pass VpVulkanFunctions::vkGetInstanceProcAddr and vkGetDeviceProcAddr as VpCapabilitiesCreateInfo::pVulkanFunctions. Other members can be null. + if (this->GetInstanceProcAddr == nullptr || this->GetDeviceProcAddr == nullptr) { + return VK_ERROR_INITIALIZATION_FAILED; + } + + #define VP_FETCH_INSTANCE_FUNC(memberName, functionNameString) if(this->memberName == nullptr) this->memberName = (PFN_vk##memberName)this->GetInstanceProcAddr(m_hInstance, functionNameString); + #define VP_FETCH_DEVICE_FUNC(memberName, functionNameString) if(this->memberName == nullptr) this->memberName = (PFN_vk##memberName)this->GetDeviceProcAddr(m_hDevice, functionNameString); + + VP_FETCH_INSTANCE_FUNC(GetInstanceProcAddr, "vkGetInstanceProcAddr"); + VP_FETCH_DEVICE_FUNC(GetDeviceProcAddr, "vkGetDeviceProcAddr"); + + VP_FETCH_INSTANCE_FUNC(EnumerateInstanceVersion, "vkEnumerateInstanceVersion"); + VP_FETCH_INSTANCE_FUNC(EnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties"); + VP_FETCH_DEVICE_FUNC(EnumerateDeviceExtensionProperties, "vkEnumerateDeviceExtensionProperties"); + + VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceFeatures2, "vkGetPhysicalDeviceFeatures2"); + VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceProperties2, "vkGetPhysicalDeviceProperties2"); + VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceFormatProperties2, "vkGetPhysicalDeviceFormatProperties2"); + VP_FETCH_DEVICE_FUNC(GetPhysicalDeviceQueueFamilyProperties2, "vkGetPhysicalDeviceQueueFamilyProperties2"); + + VP_FETCH_INSTANCE_FUNC(CreateInstance, "vkCreateInstance"); + VP_FETCH_DEVICE_FUNC(CreateDevice, "vkCreateDevice"); + #undef VP_FETCH_DEVICE_FUNC + #undef VP_FETCH_INSTANCE_FUNC + } + */ + VkResult ValidateVulkanFunctions() + { + if (this->GetInstanceProcAddr == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + if (this->GetDeviceProcAddr == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + if (this->EnumerateInstanceVersion == nullptr && apiVersion >= VK_API_VERSION_1_1) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + if (this->EnumerateInstanceExtensionProperties == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + if (this->EnumerateDeviceExtensionProperties == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + if (this->GetPhysicalDeviceFeatures2 == nullptr) + { + return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; + } + + if (this->GetPhysicalDeviceProperties2 == nullptr) + { + return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; + } + + if (this->GetPhysicalDeviceFormatProperties2 == nullptr) + { + return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; + } + + if (this->GetPhysicalDeviceQueueFamilyProperties2 == nullptr) + { + return apiVersion >= VK_API_VERSION_1_1 ? VK_ERROR_INITIALIZATION_FAILED : VK_ERROR_EXTENSION_NOT_PRESENT; + } + + if (this->CreateInstance == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + if (this->CreateDevice == nullptr) + { + return VK_ERROR_INITIALIZATION_FAILED; + } + + return VK_SUCCESS; + } }; VPAPI_ATTR VkResult vpCreateCapabilities( - const VpCapabilitiesCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VpCapabilities* pCapabilities) { - (void)pAllocator; + const VpCapabilitiesCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VpCapabilities *pCapabilities) +{ + (void) pAllocator; - VpCapabilities_T* capabilities = new VpCapabilities_T(); - VkResult result = capabilities->init(pCreateInfo); - *pCapabilities = capabilities; + VpCapabilities_T *capabilities = new VpCapabilities_T(); + VkResult result = capabilities->init(pCreateInfo); + *pCapabilities = capabilities; - return result; + return result; } /// Destroys allocator object. VPAPI_ATTR void vpDestroyCapabilities( - VpCapabilities capabilities, - const VkAllocationCallbacks* pAllocator) { - (void)pAllocator; - - delete capabilities; + VpCapabilities capabilities, + const VkAllocationCallbacks *pAllocator) +{ + (void) pAllocator; + + delete capabilities; } VPAPI_ATTR VkResult vpGetProfiles( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - uint32_t* pPropertyCount, - VpProfileProperties* pProperties) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + uint32_t *pPropertyCount, + VpProfileProperties *pProperties) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = VK_SUCCESS; - - if (pProperties == nullptr) { - *pPropertyCount = detail::profileCount; - } else { - if (*pPropertyCount < detail::profileCount) { - result = VK_INCOMPLETE; - } else { - *pPropertyCount = detail::profileCount; - } - for (uint32_t property_index = 0; property_index < *pPropertyCount; ++property_index) { - pProperties[property_index] = detail::profiles[property_index].props; - } - } - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = VK_SUCCESS; + + if (pProperties == nullptr) + { + *pPropertyCount = detail::profileCount; + } + else + { + if (*pPropertyCount < detail::profileCount) + { + result = VK_INCOMPLETE; + } + else + { + *pPropertyCount = detail::profileCount; + } + for (uint32_t property_index = 0; property_index < *pPropertyCount; ++property_index) + { + pProperties[property_index] = detail::profiles[property_index].props; + } + } + return result; } VPAPI_ATTR VkResult vpGetProfileRequiredProfiles( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - uint32_t* pPropertyCount, - VpProfileProperties* pProperties) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + uint32_t *pPropertyCount, + VpProfileProperties *pProperties) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = VK_SUCCESS; - - const detail::VpProfileDesc* desc = detail::vpGetProfileDesc(pProfile->profileName); - if (desc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - if (pProperties == nullptr) { - *pPropertyCount = desc->requiredProfileCount; - } else { - if (*pPropertyCount < desc->requiredProfileCount) { - result = VK_INCOMPLETE; - } else { - *pPropertyCount = desc->requiredProfileCount; - } - for (uint32_t property_index = 0; property_index < *pPropertyCount; ++property_index) { - pProperties[property_index] = desc->pRequiredProfiles[property_index]; - } - } - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = VK_SUCCESS; + + const detail::VpProfileDesc *desc = detail::vpGetProfileDesc(pProfile->profileName); + if (desc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + if (pProperties == nullptr) + { + *pPropertyCount = desc->requiredProfileCount; + } + else + { + if (*pPropertyCount < desc->requiredProfileCount) + { + result = VK_INCOMPLETE; + } + else + { + *pPropertyCount = desc->requiredProfileCount; + } + for (uint32_t property_index = 0; property_index < *pPropertyCount; ++property_index) + { + pProperties[property_index] = desc->pRequiredProfiles[property_index]; + } + } + return result; } VPAPI_ATTR uint32_t vpGetProfileAPIVersion( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT + (void) capabilities; +#endif // VP_USE_OBJECT - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile, nullptr); + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile, nullptr); - uint32_t major = 0; - uint32_t minor = 0; - uint32_t patch = 0; + uint32_t major = 0; + uint32_t minor = 0; + uint32_t patch = 0; - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (desc == nullptr) { - return 0; - } + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (desc == nullptr) + { + return 0; + } - major = std::max(major, VK_API_VERSION_MAJOR(desc->minApiVersion)); - minor = std::max(minor, VK_API_VERSION_MINOR(desc->minApiVersion)); - patch = std::max(patch, VK_API_VERSION_PATCH(desc->minApiVersion)); - } + major = std::max(major, VK_API_VERSION_MAJOR(desc->minApiVersion)); + minor = std::max(minor, VK_API_VERSION_MINOR(desc->minApiVersion)); + patch = std::max(patch, VK_API_VERSION_PATCH(desc->minApiVersion)); + } - return VK_MAKE_API_VERSION(0, major, minor, patch); + return VK_MAKE_API_VERSION(0, major, minor, patch); } VPAPI_ATTR VkResult vpGetProfileFallbacks( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - uint32_t* pPropertyCount, - VpProfileProperties* pProperties) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + uint32_t *pPropertyCount, + VpProfileProperties *pProperties) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = VK_SUCCESS; - - const detail::VpProfileDesc* desc = detail::vpGetProfileDesc(pProfile->profileName); - if (desc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - if (pProperties == nullptr) { - *pPropertyCount = desc->fallbackCount; - } else { - if (*pPropertyCount < desc->fallbackCount) { - result = VK_INCOMPLETE; - } else { - *pPropertyCount = desc->fallbackCount; - } - for (uint32_t i = 0; i < *pPropertyCount; ++i) { - pProperties[i] = desc->pFallbacks[i]; - } - } - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = VK_SUCCESS; + + const detail::VpProfileDesc *desc = detail::vpGetProfileDesc(pProfile->profileName); + if (desc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + if (pProperties == nullptr) + { + *pPropertyCount = desc->fallbackCount; + } + else + { + if (*pPropertyCount < desc->fallbackCount) + { + result = VK_INCOMPLETE; + } + else + { + *pPropertyCount = desc->fallbackCount; + } + for (uint32_t i = 0; i < *pPropertyCount; ++i) + { + pProperties[i] = desc->pFallbacks[i]; + } + } + return result; } VPAPI_ATTR VkResult vpHasMultipleVariantsProfile( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - VkBool32* pHasMultipleVariants) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + VkBool32 *pHasMultipleVariants) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile, nullptr); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (desc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - for (uint32_t caps_index = 0, caps_count = desc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) { - if (desc->pRequiredCapabilities[caps_index].variantCount > 1) { - *pHasMultipleVariants = VK_TRUE; - return VK_SUCCESS; - } - } - } - - *pHasMultipleVariants = VK_FALSE; - return VK_SUCCESS; + (void) capabilities; +#endif // VP_USE_OBJECT + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile, nullptr); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (desc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + for (uint32_t caps_index = 0, caps_count = desc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) + { + if (desc->pRequiredCapabilities[caps_index].variantCount > 1) + { + *pHasMultipleVariants = VK_TRUE; + return VK_SUCCESS; + } + } + } + + *pHasMultipleVariants = VK_FALSE; + return VK_SUCCESS; } VPAPI_ATTR VkResult vpGetInstanceProfileVariantsSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const char* pLayerName, - const VpProfileProperties* pProfile, - VkBool32* pSupported, - uint32_t* pPropertyCount, - VpBlockProperties* pProperties) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const char *pLayerName, + const VpProfileProperties *pProfile, + VkBool32 *pSupported, + uint32_t *pPropertyCount, + VpBlockProperties *pProperties) +{ #ifdef VP_USE_OBJECT - const VpCapabilities_T& vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; + const VpCapabilities_T &vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; #else - const VpCapabilities_T& vp = VpCapabilities_T::Get(); -#endif//VP_USE_OBJECT - - VkResult result = VK_SUCCESS; - - uint32_t api_version = VK_API_VERSION_1_0; - PFN_vkEnumerateInstanceVersion pfnEnumerateInstanceVersion = vp.singleton ? - (PFN_vkEnumerateInstanceVersion)vkGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceVersion") : vp.EnumerateInstanceVersion; - if (pfnEnumerateInstanceVersion != nullptr) { - result = pfnEnumerateInstanceVersion(&api_version); - if (result != VK_SUCCESS) { - *pSupported = VK_FALSE; - return result; - } /* else { - } */ - } - - uint32_t supported_instance_extension_count = 0; - result = vp.EnumerateInstanceExtensionProperties(pLayerName, &supported_instance_extension_count, nullptr); - if (result != VK_SUCCESS) { - *pSupported = VK_FALSE; - return result; - } - std::vector supported_instance_extensions; - if (supported_instance_extension_count > 0) { - supported_instance_extensions.resize(supported_instance_extension_count); - } - result = vp.EnumerateInstanceExtensionProperties(pLayerName, &supported_instance_extension_count, supported_instance_extensions.data()); - if (result != VK_SUCCESS) { - *pSupported = VK_FALSE; - return result; - } - - VkBool32 supported = VK_TRUE; - - // We require VK_KHR_get_physical_device_properties2 if we are on Vulkan 1.0 - if (api_version < VK_API_VERSION_1_1) { - bool foundGPDP2 = false; - for (size_t ext_index = 0, ext_count = supported_instance_extensions.size(); ext_index < ext_count; ++ext_index) { - if (strcmp(supported_instance_extensions[ext_index].extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) { - foundGPDP2 = true; - break; - } - } - if (!foundGPDP2) { - supported = VK_FALSE; - } - } - - const detail::VpProfileDesc* pProfileDesc = detail::vpGetProfileDesc(pProfile->profileName); - if (pProfileDesc == nullptr) return VK_ERROR_UNKNOWN; - - std::vector supported_blocks; - std::vector unsupported_blocks; - - result = detail::vpGetInstanceProfileSupportSingleProfile(api_version, supported_instance_extensions, pProfile, &supported, supported_blocks, unsupported_blocks); - if (result != VK_SUCCESS) { - *pSupported = supported; - return result; - } - - for (std::size_t required_profile_index = 0; required_profile_index < pProfileDesc->requiredProfileCount; ++required_profile_index) { - result = detail::vpGetInstanceProfileSupportSingleProfile(0, supported_instance_extensions, &pProfileDesc->pRequiredProfiles[required_profile_index], &supported, supported_blocks, unsupported_blocks); - if (result != VK_SUCCESS) { - *pSupported = supported; - return result; - } - } - - const std::vector& blocks = supported ? supported_blocks : unsupported_blocks; - - if (pProperties == nullptr) { - *pPropertyCount = static_cast(blocks.size()); - } else { - if (*pPropertyCount < static_cast(blocks.size())) { - result = VK_INCOMPLETE; - } else { - *pPropertyCount = static_cast(blocks.size()); - } - for (uint32_t block_index = 0, block_count = static_cast(blocks.size()); block_index < block_count; ++block_index) { - pProperties[block_index] = blocks[block_index]; - } - } - - *pSupported = supported; - return result; + const VpCapabilities_T &vp = VpCapabilities_T::Get(); +#endif // VP_USE_OBJECT + + VkResult result = VK_SUCCESS; + + uint32_t api_version = VK_API_VERSION_1_0; + PFN_vkEnumerateInstanceVersion pfnEnumerateInstanceVersion = vp.singleton ? + (PFN_vkEnumerateInstanceVersion) vkGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceVersion") : + vp.EnumerateInstanceVersion; + if (pfnEnumerateInstanceVersion != nullptr) + { + result = pfnEnumerateInstanceVersion(&api_version); + if (result != VK_SUCCESS) + { + *pSupported = VK_FALSE; + return result; + } /* else { + VP_DEBUG_MSGF("Instance API version %u.%u.%u", VK_API_VERSION_MAJOR(api_version), VK_API_VERSION_MINOR(api_version), VK_API_VERSION_PATCH(api_version)); + } */ + } + + uint32_t supported_instance_extension_count = 0; + result = vp.EnumerateInstanceExtensionProperties(pLayerName, &supported_instance_extension_count, nullptr); + if (result != VK_SUCCESS) + { + *pSupported = VK_FALSE; + return result; + } + std::vector supported_instance_extensions; + if (supported_instance_extension_count > 0) + { + supported_instance_extensions.resize(supported_instance_extension_count); + } + result = vp.EnumerateInstanceExtensionProperties(pLayerName, &supported_instance_extension_count, supported_instance_extensions.data()); + if (result != VK_SUCCESS) + { + *pSupported = VK_FALSE; + return result; + } + + VkBool32 supported = VK_TRUE; + + // We require VK_KHR_get_physical_device_properties2 if we are on Vulkan 1.0 + if (api_version < VK_API_VERSION_1_1) + { + bool foundGPDP2 = false; + for (size_t ext_index = 0, ext_count = supported_instance_extensions.size(); ext_index < ext_count; ++ext_index) + { + if (strcmp(supported_instance_extensions[ext_index].extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) + { + foundGPDP2 = true; + break; + } + } + if (!foundGPDP2) + { + VP_DEBUG_MSG("Unsupported mandatory extension VK_KHR_get_physical_device_properties2 on Vulkan 1.0"); + supported = VK_FALSE; + } + } + + const detail::VpProfileDesc *pProfileDesc = detail::vpGetProfileDesc(pProfile->profileName); + if (pProfileDesc == nullptr) + return VK_ERROR_UNKNOWN; + + std::vector supported_blocks; + std::vector unsupported_blocks; + + result = detail::vpGetInstanceProfileSupportSingleProfile(api_version, supported_instance_extensions, pProfile, &supported, supported_blocks, unsupported_blocks); + if (result != VK_SUCCESS) + { + *pSupported = supported; + return result; + } + + for (std::size_t required_profile_index = 0; required_profile_index < pProfileDesc->requiredProfileCount; ++required_profile_index) + { + result = detail::vpGetInstanceProfileSupportSingleProfile(0, supported_instance_extensions, &pProfileDesc->pRequiredProfiles[required_profile_index], &supported, supported_blocks, unsupported_blocks); + if (result != VK_SUCCESS) + { + *pSupported = supported; + return result; + } + } + + const std::vector &blocks = supported ? supported_blocks : unsupported_blocks; + + if (pProperties == nullptr) + { + *pPropertyCount = static_cast(blocks.size()); + } + else + { + if (*pPropertyCount < static_cast(blocks.size())) + { + result = VK_INCOMPLETE; + } + else + { + *pPropertyCount = static_cast(blocks.size()); + } + for (uint32_t block_index = 0, block_count = static_cast(blocks.size()); block_index < block_count; ++block_index) + { + pProperties[block_index] = blocks[block_index]; + } + } + + *pSupported = supported; + return result; } VPAPI_ATTR VkResult vpGetInstanceProfileSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const char* pLayerName, - const VpProfileProperties* pProfile, - VkBool32* pSupported) { - uint32_t count = 0; - - return vpGetInstanceProfileVariantsSupport( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const char *pLayerName, + const VpProfileProperties *pProfile, + VkBool32 *pSupported) +{ + uint32_t count = 0; + + return vpGetInstanceProfileVariantsSupport( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pLayerName, pProfile, pSupported, &count, nullptr); + capabilities, +#endif // VP_USE_OBJECT + pLayerName, pProfile, pSupported, &count, nullptr); } VPAPI_ATTR VkResult vpCreateInstance( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpInstanceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkInstance* pInstance) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpInstanceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkInstance *pInstance) +{ #ifdef VP_USE_OBJECT - const VpCapabilities_T& vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; + const VpCapabilities_T &vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; #else - const VpCapabilities_T& vp = VpCapabilities_T::Get(); -#endif//VP_USE_OBJECT - - if (pCreateInfo == nullptr || pInstance == nullptr) { - return vp.CreateInstance(pCreateInfo == nullptr ? nullptr : pCreateInfo->pCreateInfo, pAllocator, pInstance); - } - - const std::vector& blocks = detail::GatherBlocks( - pCreateInfo->enabledFullProfileCount, pCreateInfo->pEnabledFullProfiles, - pCreateInfo->enabledProfileBlockCount, pCreateInfo->pEnabledProfileBlocks); - - std::vector extensions; - for (std::uint32_t ext_index = 0, ext_count = pCreateInfo->pCreateInfo->enabledExtensionCount; ext_index < ext_count; ++ext_index) { - extensions.push_back(pCreateInfo->pCreateInfo->ppEnabledExtensionNames[ext_index]); - } - - for (std::size_t block_index = 0, block_count = blocks.size(); block_index < block_count; ++block_index) { - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(blocks[block_index].profiles.profileName); - if (profile_desc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - for (std::size_t caps_index = 0, caps_count = profile_desc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) { - const detail::VpCapabilitiesDesc* caps_desc = &profile_desc->pRequiredCapabilities[caps_index]; - - for (std::size_t variant_index = 0, variant_count = caps_desc->variantCount; variant_index < variant_count; ++variant_index) { - const detail::VpVariantDesc* variant = &caps_desc->pVariants[variant_index]; - - if (strcmp(blocks[block_index].blockName, "") != 0) { - if (strcmp(variant->blockName, blocks[block_index].blockName) != 0) { - continue; - } - } - - detail::GetExtensions(variant->instanceExtensionCount, variant->pInstanceExtensions, extensions); - } - } - } - - VkApplicationInfo appInfo{VK_STRUCTURE_TYPE_APPLICATION_INFO}; - if (pCreateInfo->pCreateInfo->pApplicationInfo != nullptr) { - appInfo = *pCreateInfo->pCreateInfo->pApplicationInfo; - } else if (!blocks.empty()) { - appInfo.apiVersion = vpGetProfileAPIVersion( + const VpCapabilities_T &vp = VpCapabilities_T::Get(); +#endif // VP_USE_OBJECT + + if (pCreateInfo == nullptr || pInstance == nullptr) + { + return vp.CreateInstance(pCreateInfo == nullptr ? nullptr : pCreateInfo->pCreateInfo, pAllocator, pInstance); + } + + const std::vector &blocks = detail::GatherBlocks( + pCreateInfo->enabledFullProfileCount, pCreateInfo->pEnabledFullProfiles, + pCreateInfo->enabledProfileBlockCount, pCreateInfo->pEnabledProfileBlocks); + + std::vector extensions; + for (std::uint32_t ext_index = 0, ext_count = pCreateInfo->pCreateInfo->enabledExtensionCount; ext_index < ext_count; ++ext_index) + { + extensions.push_back(pCreateInfo->pCreateInfo->ppEnabledExtensionNames[ext_index]); + } + + for (std::size_t block_index = 0, block_count = blocks.size(); block_index < block_count; ++block_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(blocks[block_index].profiles.profileName); + if (profile_desc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + for (std::size_t caps_index = 0, caps_count = profile_desc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) + { + const detail::VpCapabilitiesDesc *caps_desc = &profile_desc->pRequiredCapabilities[caps_index]; + + for (std::size_t variant_index = 0, variant_count = caps_desc->variantCount; variant_index < variant_count; ++variant_index) + { + const detail::VpVariantDesc *variant = &caps_desc->pVariants[variant_index]; + + if (strcmp(blocks[block_index].blockName, "") != 0) + { + if (strcmp(variant->blockName, blocks[block_index].blockName) != 0) + { + continue; + } + } + + detail::GetExtensions(variant->instanceExtensionCount, variant->pInstanceExtensions, extensions); + } + } + } + + VkApplicationInfo appInfo{VK_STRUCTURE_TYPE_APPLICATION_INFO}; + if (pCreateInfo->pCreateInfo->pApplicationInfo != nullptr) + { + appInfo = *pCreateInfo->pCreateInfo->pApplicationInfo; + } + else if (!blocks.empty()) + { + appInfo.apiVersion = vpGetProfileAPIVersion( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - &blocks[0].profiles); - } - - VkInstanceCreateInfo createInfo = *pCreateInfo->pCreateInfo; - createInfo.pApplicationInfo = &appInfo; - - // Need to include VK_KHR_get_physical_device_properties2 if we are on Vulkan 1.0 - if (createInfo.pApplicationInfo->apiVersion < VK_API_VERSION_1_1) { - bool foundGPDP2 = false; - for (size_t ext_index = 0, ext_count = extensions.size(); ext_index < ext_count; ++ext_index) { - if (strcmp(extensions[ext_index], VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) { - foundGPDP2 = true; - break; - } - } - if (!foundGPDP2) { - extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); - } - } + capabilities, +#endif // VP_USE_OBJECT + &blocks[0].profiles); + } + + VkInstanceCreateInfo createInfo = *pCreateInfo->pCreateInfo; + createInfo.pApplicationInfo = &appInfo; + + // Need to include VK_KHR_get_physical_device_properties2 if we are on Vulkan 1.0 + if (createInfo.pApplicationInfo->apiVersion < VK_API_VERSION_1_1) + { + bool foundGPDP2 = false; + for (size_t ext_index = 0, ext_count = extensions.size(); ext_index < ext_count; ++ext_index) + { + if (strcmp(extensions[ext_index], VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) + { + foundGPDP2 = true; + break; + } + } + if (!foundGPDP2) + { + extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + } + } #ifdef __APPLE__ - bool has_portability_ext = false; - for (std::size_t ext_index = 0, ext_count = extensions.size(); ext_index < ext_count; ++ext_index) { - if (strcmp(extensions[ext_index], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) { - has_portability_ext = true; - break; - } - } - - if (!has_portability_ext) { - extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); - } - - createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + bool has_portability_ext = false; + for (std::size_t ext_index = 0, ext_count = extensions.size(); ext_index < ext_count; ++ext_index) + { + if (strcmp(extensions[ext_index], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) + { + has_portability_ext = true; + break; + } + } + + if (!has_portability_ext) + { + extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + } + + createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; #endif - if (!extensions.empty()) { - createInfo.enabledExtensionCount = static_cast(extensions.size()); - createInfo.ppEnabledExtensionNames = extensions.data(); - } + if (!extensions.empty()) + { + createInfo.enabledExtensionCount = static_cast(extensions.size()); + createInfo.ppEnabledExtensionNames = extensions.data(); + } - return vp.CreateInstance(&createInfo, pAllocator, pInstance); + return vp.CreateInstance(&createInfo, pAllocator, pInstance); } VPAPI_ATTR VkResult vpGetPhysicalDeviceProfileVariantsSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - VkInstance instance, - VkPhysicalDevice physicalDevice, + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + VkInstance instance, + VkPhysicalDevice physicalDevice, const VpProfileProperties *pProfile, - VkBool32 *pSupported, - uint32_t *pPropertyCount, - VpBlockProperties* pProperties) { + VkBool32 *pSupported, + uint32_t *pPropertyCount, + VpBlockProperties *pProperties) +{ #ifdef VP_USE_OBJECT - const VpCapabilities_T& vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; + const VpCapabilities_T &vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; #else - const VpCapabilities_T& vp = VpCapabilities_T::Get(); -#endif//VP_USE_OBJECT - - VkResult result = VK_SUCCESS; - - uint32_t supported_device_extension_count = 0; - result = vp.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &supported_device_extension_count, nullptr); - if (result != VK_SUCCESS) { - return result; - } - std::vector supported_device_extensions; - if (supported_device_extension_count > 0) { - supported_device_extensions.resize(supported_device_extension_count); - } - result = vp.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &supported_device_extension_count, supported_device_extensions.data()); - if (result != VK_SUCCESS) { - return result; - } - - // Workaround old loader bug where count could be smaller on the second call to vkEnumerateDeviceExtensionProperties - if (supported_device_extension_count > 0) { - supported_device_extensions.resize(supported_device_extension_count); - } - - { - const detail::VpProfileDesc* pProfileDesc = detail::vpGetProfileDesc(pProfile->profileName); - if (pProfileDesc == nullptr) { - return VK_ERROR_UNKNOWN; - } - } - - struct GPDP2EntryPoints { - PFN_vkGetPhysicalDeviceFeatures2KHR pfnGetPhysicalDeviceFeatures2; - PFN_vkGetPhysicalDeviceProperties2KHR pfnGetPhysicalDeviceProperties2; - PFN_vkGetPhysicalDeviceFormatProperties2KHR pfnGetPhysicalDeviceFormatProperties2; - PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR pfnGetPhysicalDeviceQueueFamilyProperties2; - }; - - std::vector supported_blocks; - std::vector unsupported_blocks; - - struct UserData { - VkPhysicalDevice physicalDevice; - std::vector& supported_blocks; - std::vector& unsupported_blocks; - const detail::VpVariantDesc* variant; - GPDP2EntryPoints gpdp2; - uint32_t index; - uint32_t count; - detail::PFN_vpStructChainerCb pfnCb; - bool supported; - } userData{physicalDevice, supported_blocks, unsupported_blocks}; - - if (!vp.singleton) { - userData.gpdp2.pfnGetPhysicalDeviceFeatures2 = vp.GetPhysicalDeviceFeatures2; - userData.gpdp2.pfnGetPhysicalDeviceProperties2 = vp.GetPhysicalDeviceProperties2; - userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 = vp.GetPhysicalDeviceFormatProperties2; - userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 = vp.GetPhysicalDeviceQueueFamilyProperties2; - } - - // Attempt to load core versions of the GPDP2 entry points - if (userData.gpdp2.pfnGetPhysicalDeviceFeatures2 == nullptr) { - userData.gpdp2.pfnGetPhysicalDeviceFeatures2 = - (PFN_vkGetPhysicalDeviceFeatures2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2"); - userData.gpdp2.pfnGetPhysicalDeviceProperties2 = - (PFN_vkGetPhysicalDeviceProperties2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2"); - userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 = - (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2"); - userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 = - (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2"); - } - - // If not successful, try to load KHR variant - if (userData.gpdp2.pfnGetPhysicalDeviceFeatures2 == nullptr) { - userData.gpdp2.pfnGetPhysicalDeviceFeatures2 = - (PFN_vkGetPhysicalDeviceFeatures2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR"); - userData.gpdp2.pfnGetPhysicalDeviceProperties2 = - (PFN_vkGetPhysicalDeviceProperties2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR"); - userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 = - (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR"); - userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 = - (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"); - } - - if (userData.gpdp2.pfnGetPhysicalDeviceFeatures2 == nullptr || - userData.gpdp2.pfnGetPhysicalDeviceProperties2 == nullptr || - userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 == nullptr || - userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 == nullptr) { - return VK_ERROR_EXTENSION_NOT_PRESENT; - } - - bool supported = true; - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const char* profile_name = gathered_profiles[profile_index].profileName; - - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(profile_name); - if (profile_desc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - bool supported_profile = true; - - if (profile_desc->props.specVersion < gathered_profiles[profile_index].specVersion) { - supported_profile = false; - } - - VpBlockProperties block{gathered_profiles[profile_index], profile_desc->minApiVersion}; - - { - VkPhysicalDeviceProperties2KHR properties2{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR }; - userData.gpdp2.pfnGetPhysicalDeviceProperties2(physicalDevice, &properties2); - if (!detail::vpCheckVersion(properties2.properties.apiVersion, profile_desc->minApiVersion)) { - supported_profile = false; - } - } - - for (uint32_t required_capability_index = 0; required_capability_index < profile_desc->requiredCapabilityCount; ++required_capability_index) { - const detail::VpCapabilitiesDesc* required_capabilities = &profile_desc->pRequiredCapabilities[required_capability_index]; - - bool supported_block = false; - - for (uint32_t variant_index = 0; variant_index < required_capabilities->variantCount; ++variant_index) { - const detail::VpVariantDesc& variant_desc = required_capabilities->pVariants[variant_index]; - - bool supported_variant = true; - - for (uint32_t ext_index = 0; ext_index < variant_desc.deviceExtensionCount; ++ext_index) { - const char *requested_extension = variant_desc.pDeviceExtensions[ext_index].extensionName; - if (!detail::CheckExtension(supported_device_extensions.data(), supported_device_extensions.size(), requested_extension)) { - supported_variant = false; - } - } - - userData.variant = &variant_desc; - - VkPhysicalDeviceFeatures2KHR features{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR }; - userData.variant->chainers.pfnFeature( - static_cast(static_cast(&features)), &userData, - [](VkBaseOutStructure* p, void* pUser) { - UserData* pUserData = static_cast(pUser); - pUserData->gpdp2.pfnGetPhysicalDeviceFeatures2( - pUserData->physicalDevice, - static_cast(static_cast(p))); - - pUserData->supported = true; - while (p != nullptr) { - if (!pUserData->variant->feature.pfnComparator(p)) { - pUserData->supported = false; - } - p = p->pNext; - } - } - ); - if (!userData.supported) { - supported_variant = false; - } - - VkPhysicalDeviceProperties2KHR device_properties2{ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR }; - userData.variant->chainers.pfnProperty( - static_cast(static_cast(&device_properties2)), &userData, - [](VkBaseOutStructure* p, void* pUser) { - UserData* pUserData = static_cast(pUser); - pUserData->gpdp2.pfnGetPhysicalDeviceProperties2( - pUserData->physicalDevice, - static_cast(static_cast(p))); - - pUserData->supported = true; - while (p != nullptr) { - if (!pUserData->variant->property.pfnComparator(p)) { - pUserData->supported = false; - } - p = p->pNext; - } - } - ); - if (!userData.supported) { - supported_variant = false; - } - - for (uint32_t format_index = 0; format_index < userData.variant->formatCount && supported_variant; ++format_index) { - userData.index = format_index; - VkFormatProperties2KHR format_properties2{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR }; - userData.variant->chainers.pfnFormat( - static_cast(static_cast(&format_properties2)), &userData, - [](VkBaseOutStructure* p, void* pUser) { - UserData* pUserData = static_cast(pUser); - pUserData->gpdp2.pfnGetPhysicalDeviceFormatProperties2( - pUserData->physicalDevice, - pUserData->variant->pFormats[pUserData->index].format, - static_cast(static_cast(p))); - pUserData->supported = true; - while (p != nullptr) { - if (!pUserData->variant->pFormats[pUserData->index].pfnComparator(p)) { - pUserData->supported = false; - } - p = p->pNext; - } - } - ); - if (!userData.supported) { - supported_variant = false; - } - } - - memcpy(block.blockName, variant_desc.blockName, VP_MAX_PROFILE_NAME_SIZE * sizeof(char)); - if (supported_variant) { - supported_blocks.push_back(block); - supported_block = true; - break; - } else { - unsupported_blocks.push_back(block); - } - } - - if (!supported_block) { - supported_profile = false; - } - } - - if (!supported_profile) { - supported = false; - } - } - - const std::vector& blocks = supported ? supported_blocks : unsupported_blocks; - - if (pProperties == nullptr) { - *pPropertyCount = static_cast(blocks.size()); - } else { - if (*pPropertyCount < static_cast(blocks.size())) { - result = VK_INCOMPLETE; - } else { - *pPropertyCount = static_cast(blocks.size()); - } - for (uint32_t i = 0, n = static_cast(blocks.size()); i < n; ++i) { - pProperties[i] = blocks[i]; - } - } - - *pSupported = supported ? VK_TRUE : VK_FALSE; - return VK_SUCCESS; + const VpCapabilities_T &vp = VpCapabilities_T::Get(); +#endif // VP_USE_OBJECT + + VkResult result = VK_SUCCESS; + + uint32_t supported_device_extension_count = 0; + result = vp.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &supported_device_extension_count, nullptr); + if (result != VK_SUCCESS) + { + return result; + } + std::vector supported_device_extensions; + if (supported_device_extension_count > 0) + { + supported_device_extensions.resize(supported_device_extension_count); + } + result = vp.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &supported_device_extension_count, supported_device_extensions.data()); + if (result != VK_SUCCESS) + { + return result; + } + + // Workaround old loader bug where count could be smaller on the second call to vkEnumerateDeviceExtensionProperties + if (supported_device_extension_count > 0) + { + supported_device_extensions.resize(supported_device_extension_count); + } + + { + const detail::VpProfileDesc *pProfileDesc = detail::vpGetProfileDesc(pProfile->profileName); + if (pProfileDesc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + } + + struct GPDP2EntryPoints + { + PFN_vkGetPhysicalDeviceFeatures2KHR pfnGetPhysicalDeviceFeatures2; + PFN_vkGetPhysicalDeviceProperties2KHR pfnGetPhysicalDeviceProperties2; + PFN_vkGetPhysicalDeviceFormatProperties2KHR pfnGetPhysicalDeviceFormatProperties2; + PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR pfnGetPhysicalDeviceQueueFamilyProperties2; + }; + +#ifdef VK_KHR_video_queue + struct VideoInfo + { + PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR pfnGetPhysicalDeviceVideoCapabilitiesKHR; + PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR pfnGetPhysicalDeviceVideoFormatPropertiesKHR; + const detail::VpVideoProfileDesc *pProfileDesc; + VkVideoProfileInfoKHR profileInfo; + VkPhysicalDeviceVideoFormatInfoKHR formatInfo; + bool supportedProfile; + uint32_t matchingProfiles; + }; +#endif // VK_KHR_video_queue + + std::vector supported_blocks; + std::vector unsupported_blocks; + + struct UserData + { + VkPhysicalDevice physicalDevice; + std::vector &supported_blocks; + std::vector &unsupported_blocks; + const detail::VpVariantDesc *variant; + GPDP2EntryPoints gpdp2; +#ifdef VK_KHR_video_queue + VideoInfo video; +#endif // VK_KHR_video_queue + uint32_t index; + detail::PFN_vpStructChainerCb pfnCb; + bool supported; + } userData{physicalDevice, supported_blocks, unsupported_blocks}; + + if (!vp.singleton) + { + userData.gpdp2.pfnGetPhysicalDeviceFeatures2 = vp.GetPhysicalDeviceFeatures2; + userData.gpdp2.pfnGetPhysicalDeviceProperties2 = vp.GetPhysicalDeviceProperties2; + userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 = vp.GetPhysicalDeviceFormatProperties2; + userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 = vp.GetPhysicalDeviceQueueFamilyProperties2; + } + + // Attempt to load core versions of the GPDP2 entry points + if (userData.gpdp2.pfnGetPhysicalDeviceFeatures2 == nullptr) + { + userData.gpdp2.pfnGetPhysicalDeviceFeatures2 = + (PFN_vkGetPhysicalDeviceFeatures2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2"); + userData.gpdp2.pfnGetPhysicalDeviceProperties2 = + (PFN_vkGetPhysicalDeviceProperties2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2"); + userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 = + (PFN_vkGetPhysicalDeviceFormatProperties2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2"); + userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 = + (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2"); + } + + // If not successful, try to load KHR variant + if (userData.gpdp2.pfnGetPhysicalDeviceFeatures2 == nullptr) + { + userData.gpdp2.pfnGetPhysicalDeviceFeatures2 = + (PFN_vkGetPhysicalDeviceFeatures2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR"); + userData.gpdp2.pfnGetPhysicalDeviceProperties2 = + (PFN_vkGetPhysicalDeviceProperties2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR"); + userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 = + (PFN_vkGetPhysicalDeviceFormatProperties2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR"); + userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 = + (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR) vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"); + } + + if (userData.gpdp2.pfnGetPhysicalDeviceFeatures2 == nullptr || + userData.gpdp2.pfnGetPhysicalDeviceProperties2 == nullptr || + userData.gpdp2.pfnGetPhysicalDeviceFormatProperties2 == nullptr || + userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2 == nullptr) + { + return VK_ERROR_EXTENSION_NOT_PRESENT; + } + +#ifdef VK_KHR_video_queue + PFN_vkGetInstanceProcAddr gipa = vp.singleton ? vkGetInstanceProcAddr : vp.GetInstanceProcAddr; + userData.video.pfnGetPhysicalDeviceVideoCapabilitiesKHR = + (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR) gipa(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR"); + userData.video.pfnGetPhysicalDeviceVideoFormatPropertiesKHR = + (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR) gipa(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR"); +#endif // VK_KHR_video_queue + + bool supported = true; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const char *profile_name = gathered_profiles[profile_index].profileName; + + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(profile_name); + if (profile_desc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + bool supported_profile = true; + + if (profile_desc->props.specVersion < gathered_profiles[profile_index].specVersion) + { + VP_DEBUG_MSGF("Unsupported requested %s profile version: %u, profile supported at version %u", profile_name, profile_desc->props.specVersion, pProfile->specVersion); + supported_profile = false; + } + + VpBlockProperties block{gathered_profiles[profile_index], profile_desc->minApiVersion}; + + { + VkPhysicalDeviceProperties2KHR properties2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR}; + userData.gpdp2.pfnGetPhysicalDeviceProperties2(physicalDevice, &properties2); + if (!detail::vpCheckVersion(properties2.properties.apiVersion, profile_desc->minApiVersion)) + { + VP_DEBUG_MSGF("Unsupported API version: %u.%u.%u", VK_API_VERSION_MAJOR(profile_desc->minApiVersion), VK_API_VERSION_MINOR(profile_desc->minApiVersion), VK_API_VERSION_PATCH(profile_desc->minApiVersion)); + supported_profile = false; + } + } + + for (uint32_t required_capability_index = 0; required_capability_index < profile_desc->requiredCapabilityCount; ++required_capability_index) + { + const detail::VpCapabilitiesDesc *required_capabilities = &profile_desc->pRequiredCapabilities[required_capability_index]; + + bool supported_block = false; + + for (uint32_t variant_index = 0; variant_index < required_capabilities->variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant_desc = required_capabilities->pVariants[variant_index]; + + bool supported_variant = true; + + for (uint32_t ext_index = 0; ext_index < variant_desc.deviceExtensionCount; ++ext_index) + { + const char *requested_extension = variant_desc.pDeviceExtensions[ext_index].extensionName; + if (!detail::CheckExtension(supported_device_extensions.data(), supported_device_extensions.size(), requested_extension)) + { + supported_variant = false; + } + } + + userData.variant = &variant_desc; + + VkPhysicalDeviceFeatures2KHR features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR}; + userData.variant->chainers.pfnFeature( + static_cast(static_cast(&features)), &userData, + [](VkBaseOutStructure *p, void *pUser) { + UserData *pUserData = static_cast(pUser); + pUserData->gpdp2.pfnGetPhysicalDeviceFeatures2( + pUserData->physicalDevice, + static_cast(static_cast(p))); + + pUserData->supported = true; + while (p != nullptr) + { + if (!pUserData->variant->feature.pfnComparator(p)) + { + pUserData->supported = false; + } + p = p->pNext; + } + }); + if (!userData.supported) + { + supported_variant = false; + } + + VkPhysicalDeviceProperties2KHR device_properties2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR}; + userData.variant->chainers.pfnProperty( + static_cast(static_cast(&device_properties2)), &userData, + [](VkBaseOutStructure *p, void *pUser) { + UserData *pUserData = static_cast(pUser); + pUserData->gpdp2.pfnGetPhysicalDeviceProperties2( + pUserData->physicalDevice, + static_cast(static_cast(p))); + + pUserData->supported = true; + while (p != nullptr) + { + if (!pUserData->variant->property.pfnComparator(p)) + { + pUserData->supported = false; + } + p = p->pNext; + } + }); + if (!userData.supported) + { + supported_variant = false; + } + + if (userData.variant->queueFamilyCount > 0) + { + uint32_t queue_family_count = 0; + userData.gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queue_family_count, nullptr); + std::vector queueFamilyProps(queue_family_count, {VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR}); + userData.variant->chainers.pfnQueueFamily( + queue_family_count, static_cast(static_cast(queueFamilyProps.data())), &userData, + [](uint32_t queue_family_count, VkBaseOutStructure *pBaseArray, void *pUser) { + UserData *pUserData = static_cast(pUser); + VkQueueFamilyProperties2KHR *pArray = static_cast(static_cast(pBaseArray)); + pUserData->gpdp2.pfnGetPhysicalDeviceQueueFamilyProperties2(pUserData->physicalDevice, &queue_family_count, pArray); + pUserData->supported = true; + for (uint32_t profile_qf_idx = 0; profile_qf_idx < pUserData->variant->queueFamilyCount; ++profile_qf_idx) + { + bool found_matching = false; + for (uint32_t queue_family_index = 0; queue_family_index < queue_family_count; ++queue_family_index) + { + bool this_matches = true; + VkBaseOutStructure *p = static_cast(static_cast(&pArray[queue_family_index])); + while (p != nullptr) + { + if (!pUserData->variant->pQueueFamilies[profile_qf_idx].pfnComparator(p)) + { + this_matches = false; + } + p = p->pNext; + } + if (this_matches) + { + found_matching = true; + break; + } + } + if (!found_matching) + { + pUserData->supported = false; + break; + } + } + }); + if (!userData.supported) + { + supported_variant = false; + } + } + + for (uint32_t format_index = 0; format_index < userData.variant->formatCount && supported_variant; ++format_index) + { + userData.index = format_index; + VkFormatProperties2KHR format_properties2{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR}; + userData.variant->chainers.pfnFormat( + static_cast(static_cast(&format_properties2)), &userData, + [](VkBaseOutStructure *p, void *pUser) { + UserData *pUserData = static_cast(pUser); + pUserData->gpdp2.pfnGetPhysicalDeviceFormatProperties2( + pUserData->physicalDevice, + pUserData->variant->pFormats[pUserData->index].format, + static_cast(static_cast(p))); + pUserData->supported = true; + while (p != nullptr) + { + if (!pUserData->variant->pFormats[pUserData->index].pfnComparator(p)) + { + pUserData->supported = false; + } + p = p->pNext; + } + }); + if (!userData.supported) + { + supported_variant = false; + } + } + +#ifdef VK_KHR_video_queue + if (userData.variant->videoProfileCount > 0) + { + VkVideoProfileListInfoKHR profile_list{VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR}; + profile_list.profileCount = 1; + profile_list.pProfiles = &userData.video.profileInfo; + userData.video.formatInfo.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR; + userData.video.formatInfo.pNext = &profile_list; + + if (userData.video.pfnGetPhysicalDeviceVideoCapabilitiesKHR != nullptr && + userData.video.pfnGetPhysicalDeviceVideoFormatPropertiesKHR != nullptr) + { + for (uint32_t video_profile_index = 0; video_profile_index < userData.variant->videoProfileCount; ++video_profile_index) + { + userData.video.profileInfo = VkVideoProfileInfoKHR{VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR}; + userData.video.pProfileDesc = &userData.variant->pVideoProfiles[video_profile_index]; + userData.supported = true; + userData.video.matchingProfiles = 0; + + detail::vpForEachMatchingVideoProfiles(&userData.video.profileInfo, &userData, + [](VkBaseOutStructure *p, void *pUser) { + UserData *pUserData = static_cast(pUser); + while (p != nullptr) + { + if (!pUserData->video.pProfileDesc->info.pfnComparator(p)) + { + return; + } + p = p->pNext; + } + + pUserData->video.supportedProfile = true; + + VkVideoCapabilitiesKHR capabilities{VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR}; + pUserData->video.pProfileDesc->chainers.pfnCapability( + static_cast(static_cast(&capabilities)), pUserData, + [](VkBaseOutStructure *p, void *pUser) { + UserData *pUserData = static_cast(pUser); + VkResult result = pUserData->video.pfnGetPhysicalDeviceVideoCapabilitiesKHR( + pUserData->physicalDevice, + &pUserData->video.profileInfo, + static_cast(static_cast(p))); + if (result != VK_SUCCESS) + { + pUserData->video.supportedProfile = false; + return; + } + while (p != nullptr) + { + if (!pUserData->video.pProfileDesc->capability.pfnComparator(p)) + { + pUserData->supported = false; + } + p = p->pNext; + } + }); + + if (pUserData->video.supportedProfile) + { + pUserData->video.matchingProfiles++; + } + else + { + return; + } + + std::vector format_props; + for (uint32_t format_index = 0; format_index < pUserData->video.pProfileDesc->formatCount; ++format_index) + { + pUserData->index = format_index; + { + VkVideoFormatPropertiesKHR tmp_props{VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR}; + pUserData->video.pProfileDesc->pFormats[format_index].pfnFiller(static_cast(static_cast(&tmp_props))); + pUserData->video.formatInfo.imageUsage = tmp_props.imageUsageFlags; + } + + uint32_t format_count = 0; + pUserData->video.pfnGetPhysicalDeviceVideoFormatPropertiesKHR(pUserData->physicalDevice, &pUserData->video.formatInfo, &format_count, nullptr); + format_props.resize(format_count, {VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR}); + pUserData->video.pProfileDesc->chainers.pfnFormat( + format_count, static_cast(static_cast(format_props.data())), pUserData, + [](uint32_t format_count, VkBaseOutStructure *pBaseArray, void *pUser) { + UserData *pUserData = static_cast(pUser); + VkVideoFormatPropertiesKHR *pArray = static_cast(static_cast(pBaseArray)); + pUserData->video.pfnGetPhysicalDeviceVideoFormatPropertiesKHR(pUserData->physicalDevice, &pUserData->video.formatInfo, &format_count, pArray); + bool found_matching = false; + for (uint32_t i = 0; i < format_count; ++i) + { + bool this_matches = true; + VkBaseOutStructure *p = static_cast(static_cast(&pArray[i])); + while (p != nullptr) + { + if (!pUserData->video.pProfileDesc->pFormats[pUserData->index].pfnComparator(p)) + { + this_matches = false; + } + p = p->pNext; + } + if (this_matches) + { + found_matching = true; + break; + } + } + if (!found_matching) + { + pUserData->supported = false; + } + }); + } + }); + if (!userData.supported || userData.video.matchingProfiles == 0) + { + supported_variant = false; + } + } + } + else + { + supported_variant = false; + } + } +#endif // VK_KHR_video_queue + + memcpy(block.blockName, variant_desc.blockName, VP_MAX_PROFILE_NAME_SIZE * sizeof(char)); + if (supported_variant) + { + supported_blocks.push_back(block); + supported_block = true; + break; + } + else + { + unsupported_blocks.push_back(block); + } + } + + if (!supported_block) + { + supported_profile = false; + } + } + + if (!supported_profile) + { + supported = false; + } + } + + const std::vector &blocks = supported ? supported_blocks : unsupported_blocks; + + if (pProperties == nullptr) + { + *pPropertyCount = static_cast(blocks.size()); + } + else + { + if (*pPropertyCount < static_cast(blocks.size())) + { + result = VK_INCOMPLETE; + } + else + { + *pPropertyCount = static_cast(blocks.size()); + } + for (uint32_t i = 0, n = static_cast(blocks.size()); i < n; ++i) + { + pProperties[i] = blocks[i]; + } + } + + *pSupported = supported ? VK_TRUE : VK_FALSE; + return VK_SUCCESS; } VPAPI_ATTR VkResult vpGetPhysicalDeviceProfileSupport( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - VkInstance instance, - VkPhysicalDevice physicalDevice, - const VpProfileProperties* pProfile, - VkBool32 *pSupported) { - uint32_t count = 0; - - return vpGetPhysicalDeviceProfileVariantsSupport( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + VkInstance instance, + VkPhysicalDevice physicalDevice, + const VpProfileProperties *pProfile, + VkBool32 *pSupported) +{ + uint32_t count = 0; + + return vpGetPhysicalDeviceProfileVariantsSupport( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - instance, physicalDevice, pProfile, pSupported, &count, nullptr); + capabilities, +#endif // VP_USE_OBJECT + instance, physicalDevice, pProfile, pSupported, &count, nullptr); } VPAPI_ATTR VkResult vpCreateDevice( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - VkPhysicalDevice physicalDevice, - const VpDeviceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkDevice* pDevice) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + VkPhysicalDevice physicalDevice, + const VpDeviceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDevice *pDevice) +{ #ifdef VP_USE_OBJECT - const VpCapabilities_T& vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; + const VpCapabilities_T &vp = capabilities == nullptr ? VpCapabilities_T::Get() : *capabilities; #else - const VpCapabilities_T& vp = VpCapabilities_T::Get(); -#endif//VP_USE_OBJECT - - if (physicalDevice == VK_NULL_HANDLE || pCreateInfo == nullptr || pDevice == nullptr) { - return vp.CreateDevice(physicalDevice, pCreateInfo == nullptr ? nullptr : pCreateInfo->pCreateInfo, pAllocator, pDevice); - } - - const std::vector& blocks = detail::GatherBlocks( - pCreateInfo->enabledFullProfileCount, pCreateInfo->pEnabledFullProfiles, - pCreateInfo->enabledProfileBlockCount, pCreateInfo->pEnabledProfileBlocks); - - std::unique_ptr chain = std::make_unique(); - std::vector structureTypes; - - std::vector extensions; - for (std::uint32_t ext_index = 0, ext_count = pCreateInfo->pCreateInfo->enabledExtensionCount; ext_index < ext_count; ++ext_index) { - extensions.push_back(pCreateInfo->pCreateInfo->ppEnabledExtensionNames[ext_index]); - } - - for (std::size_t block_index = 0, block_count = blocks.size(); block_index < block_count; ++block_index) { - const detail::VpProfileDesc* pProfileDesc = detail::vpGetProfileDesc(blocks[block_index].profiles.profileName); - if (pProfileDesc == nullptr) return VK_ERROR_UNKNOWN; - - for (std::size_t caps_index = 0, caps_count = pProfileDesc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) { - const detail::VpCapabilitiesDesc* pCapsDesc = &pProfileDesc->pRequiredCapabilities[caps_index]; - - for (std::size_t variant_index = 0, variant_count = pCapsDesc->variantCount; variant_index < variant_count; ++variant_index) { - const detail::VpVariantDesc* variant = &pCapsDesc->pVariants[variant_index]; - - if (strcmp(blocks[block_index].blockName, "") != 0) { - if (strcmp(variant->blockName, blocks[block_index].blockName) != 0) { - continue; - } - } - - for (uint32_t type_index = 0; type_index < variant->featureStructTypeCount; ++type_index) { - const VkStructureType type = variant->pFeatureStructTypes[type_index]; - if (std::find(structureTypes.begin(), structureTypes.end(), type) == std::end(structureTypes)) { - structureTypes.push_back(type); - } - } - - detail::GetExtensions(variant->deviceExtensionCount, variant->pDeviceExtensions, extensions); - } - } - } - - VkBaseOutStructure* pNext = static_cast(const_cast(pCreateInfo->pCreateInfo->pNext)); - detail::GatherStructureTypes(structureTypes, pNext); - - chain->Build(structureTypes); - - VkPhysicalDeviceFeatures2KHR* pFeatures = &chain->requiredFeaturesChain; - if (pCreateInfo->pCreateInfo->pEnabledFeatures) { - pFeatures->features = *pCreateInfo->pCreateInfo->pEnabledFeatures; - } - - for (std::size_t block_index = 0, block_count = blocks.size(); block_index < block_count; ++block_index) { - const detail::VpProfileDesc* pProfileDesc = detail::vpGetProfileDesc(blocks[block_index].profiles.profileName); - if (pProfileDesc == nullptr) { - return VK_ERROR_UNKNOWN; - } - - for (std::size_t caps_index = 0, caps_count = pProfileDesc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) { - const detail::VpCapabilitiesDesc* pCapsDesc = &pProfileDesc->pRequiredCapabilities[caps_index]; - - for (std::size_t variant_index = 0, variant_count = pCapsDesc->variantCount; variant_index < variant_count; ++variant_index) { - const detail::VpVariantDesc* variant = &pCapsDesc->pVariants[variant_index]; - - VkBaseOutStructure* base_ptr = reinterpret_cast(pFeatures); - if (variant->feature.pfnFiller != nullptr) { - while (base_ptr != nullptr) { - variant->feature.pfnFiller(base_ptr); - base_ptr = base_ptr->pNext; - } - } - } - } - } - - chain->ApplyFeatures(pCreateInfo); - - if (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT) { - pFeatures->features.robustBufferAccess = VK_FALSE; - } - - VkDeviceCreateInfo createInfo{VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO}; - createInfo.pNext = &chain->requiredFeaturesChain; - createInfo.queueCreateInfoCount = pCreateInfo->pCreateInfo->queueCreateInfoCount; - createInfo.pQueueCreateInfos = pCreateInfo->pCreateInfo->pQueueCreateInfos; - createInfo.enabledExtensionCount = static_cast(extensions.size()); - createInfo.ppEnabledExtensionNames = extensions.data(); - - return vp.CreateDevice(physicalDevice, &createInfo, pAllocator, pDevice); + const VpCapabilities_T &vp = VpCapabilities_T::Get(); +#endif // VP_USE_OBJECT + + if (physicalDevice == VK_NULL_HANDLE || pCreateInfo == nullptr || pDevice == nullptr) + { + return vp.CreateDevice(physicalDevice, pCreateInfo == nullptr ? nullptr : pCreateInfo->pCreateInfo, pAllocator, pDevice); + } + + const std::vector &blocks = detail::GatherBlocks( + pCreateInfo->enabledFullProfileCount, pCreateInfo->pEnabledFullProfiles, + pCreateInfo->enabledProfileBlockCount, pCreateInfo->pEnabledProfileBlocks); + + std::unique_ptr chain = std::make_unique(); + std::vector structureTypes; + + std::vector extensions; + for (std::uint32_t ext_index = 0, ext_count = pCreateInfo->pCreateInfo->enabledExtensionCount; ext_index < ext_count; ++ext_index) + { + extensions.push_back(pCreateInfo->pCreateInfo->ppEnabledExtensionNames[ext_index]); + } + + for (std::size_t block_index = 0, block_count = blocks.size(); block_index < block_count; ++block_index) + { + const detail::VpProfileDesc *pProfileDesc = detail::vpGetProfileDesc(blocks[block_index].profiles.profileName); + if (pProfileDesc == nullptr) + return VK_ERROR_UNKNOWN; + + for (std::size_t caps_index = 0, caps_count = pProfileDesc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) + { + const detail::VpCapabilitiesDesc *pCapsDesc = &pProfileDesc->pRequiredCapabilities[caps_index]; + + for (std::size_t variant_index = 0, variant_count = pCapsDesc->variantCount; variant_index < variant_count; ++variant_index) + { + const detail::VpVariantDesc *variant = &pCapsDesc->pVariants[variant_index]; + + if (strcmp(blocks[block_index].blockName, "") != 0) + { + if (strcmp(variant->blockName, blocks[block_index].blockName) != 0) + { + continue; + } + } + + for (uint32_t type_index = 0; type_index < variant->featureStructTypeCount; ++type_index) + { + const VkStructureType type = variant->pFeatureStructTypes[type_index]; + if (std::find(structureTypes.begin(), structureTypes.end(), type) == std::end(structureTypes)) + { + structureTypes.push_back(type); + } + } + + detail::GetExtensions(variant->deviceExtensionCount, variant->pDeviceExtensions, extensions); + } + } + } + + VkBaseOutStructure *pNext = static_cast(const_cast(pCreateInfo->pCreateInfo->pNext)); + detail::GatherStructureTypes(structureTypes, pNext); + + chain->Build(structureTypes); + + VkPhysicalDeviceFeatures2KHR *pFeatures = &chain->requiredFeaturesChain; + if (pCreateInfo->pCreateInfo->pEnabledFeatures) + { + pFeatures->features = *pCreateInfo->pCreateInfo->pEnabledFeatures; + } + + for (std::size_t block_index = 0, block_count = blocks.size(); block_index < block_count; ++block_index) + { + const detail::VpProfileDesc *pProfileDesc = detail::vpGetProfileDesc(blocks[block_index].profiles.profileName); + if (pProfileDesc == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + for (std::size_t caps_index = 0, caps_count = pProfileDesc->requiredCapabilityCount; caps_index < caps_count; ++caps_index) + { + const detail::VpCapabilitiesDesc *pCapsDesc = &pProfileDesc->pRequiredCapabilities[caps_index]; + + for (std::size_t variant_index = 0, variant_count = pCapsDesc->variantCount; variant_index < variant_count; ++variant_index) + { + const detail::VpVariantDesc *variant = &pCapsDesc->pVariants[variant_index]; + + VkBaseOutStructure *base_ptr = reinterpret_cast(pFeatures); + if (variant->feature.pfnFiller != nullptr) + { + while (base_ptr != nullptr) + { + variant->feature.pfnFiller(base_ptr); + base_ptr = base_ptr->pNext; + } + } + } + } + } + + chain->ApplyFeatures(pCreateInfo); + + if (pCreateInfo->flags & VP_DEVICE_CREATE_DISABLE_ROBUST_BUFFER_ACCESS_BIT) + { + pFeatures->features.robustBufferAccess = VK_FALSE; + } + + VkDeviceCreateInfo createInfo{VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO}; + createInfo.pNext = &chain->requiredFeaturesChain; + createInfo.queueCreateInfoCount = pCreateInfo->pCreateInfo->queueCreateInfoCount; + createInfo.pQueueCreateInfos = pCreateInfo->pCreateInfo->pQueueCreateInfos; + createInfo.enabledExtensionCount = static_cast(extensions.size()); + createInfo.ppEnabledExtensionNames = extensions.data(); + + return vp.CreateDevice(physicalDevice, &createInfo, pAllocator, pDevice); } VPAPI_ATTR VkResult vpGetProfileInstanceExtensionProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties) { - return detail::vpGetProfileExtensionProperties( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties) +{ + return detail::vpGetProfileExtensionProperties( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pProfile, pBlockName, detail::EXTENSION_INSTANCE, pPropertyCount, pProperties); + capabilities, +#endif // VP_USE_OBJECT + pProfile, pBlockName, detail::EXTENSION_INSTANCE, pPropertyCount, pProperties); } VPAPI_ATTR VkResult vpGetProfileDeviceExtensionProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pPropertyCount, - VkExtensionProperties* pProperties) { - return detail::vpGetProfileExtensionProperties( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties) +{ + return detail::vpGetProfileExtensionProperties( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pProfile, pBlockName, detail::EXTENSION_DEVICE, pPropertyCount, pProperties); + capabilities, +#endif // VP_USE_OBJECT + pProfile, pBlockName, detail::EXTENSION_DEVICE, pPropertyCount, pProperties); } VPAPI_ATTR VkResult vpGetProfileFeatures( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - void* pNext) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + void *pNext) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (profile_desc == nullptr) return VK_ERROR_UNKNOWN; - - for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) { - const detail::VpCapabilitiesDesc& cap_desc = profile_desc->pRequiredCapabilities[capability_index]; - - for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) { - const detail::VpVariantDesc& variant = cap_desc.pVariants[variant_index]; - if (pBlockName != nullptr) { - if (strcmp(variant.blockName, pBlockName) != 0) { - continue; - } - result = VK_SUCCESS; - } - - if (variant.feature.pfnFiller == nullptr) continue; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + if (variant.feature.pfnFiller == nullptr) + continue; + + VkBaseOutStructure *p = static_cast(pNext); + while (p != nullptr) + { + variant.feature.pfnFiller(p); + p = p->pNext; + } + } + } + } + + return result; +} - VkBaseOutStructure* p = static_cast(pNext); - while (p != nullptr) { - variant.feature.pfnFiller(p); - p = p->pNext; - } - } - } - } +VPAPI_ATTR VkResult vpGetProfileProperties( +#ifdef VP_USE_OBJECT + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + void *pNext) +{ + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - return result; + VkBool32 multiple_variants = VK_FALSE; + if (vpHasMultipleVariantsProfile( +#ifdef VP_USE_OBJECT + capabilities, +#endif // VP_USE_OBJECT + pProfile, + &multiple_variants) == VK_ERROR_UNKNOWN) + { + return VK_ERROR_UNKNOWN; + } + if (multiple_variants == VK_TRUE && pBlockName == nullptr) + { + return VK_ERROR_UNKNOWN; + } + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + if (variant.property.pfnFiller == nullptr) + continue; + + VkBaseOutStructure *p = static_cast(pNext); + while (p != nullptr) + { + variant.property.pfnFiller(p); + p = p->pNext; + } + } + } + } + + return result; } -VPAPI_ATTR VkResult vpGetProfileProperties( +VPAPI_ATTR VkResult vpGetProfileQueueFamilyProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - void* pNext) { - VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - - VkBool32 multiple_variants = VK_FALSE; - if (vpHasMultipleVariantsProfile( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pPropertyCount, + VkQueueFamilyProperties2KHR *pProperties) +{ #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pProfile, - &multiple_variants) == VK_ERROR_UNKNOWN) { - return VK_ERROR_UNKNOWN; - } - if (multiple_variants == VK_TRUE && pBlockName == nullptr) { - return VK_ERROR_UNKNOWN; - } - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (profile_desc == nullptr) return VK_ERROR_UNKNOWN; - - for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) { - const detail::VpCapabilitiesDesc& cap_desc = profile_desc->pRequiredCapabilities[capability_index]; - - for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) { - const detail::VpVariantDesc& variant = cap_desc.pVariants[variant_index]; - if (pBlockName != nullptr) { - if (strcmp(variant.blockName, pBlockName) != 0) { - continue; - } - result = VK_SUCCESS; - } - - if (variant.property.pfnFiller == nullptr) continue; - - VkBaseOutStructure* p = static_cast(pNext); - while (p != nullptr) { - variant.property.pfnFiller(p); - p = p->pNext; - } - } - } - } - - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + if (pPropertyCount == nullptr) + return VK_ERROR_UNKNOWN; + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + uint32_t total_queue_family_count = 0; + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + if (pProperties != nullptr) + { + for (uint32_t i = 0; i < variant.queueFamilyCount; ++i) + { + if (total_queue_family_count < *pPropertyCount) + { + if (variant.pQueueFamilies[i].pfnFiller == nullptr) + continue; + + VkBaseOutStructure *p = reinterpret_cast(pProperties); + while (p != nullptr) + { + variant.pQueueFamilies[i].pfnFiller(p); + p = p->pNext; + } + + total_queue_family_count++; + pProperties++; + } + else + { + result = VK_INCOMPLETE; + break; + } + } + } + else + { + total_queue_family_count += variant.queueFamilyCount; + } + } + } + } + + *pPropertyCount = total_queue_family_count; + return result; } VPAPI_ATTR VkResult vpGetProfileFormats( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pFormatCount, - VkFormat* pFormats) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pFormatCount, + VkFormat *pFormats) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - - std::vector results; - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const detail::VpProfileDesc* profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); - if (profile_desc == nullptr) return VK_ERROR_UNKNOWN; - - for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) { - const detail::VpCapabilitiesDesc& cap_desc = profile_desc->pRequiredCapabilities[capability_index]; - - for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) { - const detail::VpVariantDesc& variant = cap_desc.pVariants[variant_index]; - if (pBlockName != nullptr) { - if (strcmp(variant.blockName, pBlockName) != 0) { - continue; - } - result = VK_SUCCESS; - } - - for (uint32_t format_index = 0; format_index < variant.formatCount; ++format_index) { - if (std::find(results.begin(), results.end(), variant.pFormats[format_index].format) == std::end(results)) { - results.push_back(variant.pFormats[format_index].format); - } - } - } - } - } - - const uint32_t count = static_cast(results.size()); - - if (pFormats == nullptr) { - *pFormatCount = count; - } else { - if (*pFormatCount < count) { - result = VK_INCOMPLETE; - } else { - *pFormatCount = count; - } - - if (*pFormatCount > 0) { - memcpy(pFormats, &results[0], *pFormatCount * sizeof(VkFormat)); - } - } - return result; + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + std::vector results; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + for (uint32_t format_index = 0; format_index < variant.formatCount; ++format_index) + { + if (std::find(results.begin(), results.end(), variant.pFormats[format_index].format) == std::end(results)) + { + results.push_back(variant.pFormats[format_index].format); + } + } + } + } + } + + const uint32_t count = static_cast(results.size()); + + if (pFormats == nullptr) + { + *pFormatCount = count; + } + else + { + if (*pFormatCount < count) + { + result = VK_INCOMPLETE; + } + else + { + *pFormatCount = count; + } + + if (*pFormatCount > 0) + { + memcpy(pFormats, &results[0], *pFormatCount * sizeof(VkFormat)); + } + } + return result; } VPAPI_ATTR VkResult vpGetProfileFormatProperties( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - VkFormat format, - void* pNext) { + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + VkFormat format, + void *pNext) +{ #ifdef VP_USE_OBJECT - (void)capabilities; -#endif//VP_USE_OBJECT - - VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; - - const std::vector& gathered_profiles = detail::GatherProfiles(*pProfile); - - for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) { - const char* profile_name = gathered_profiles[profile_index].profileName; - - const detail::VpProfileDesc* pProfileDesc = detail::vpGetProfileDesc(profile_name); - if (pProfileDesc == nullptr) return VK_ERROR_UNKNOWN; - - for (uint32_t required_capability_index = 0; required_capability_index < pProfileDesc->requiredCapabilityCount; - ++required_capability_index) { - const detail::VpCapabilitiesDesc& required_capabilities = pProfileDesc->pRequiredCapabilities[required_capability_index]; - - for (uint32_t required_variant_index = 0; required_variant_index < required_capabilities.variantCount; ++required_variant_index) { - const detail::VpVariantDesc& variant = required_capabilities.pVariants[required_variant_index]; - if (pBlockName != nullptr) { - if (strcmp(variant.blockName, pBlockName) != 0) { - continue; - } - result = VK_SUCCESS; - } - - for (uint32_t format_index = 0; format_index < variant.formatCount; ++format_index) { - if (variant.pFormats[format_index].format != format) { - continue; - } - - VkBaseOutStructure* base_ptr = static_cast(static_cast(pNext)); - while (base_ptr != nullptr) { - variant.pFormats[format_index].pfnFiller(base_ptr); - base_ptr = base_ptr->pNext; - } + (void) capabilities; +#endif // VP_USE_OBJECT + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const char *profile_name = gathered_profiles[profile_index].profileName; + + const detail::VpProfileDesc *pProfileDesc = detail::vpGetProfileDesc(profile_name); + if (pProfileDesc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t required_capability_index = 0; required_capability_index < pProfileDesc->requiredCapabilityCount; + ++required_capability_index) + { + const detail::VpCapabilitiesDesc &required_capabilities = pProfileDesc->pRequiredCapabilities[required_capability_index]; + + for (uint32_t required_variant_index = 0; required_variant_index < required_capabilities.variantCount; ++required_variant_index) + { + const detail::VpVariantDesc &variant = required_capabilities.pVariants[required_variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + for (uint32_t format_index = 0; format_index < variant.formatCount; ++format_index) + { + if (variant.pFormats[format_index].format != format) + { + continue; + } + + VkBaseOutStructure *base_ptr = static_cast(static_cast(pNext)); + while (base_ptr != nullptr) + { + variant.pFormats[format_index].pfnFiller(base_ptr); + base_ptr = base_ptr->pNext; + } #if defined(VK_VERSION_1_3) || defined(VK_KHR_format_feature_flags2) - VkFormatProperties2KHR* fp2 = static_cast( - detail::vpGetStructure(pNext, VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR)); - VkFormatProperties3KHR* fp3 = static_cast( - detail::vpGetStructure(pNext, VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR)); - if (fp3 != nullptr) { - VkFormatProperties2KHR fp{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR }; - variant.pFormats[format_index].pfnFiller(static_cast(static_cast(&fp))); - fp3->linearTilingFeatures |= static_cast(fp3->linearTilingFeatures | fp.formatProperties.linearTilingFeatures); - fp3->optimalTilingFeatures |= static_cast(fp3->optimalTilingFeatures | fp.formatProperties.optimalTilingFeatures); - fp3->bufferFeatures |= static_cast(fp3->bufferFeatures | fp.formatProperties.bufferFeatures); - } - if (fp2 != nullptr) { - VkFormatProperties3KHR fp{ VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR }; - variant.pFormats[format_index].pfnFiller(static_cast(static_cast(&fp))); - fp2->formatProperties.linearTilingFeatures |= static_cast(fp2->formatProperties.linearTilingFeatures | fp.linearTilingFeatures); - fp2->formatProperties.optimalTilingFeatures |= static_cast(fp2->formatProperties.optimalTilingFeatures | fp.optimalTilingFeatures); - fp2->formatProperties.bufferFeatures |= static_cast(fp2->formatProperties.bufferFeatures | fp.bufferFeatures); - } + VkFormatProperties2KHR *fp2 = static_cast( + detail::vpGetStructure(pNext, VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR)); + VkFormatProperties3KHR *fp3 = static_cast( + detail::vpGetStructure(pNext, VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR)); + if (fp3 != nullptr) + { + VkFormatProperties2KHR fp{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR}; + variant.pFormats[format_index].pfnFiller(static_cast(static_cast(&fp))); + fp3->linearTilingFeatures |= static_cast(fp3->linearTilingFeatures | fp.formatProperties.linearTilingFeatures); + fp3->optimalTilingFeatures |= static_cast(fp3->optimalTilingFeatures | fp.formatProperties.optimalTilingFeatures); + fp3->bufferFeatures |= static_cast(fp3->bufferFeatures | fp.formatProperties.bufferFeatures); + } + if (fp2 != nullptr) + { + VkFormatProperties3KHR fp{VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR}; + variant.pFormats[format_index].pfnFiller(static_cast(static_cast(&fp))); + fp2->formatProperties.linearTilingFeatures |= static_cast(fp2->formatProperties.linearTilingFeatures | fp.linearTilingFeatures); + fp2->formatProperties.optimalTilingFeatures |= static_cast(fp2->formatProperties.optimalTilingFeatures | fp.optimalTilingFeatures); + fp2->formatProperties.bufferFeatures |= static_cast(fp2->formatProperties.bufferFeatures | fp.bufferFeatures); + } #endif - } - } - } - } + } + } + } + } - return result; + return result; } VPAPI_ATTR VkResult vpGetProfileFeatureStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes) { - return detail::vpGetProfileStructureTypes( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ + return detail::vpGetProfileStructureTypes( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pProfile, pBlockName, detail::STRUCTURE_FEATURE, pStructureTypeCount, pStructureTypes); + capabilities, +#endif // VP_USE_OBJECT + pProfile, pBlockName, detail::STRUCTURE_FEATURE, pStructureTypeCount, pStructureTypes); } VPAPI_ATTR VkResult vpGetProfilePropertyStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes) { - return detail::vpGetProfileStructureTypes( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ + return detail::vpGetProfileStructureTypes( +#ifdef VP_USE_OBJECT + capabilities, +#endif // VP_USE_OBJECT + pProfile, pBlockName, detail::STRUCTURE_PROPERTY, pStructureTypeCount, pStructureTypes); +} + +VPAPI_ATTR VkResult vpGetProfileQueueFamilyStructureTypes( +#ifdef VP_USE_OBJECT + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ + return detail::vpGetProfileStructureTypes( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pProfile, pBlockName, detail::STRUCTURE_PROPERTY, pStructureTypeCount, pStructureTypes); + capabilities, +#endif // VP_USE_OBJECT + pProfile, pBlockName, detail::STRUCTURE_QUEUE_FAMILY, pStructureTypeCount, pStructureTypes); } VPAPI_ATTR VkResult vpGetProfileFormatStructureTypes( #ifdef VP_USE_OBJECT - VpCapabilities capabilities, -#endif//VP_USE_OBJECT - const VpProfileProperties* pProfile, - const char* pBlockName, - uint32_t* pStructureTypeCount, - VkStructureType* pStructureTypes) { - return detail::vpGetProfileStructureTypes( + VpCapabilities capabilities, +#endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ + return detail::vpGetProfileStructureTypes( #ifdef VP_USE_OBJECT - capabilities, -#endif//VP_USE_OBJECT - pProfile, pBlockName, detail::STRUCTURE_FORMAT, pStructureTypeCount, pStructureTypes); + capabilities, +#endif // VP_USE_OBJECT + pProfile, pBlockName, detail::STRUCTURE_FORMAT, pStructureTypeCount, pStructureTypes); +} + +#ifdef VK_KHR_video_queue +// Query the list of video profiles specified by the profile +VPAPI_ATTR VkResult vpGetProfileVideoProfiles( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t *pVideoProfileCount, + VpVideoProfileProperties *pVideoProfiles) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + if (pVideoProfileCount == nullptr) + return VK_ERROR_UNKNOWN; + + VkResult result = pBlockName == nullptr ? VK_SUCCESS : VK_INCOMPLETE; + + uint32_t total_video_profile_count = 0; + + const std::vector &gathered_profiles = detail::GatherProfiles(*pProfile); + + for (std::size_t profile_index = 0, profile_count = gathered_profiles.size(); profile_index < profile_count; ++profile_index) + { + const detail::VpProfileDesc *profile_desc = detail::vpGetProfileDesc(gathered_profiles[profile_index].profileName); + if (profile_desc == nullptr) + return VK_ERROR_UNKNOWN; + + for (uint32_t capability_index = 0; capability_index < profile_desc->requiredCapabilityCount; ++capability_index) + { + const detail::VpCapabilitiesDesc &cap_desc = profile_desc->pRequiredCapabilities[capability_index]; + + for (uint32_t variant_index = 0; variant_index < cap_desc.variantCount; ++variant_index) + { + const detail::VpVariantDesc &variant = cap_desc.pVariants[variant_index]; + if (pBlockName != nullptr) + { + if (strcmp(variant.blockName, pBlockName) != 0) + { + continue; + } + result = VK_SUCCESS; + } + + if (pVideoProfiles != nullptr) + { + for (uint32_t i = 0; i < variant.videoProfileCount; ++i) + { + if (total_video_profile_count < *pVideoProfileCount) + { + *pVideoProfiles = variant.pVideoProfiles[i].properties; + total_video_profile_count++; + pVideoProfiles++; + } + else + { + result = VK_INCOMPLETE; + break; + } + } + } + else + { + total_video_profile_count += variant.videoProfileCount; + } + } + } + } + + *pVideoProfileCount = total_video_profile_count; + return result; +} + +VPAPI_ATTR VkResult vpGetProfileVideoProfileInfo( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + VkVideoProfileInfoKHR *pVideoProfileInfo) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + + const detail::VpVideoProfileDesc *pVideoProfileDesc = nullptr; + VkResult result = detail::vpGetProfileVideoProfileDesc(pProfile, pBlockName, videoProfileIndex, &pVideoProfileDesc); + + if (pVideoProfileDesc != nullptr) + { + VkBaseOutStructure *p = reinterpret_cast(pVideoProfileInfo); + while (p != nullptr) + { + pVideoProfileDesc->info.pfnFiller(p); + p = p->pNext; + } + } + + return result; +} + +VPAPI_ATTR VkResult vpGetProfileVideoCapabilities( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + void *pNext) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + + const detail::VpVideoProfileDesc *pVideoProfileDesc = nullptr; + VkResult result = detail::vpGetProfileVideoProfileDesc(pProfile, pBlockName, videoProfileIndex, &pVideoProfileDesc); + + if (pVideoProfileDesc != nullptr) + { + VkBaseOutStructure *p = reinterpret_cast(pNext); + while (p != nullptr) + { + pVideoProfileDesc->capability.pfnFiller(p); + p = p->pNext; + } + } + + return result; +} + +VPAPI_ATTR VkResult vpGetProfileVideoFormatProperties( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pPropertyCount, + VkVideoFormatPropertiesKHR *pProperties) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + + const detail::VpVideoProfileDesc *pVideoProfileDesc = nullptr; + VkResult result = detail::vpGetProfileVideoProfileDesc(pProfile, pBlockName, videoProfileIndex, &pVideoProfileDesc); + + uint32_t property_count = 0; + if (pVideoProfileDesc != nullptr) + { + if (pProperties != nullptr) + { + for (; property_count < pVideoProfileDesc->formatCount; ++property_count) + { + if (property_count < *pPropertyCount) + { + VkBaseOutStructure *p = reinterpret_cast(&pProperties[property_count]); + while (p != nullptr) + { + pVideoProfileDesc->pFormats[property_count].pfnFiller(p); + p = p->pNext; + } + } + else + { + result = VK_INCOMPLETE; + break; + } + } + } + else + { + property_count = pVideoProfileDesc->formatCount; + } + } + + *pPropertyCount = property_count; + return result; +} + +VPAPI_ATTR VkResult vpGetProfileVideoProfileInfoStructureTypes( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + + const detail::VpVideoProfileDesc *pVideoProfileDesc = nullptr; + VkResult result = detail::vpGetProfileVideoProfileDesc(pProfile, pBlockName, videoProfileIndex, &pVideoProfileDesc); + + if (pVideoProfileDesc != nullptr) + { + if (pStructureTypes != nullptr) + { + if (*pStructureTypeCount < pVideoProfileDesc->infoStructTypeCount) + { + result = VK_INCOMPLETE; + } + else + { + *pStructureTypeCount = pVideoProfileDesc->infoStructTypeCount; + } + if (*pStructureTypeCount > 0) + { + memcpy(pStructureTypes, pVideoProfileDesc->pInfoStructTypes, *pStructureTypeCount * sizeof(VkStructureType)); + } + } + else + { + *pStructureTypeCount = pVideoProfileDesc->infoStructTypeCount; + } + } + + return result; +} + +VPAPI_ATTR VkResult vpGetProfileVideoCapabilityStructureTypes( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + + const detail::VpVideoProfileDesc *pVideoProfileDesc = nullptr; + VkResult result = detail::vpGetProfileVideoProfileDesc(pProfile, pBlockName, videoProfileIndex, &pVideoProfileDesc); + + if (pVideoProfileDesc != nullptr) + { + if (pStructureTypes != nullptr) + { + if (*pStructureTypeCount < pVideoProfileDesc->capabilityStructTypeCount) + { + result = VK_INCOMPLETE; + } + else + { + *pStructureTypeCount = pVideoProfileDesc->capabilityStructTypeCount; + } + if (*pStructureTypeCount > 0) + { + memcpy(pStructureTypes, pVideoProfileDesc->pCapabilityStructTypes, *pStructureTypeCount * sizeof(VkStructureType)); + } + } + else + { + *pStructureTypeCount = pVideoProfileDesc->capabilityStructTypeCount; + } + } + + return result; +} + +VPAPI_ATTR VkResult vpGetProfileVideoFormatStructureTypes( +# ifdef VP_USE_OBJECT + VpCapabilities capabilities, +# endif // VP_USE_OBJECT + const VpProfileProperties *pProfile, + const char *pBlockName, + uint32_t videoProfileIndex, + uint32_t *pStructureTypeCount, + VkStructureType *pStructureTypes) +{ +# ifdef VP_USE_OBJECT + (void) capabilities; +# endif // VP_USE_OBJECT + + const detail::VpVideoProfileDesc *pVideoProfileDesc = nullptr; + VkResult result = detail::vpGetProfileVideoProfileDesc(pProfile, pBlockName, videoProfileIndex, &pVideoProfileDesc); + + if (pVideoProfileDesc != nullptr) + { + if (pStructureTypes != nullptr) + { + if (*pStructureTypeCount < pVideoProfileDesc->formatStructTypeCount) + { + result = VK_INCOMPLETE; + } + else + { + *pStructureTypeCount = pVideoProfileDesc->formatStructTypeCount; + } + if (*pStructureTypeCount > 0) + { + memcpy(pStructureTypes, pVideoProfileDesc->pFormatStructTypes, *pStructureTypeCount * sizeof(VkStructureType)); + } + } + else + { + *pStructureTypeCount = pVideoProfileDesc->formatStructTypeCount; + } + } + + return result; } +#endif // VK_KHR_video_queue diff --git a/shaders/16bit_arithmetic/compute_buffer.comp.spv b/shaders/16bit_arithmetic/compute_buffer.comp.spv new file mode 100644 index 0000000000..380199349e Binary files /dev/null and b/shaders/16bit_arithmetic/compute_buffer.comp.spv differ diff --git a/shaders/16bit_arithmetic/compute_buffer_fp16.comp b/shaders/16bit_arithmetic/compute_buffer_fp16.comp index 7e7aa5a6b9..f92909a3ff 100644 --- a/shaders/16bit_arithmetic/compute_buffer_fp16.comp +++ b/shaders/16bit_arithmetic/compute_buffer_fp16.comp @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2024, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,89 +24,82 @@ layout(local_size_x = 8, local_size_y = 8) in; -layout(constant_id = 0) const uint WIDTH = 1; +layout(constant_id = 0) const uint WIDTH = 1; layout(constant_id = 1) const uint HEIGHT = 1; layout(set = 0, binding = 0) readonly buffer SSBO { - // It is possible to use native 16-bit types in SSBOs and UBOs. We could use uvec2 here and unpack manually. - // The key feature of 16-bit storage is to allow scalar access to 16-bit values however. - // Avoiding extra unpacking and packing can also be useful. - f16vec4 blob_data[]; + // It is possible to use native 16-bit types in SSBOs and UBOs. We could use uvec2 here and unpack manually. + // The key feature of 16-bit storage is to allow scalar access to 16-bit values however. + // Avoiding extra unpacking and packing can also be useful. + f16vec4 blob_data[]; }; layout(rgba16f, set = 0, binding = 1) writeonly uniform mediump image2D o_results; layout(push_constant) uniform Registers { - // Push constants can also be 16-bit. This can also be very useful since push constant space is so limited! -#ifdef PUSH_CONSTANT_16 - uint16_t num_blobs; - float16_t seed; - i16vec2 range; -#else - // Fallback for implementations which do not support PushConstant16. - uint num_blobs; - float seed; - ivec2 range; -#endif -} registers; + uint16_t num_blobs; + float16_t seed; + i16vec2 range; +} +registers; // This is very arbitrary. Expends a ton of arithmetic to compute // something that looks similar to a lens flare. f16vec4 compute_blob(f16vec2 pos, f16vec4 blob, float16_t seed) { - f16vec2 offset = pos - blob.xy; - f16vec4 rg_offset = offset.xxyy * f16vec4(0.95hf, 1.0hf, 0.95hf, 1.0hf); - f16vec4 bs_offset = offset.xxyy * f16vec4(1.05hf, 1.1hf + seed, 1.05hf, 1.1hf + seed); - - f16vec4 rg_dot = rg_offset * rg_offset; - f16vec4 bs_dot = bs_offset * bs_offset; - - // Dot products can be somewhat awkward in FP16, since the result is a scalar 16-bit value, and we don't want that. - // To that end, we compute at least two dot products side by side, and rg_offset and bs_offset are swizzled - // such that we avoid swizzling across a 32-bit boundary. - f16vec4 dots = f16vec4(rg_dot.xy + rg_dot.zw, bs_dot.xy + bs_dot.zw) * blob.w; - - // Now we have square distances to blob center. - - // Gotta have some FMAs, right? :D - dots = dots * dots + dots; - dots = dots * dots + dots; - dots = dots * dots + dots; - dots = dots * dots + dots; - dots = dots * dots + dots; - dots = dots * dots + dots; - - f16vec4 parabolas = max(f16vec4(1.0hf, 1.0hf, 1.0hf, 0.9hf) - dots, f16vec4(0.0hf)); - parabolas -= parabolas.w; - parabolas = max(parabolas, f16vec4(0.0hf)); - return parabolas; + f16vec2 offset = pos - blob.xy; + f16vec4 rg_offset = offset.xxyy * f16vec4(0.95hf, 1.0hf, 0.95hf, 1.0hf); + f16vec4 bs_offset = offset.xxyy * f16vec4(1.05hf, 1.1hf + seed, 1.05hf, 1.1hf + seed); + + f16vec4 rg_dot = rg_offset * rg_offset; + f16vec4 bs_dot = bs_offset * bs_offset; + + // Dot products can be somewhat awkward in FP16, since the result is a scalar 16-bit value, and we don't want that. + // To that end, we compute at least two dot products side by side, and rg_offset and bs_offset are swizzled + // such that we avoid swizzling across a 32-bit boundary. + f16vec4 dots = f16vec4(rg_dot.xy + rg_dot.zw, bs_dot.xy + bs_dot.zw) * blob.w; + + // Now we have square distances to blob center. + + // Gotta have some FMAs, right? :D + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + + f16vec4 parabolas = max(f16vec4(1.0hf, 1.0hf, 1.0hf, 0.9hf) - dots, f16vec4(0.0hf)); + parabolas -= parabolas.w; + parabolas = max(parabolas, f16vec4(0.0hf)); + return parabolas; } void main() { - uint num_blobs = uint(registers.num_blobs); + uint num_blobs = uint(registers.num_blobs); - float x = float(gl_GlobalInvocationID.x) / float(WIDTH) - 0.5; - float y = float(gl_GlobalInvocationID.y) / float(HEIGHT) - 0.5; - f16vec2 pos = f16vec2(x, y); - f16vec4 result = f16vec4(0.0hf); - float16_t seed = float16_t(registers.seed); - ivec2 range = ivec2(registers.range); + float x = float(gl_GlobalInvocationID.x) / float(WIDTH) - 0.5; + float y = float(gl_GlobalInvocationID.y) / float(HEIGHT) - 0.5; + f16vec2 pos = f16vec2(x, y); + f16vec4 result = f16vec4(0.0hf); + float16_t seed = float16_t(registers.seed); + ivec2 range = ivec2(registers.range); - const float16_t EXPAND_FACTOR = 0.3hf; - float16_t stride = seed * EXPAND_FACTOR; + const float16_t EXPAND_FACTOR = 0.3hf; + float16_t stride = seed * EXPAND_FACTOR; - for (uint i = 0; i < num_blobs; i++) - { - f16vec4 blob = blob_data[i]; + for (uint i = 0; i < num_blobs; i++) + { + f16vec4 blob = blob_data[i]; - // Get as much mileage out of the buffer load as possible. - for (int y = -range.y; y <= range.y; y++) - for (int x = -range.x; x <= range.x; x++) - result += compute_blob(pos + stride * f16vec2(x, y), blob, seed); - } + // Get as much mileage out of the buffer load as possible. + for (int y = -range.y; y <= range.y; y++) + for (int x = -range.x; x <= range.x; x++) + result += compute_blob(pos + stride * f16vec2(x, y), blob, seed); + } - imageStore(o_results, ivec2(gl_GlobalInvocationID.xy), result); + imageStore(o_results, ivec2(gl_GlobalInvocationID.xy), result); } diff --git a/shaders/16bit_arithmetic/compute_buffer_fp16.comp.spv b/shaders/16bit_arithmetic/compute_buffer_fp16.comp.spv new file mode 100644 index 0000000000..b82e6feb10 Binary files /dev/null and b/shaders/16bit_arithmetic/compute_buffer_fp16.comp.spv differ diff --git a/shaders/16bit_arithmetic/compute_buffer_fp16_fallback.comp b/shaders/16bit_arithmetic/compute_buffer_fp16_fallback.comp new file mode 100644 index 0000000000..876e8547af --- /dev/null +++ b/shaders/16bit_arithmetic/compute_buffer_fp16_fallback.comp @@ -0,0 +1,106 @@ +#version 450 +/* Copyright (c) 2020-2024, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Allows us to use float16_t for arithmetic purposes. +#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require + +// Allows us to use int16_t, uint16_t and float16_t for buffers. +#extension GL_EXT_shader_16bit_storage : require + +layout(local_size_x = 8, local_size_y = 8) in; + +layout(constant_id = 0) const uint WIDTH = 1; +layout(constant_id = 1) const uint HEIGHT = 1; + +layout(set = 0, binding = 0) readonly buffer SSBO +{ + // It is possible to use native 16-bit types in SSBOs and UBOs. We could use uvec2 here and unpack manually. + // The key feature of 16-bit storage is to allow scalar access to 16-bit values however. + // Avoiding extra unpacking and packing can also be useful. + f16vec4 blob_data[]; +}; + +layout(rgba16f, set = 0, binding = 1) writeonly uniform mediump image2D o_results; + +layout(push_constant) uniform Registers +{ + // Fallback for implementations which do not support PushConstant16. + uint num_blobs; + float seed; + ivec2 range; +} +registers; + +// This is very arbitrary. Expends a ton of arithmetic to compute +// something that looks similar to a lens flare. +f16vec4 compute_blob(f16vec2 pos, f16vec4 blob, float16_t seed) +{ + f16vec2 offset = pos - blob.xy; + f16vec4 rg_offset = offset.xxyy * f16vec4(0.95hf, 1.0hf, 0.95hf, 1.0hf); + f16vec4 bs_offset = offset.xxyy * f16vec4(1.05hf, 1.1hf + seed, 1.05hf, 1.1hf + seed); + + f16vec4 rg_dot = rg_offset * rg_offset; + f16vec4 bs_dot = bs_offset * bs_offset; + + // Dot products can be somewhat awkward in FP16, since the result is a scalar 16-bit value, and we don't want that. + // To that end, we compute at least two dot products side by side, and rg_offset and bs_offset are swizzled + // such that we avoid swizzling across a 32-bit boundary. + f16vec4 dots = f16vec4(rg_dot.xy + rg_dot.zw, bs_dot.xy + bs_dot.zw) * blob.w; + + // Now we have square distances to blob center. + + // Gotta have some FMAs, right? :D + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + dots = dots * dots + dots; + + f16vec4 parabolas = max(f16vec4(1.0hf, 1.0hf, 1.0hf, 0.9hf) - dots, f16vec4(0.0hf)); + parabolas -= parabolas.w; + parabolas = max(parabolas, f16vec4(0.0hf)); + return parabolas; +} + +void main() +{ + uint num_blobs = uint(registers.num_blobs); + + float x = float(gl_GlobalInvocationID.x) / float(WIDTH) - 0.5; + float y = float(gl_GlobalInvocationID.y) / float(HEIGHT) - 0.5; + f16vec2 pos = f16vec2(x, y); + f16vec4 result = f16vec4(0.0hf); + float16_t seed = float16_t(registers.seed); + ivec2 range = ivec2(registers.range); + + const float16_t EXPAND_FACTOR = 0.3hf; + float16_t stride = seed * EXPAND_FACTOR; + + for (uint i = 0; i < num_blobs; i++) + { + f16vec4 blob = blob_data[i]; + + // Get as much mileage out of the buffer load as possible. + for (int y = -range.y; y <= range.y; y++) + for (int x = -range.x; x <= range.x; x++) + result += compute_blob(pos + stride * f16vec2(x, y), blob, seed); + } + + imageStore(o_results, ivec2(gl_GlobalInvocationID.xy), result); +} diff --git a/shaders/16bit_arithmetic/compute_buffer_fp16_fallback.comp.spv b/shaders/16bit_arithmetic/compute_buffer_fp16_fallback.comp.spv new file mode 100644 index 0000000000..bf66a97f74 Binary files /dev/null and b/shaders/16bit_arithmetic/compute_buffer_fp16_fallback.comp.spv differ diff --git a/shaders/16bit_arithmetic/visualize.frag.spv b/shaders/16bit_arithmetic/visualize.frag.spv new file mode 100644 index 0000000000..e42c83c000 Binary files /dev/null and b/shaders/16bit_arithmetic/visualize.frag.spv differ diff --git a/shaders/16bit_arithmetic/visualize.vert.spv b/shaders/16bit_arithmetic/visualize.vert.spv new file mode 100644 index 0000000000..6af5ff689a Binary files /dev/null and b/shaders/16bit_arithmetic/visualize.vert.spv differ diff --git a/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.frag.spv b/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.frag.spv new file mode 100644 index 0000000000..8f03ad6310 Binary files /dev/null and b/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.frag.spv differ diff --git a/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert b/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert index abfa2803a6..b6c8ab2464 100644 --- a/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert +++ b/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,6 +16,8 @@ * limitations under the License. */ +#define MAX_LIGHT_COUNT 48 + layout(location = 0) in vec3 position; layout(location = 1) in vec3 normal; diff --git a/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert.spv b/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert.spv new file mode 100644 index 0000000000..ee5a1071fd Binary files /dev/null and b/shaders/16bit_storage_input_output/16bit_storage_input_output_disabled.vert.spv differ diff --git a/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.frag.spv b/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.frag.spv new file mode 100644 index 0000000000..2ab8692478 Binary files /dev/null and b/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.frag.spv differ diff --git a/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert b/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert index cdb7bd0bff..3b59a64ca2 100644 --- a/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert +++ b/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2020-2021, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -17,6 +17,8 @@ */ #extension GL_EXT_shader_explicit_arithmetic_types_float16 : require +#define MAX_LIGHT_COUNT 48 + layout(location = 0) in vec3 position; layout(location = 1) in vec3 normal; diff --git a/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert.spv b/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert.spv new file mode 100644 index 0000000000..527b3e45b1 Binary files /dev/null and b/shaders/16bit_storage_input_output/16bit_storage_input_output_enabled.vert.spv differ diff --git a/shaders/README.adoc b/shaders/README.adoc index 031c5ff9c3..9932c150b0 100644 --- a/shaders/README.adoc +++ b/shaders/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2024, Sascha Willems +- Copyright (c) 2024-2025, Sascha Willems - - SPDX-License-Identifier: Apache-2.0 - @@ -20,11 +20,22 @@ == Shader languages -This folder contains the textual shaders for the samples. All samples come with GLSL shaders and some optionally with HLSL shaders. For samples that support both shader language this is a good way to compare GLSL to HLSL syntax when targeting SPIR-V for Vulkan. +This folder contains the textual shaders for the samples. All samples come with GLSL shaders and some optionally with Slang and HLSL shaders. For samples that support multiple shader languages, this is a good way to compare the syntax differences when targeting SPIR-V for Vulkan. + +== Compiling shaders + +The samples load offline compiled SPIR-V variants of the GLSL/Slang/HLSL shaders. If you have the appropriate compiler installed, e.g. via the LunarG VUlkan SDK, shaders will be automatically compiled when building the samples project. + +**Note for compiling Slang shaders**: The minimum required version of the Slang compiler is `2025.16.1`. Older versions might have issues compiling shaders or may result in invalid SPIR-V. It's advised to use the latest version from link:https://github.com/shader-slang/slang/releases[here]. + +== Selecting shading language + +To select a shading language, use the `--shading-language` argument followed by the shading language `glsl`, `slang` or `hlsl`. Samples default to `glsl`. == Further information The xref:guide:ROOT:index.adoc[Vulkan Guide] contains further information on how to use HLSL with Vulkan and how it compares to GLSL: * xref:guide::hlsl.adoc[HLSL in Vulkan] -* xref:guide::high_level_shader_language_comparison.adoc[High level shading language comparison] \ No newline at end of file +* xref:guide::high_level_shader_language_comparison.adoc[High level shading language comparison] +* link:https://shader-slang.org/docs/[Slang shading language documentation] \ No newline at end of file diff --git a/shaders/async_compute/blur_down.comp b/shaders/async_compute/blur_down.comp index 20a976e359..5bc482e99d 100644 --- a/shaders/async_compute/blur_down.comp +++ b/shaders/async_compute/blur_down.comp @@ -1,6 +1,6 @@ #version 450 -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,7 @@ layout(local_size_x = 8, local_size_y = 8) in; -#include "async_compute/blur_common.h" +#include "blur_common.h" const float SCALE = 1.75; diff --git a/shaders/async_compute/blur_down.comp.spv b/shaders/async_compute/blur_down.comp.spv new file mode 100644 index 0000000000..8dacec0519 Binary files /dev/null and b/shaders/async_compute/blur_down.comp.spv differ diff --git a/shaders/async_compute/blur_up.comp b/shaders/async_compute/blur_up.comp index 73c401bfd5..a828b4f3ee 100644 --- a/shaders/async_compute/blur_up.comp +++ b/shaders/async_compute/blur_up.comp @@ -1,6 +1,6 @@ #version 450 -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -21,7 +21,7 @@ layout(local_size_x = 8, local_size_y = 8) in; -#include "async_compute/blur_common.h" +#include "blur_common.h" const float SCALE = 0.875; diff --git a/shaders/async_compute/blur_up.comp.spv b/shaders/async_compute/blur_up.comp.spv new file mode 100644 index 0000000000..965c71f781 Binary files /dev/null and b/shaders/async_compute/blur_up.comp.spv differ diff --git a/shaders/async_compute/composite.frag.spv b/shaders/async_compute/composite.frag.spv new file mode 100644 index 0000000000..fee48433a7 Binary files /dev/null and b/shaders/async_compute/composite.frag.spv differ diff --git a/shaders/async_compute/composite.vert.spv b/shaders/async_compute/composite.vert.spv new file mode 100644 index 0000000000..6af5ff689a Binary files /dev/null and b/shaders/async_compute/composite.vert.spv differ diff --git a/shaders/async_compute/forward.frag b/shaders/async_compute/forward.frag index ab7b3cf772..5ff677bd57 100644 --- a/shaders/async_compute/forward.frag +++ b/shaders/async_compute/forward.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2021, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,7 @@ precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -76,12 +74,8 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); - #ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); - #else - base_color = pbr_material_uniform.base_color_factor; - #endif - + vec3 ambient_color = vec3(0.25) * base_color.xyz; o_color = vec4(ambient_color + light_contribution * base_color.xyz, base_color.w); diff --git a/shaders/async_compute/forward.frag.spv b/shaders/async_compute/forward.frag.spv new file mode 100644 index 0000000000..bce92fad0c Binary files /dev/null and b/shaders/async_compute/forward.frag.spv differ diff --git a/shaders/async_compute/forward.vert.spv b/shaders/async_compute/forward.vert.spv new file mode 100644 index 0000000000..994e15e8e3 Binary files /dev/null and b/shaders/async_compute/forward.vert.spv differ diff --git a/shaders/async_compute/shadow.frag.spv b/shaders/async_compute/shadow.frag.spv new file mode 100644 index 0000000000..c206d2f10f Binary files /dev/null and b/shaders/async_compute/shadow.frag.spv differ diff --git a/shaders/async_compute/shadow.vert.spv b/shaders/async_compute/shadow.vert.spv new file mode 100644 index 0000000000..76bd1a1766 Binary files /dev/null and b/shaders/async_compute/shadow.vert.spv differ diff --git a/shaders/async_compute/threshold.comp.spv b/shaders/async_compute/threshold.comp.spv new file mode 100644 index 0000000000..4f40681130 Binary files /dev/null and b/shaders/async_compute/threshold.comp.spv differ diff --git a/shaders/base.frag b/shaders/base.frag index 49b45b0acc..d6bc3ca5f4 100644 --- a/shaders/base.frag +++ b/shaders/base.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,7 @@ precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -50,9 +48,9 @@ pbr_material_uniform; layout(set = 0, binding = 4) uniform LightsInfo { - Light directional_lights[MAX_LIGHT_COUNT]; - Light point_lights[MAX_LIGHT_COUNT]; - Light spot_lights[MAX_LIGHT_COUNT]; + Light directional_lights[48]; + Light point_lights[48]; + Light spot_lights[48]; } lights_info; @@ -83,11 +81,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = pbr_material_uniform.base_color_factor; -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/base.frag.spv b/shaders/base.frag.spv new file mode 100644 index 0000000000..3b5b7a3ba4 Binary files /dev/null and b/shaders/base.frag.spv differ diff --git a/shaders/base.vert.spv b/shaders/base.vert.spv new file mode 100644 index 0000000000..77397e5f12 Binary files /dev/null and b/shaders/base.vert.spv differ diff --git a/shaders/buffer_device_address/render.frag b/shaders/buffer_device_address/glsl/render.frag similarity index 93% rename from shaders/buffer_device_address/render.frag rename to shaders/buffer_device_address/glsl/render.frag index 9c9f1fb7a8..9c140ec04e 100644 --- a/shaders/buffer_device_address/render.frag +++ b/shaders/buffer_device_address/glsl/render.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/buffer_device_address/glsl/render.frag.spv b/shaders/buffer_device_address/glsl/render.frag.spv new file mode 100644 index 0000000000..0b85e325cb Binary files /dev/null and b/shaders/buffer_device_address/glsl/render.frag.spv differ diff --git a/shaders/buffer_device_address/render.vert b/shaders/buffer_device_address/glsl/render.vert similarity index 98% rename from shaders/buffer_device_address/render.vert rename to shaders/buffer_device_address/glsl/render.vert index ffc8871306..dc4223bd9c 100644 --- a/shaders/buffer_device_address/render.vert +++ b/shaders/buffer_device_address/glsl/render.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/buffer_device_address/glsl/render.vert.spv b/shaders/buffer_device_address/glsl/render.vert.spv new file mode 100644 index 0000000000..1943da836d Binary files /dev/null and b/shaders/buffer_device_address/glsl/render.vert.spv differ diff --git a/shaders/buffer_device_address/update_vbo.comp b/shaders/buffer_device_address/glsl/update_vbo.comp similarity index 98% rename from shaders/buffer_device_address/update_vbo.comp rename to shaders/buffer_device_address/glsl/update_vbo.comp index 14ac1ef9dc..5dba0c8ac1 100644 --- a/shaders/buffer_device_address/update_vbo.comp +++ b/shaders/buffer_device_address/glsl/update_vbo.comp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/buffer_device_address/glsl/update_vbo.comp.spv b/shaders/buffer_device_address/glsl/update_vbo.comp.spv new file mode 100644 index 0000000000..f4ec6d27e6 Binary files /dev/null and b/shaders/buffer_device_address/glsl/update_vbo.comp.spv differ diff --git a/shaders/buffer_device_address/slang/render.frag.slang b/shaders/buffer_device_address/slang/render.frag.slang new file mode 100644 index 0000000000..63fd5aa418 --- /dev/null +++ b/shaders/buffer_device_address/slang/render.frag.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + nointerpolation float4 Color; +} + +// Nothing interesting, just interpolate color from vertex. +[shader("fragment")] +float4 main(VSOutput input) +{ + return input.Color; +} diff --git a/shaders/buffer_device_address/slang/render.frag.spv b/shaders/buffer_device_address/slang/render.frag.spv new file mode 100644 index 0000000000..4f70e49851 Binary files /dev/null and b/shaders/buffer_device_address/slang/render.frag.spv differ diff --git a/shaders/buffer_device_address/slang/render.vert.slang b/shaders/buffer_device_address/slang/render.vert.slang new file mode 100644 index 0000000000..23a770d900 --- /dev/null +++ b/shaders/buffer_device_address/slang/render.vert.slang @@ -0,0 +1,73 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + nointerpolation float4 Color; +} + +struct Registers +{ + float4x4 view_projection; + // This is a pointer to an array of pointers, essentially: + // const VBO * const *vbos + float2 **positions; +}; + +[shader("vertex")] +VSOutput main(uint instanceIndex: SV_InstanceID, uint vertexIndex: SV_VertexID, uniform Registers registers) +{ + int slice = instanceIndex; + + // One VBO per instance, load the VBO pointer. + // The cool thing here is that a compute shader could hypothetically + // write the pointer list where vertices are stored. + // With vertex attributes we do not have the luxury to modify VBO bindings on the GPU. + // The best we can do is to just modify the vertexOffset in an indirect draw call, + // but that's not always flexible enough, and enforces a very specific engine design to work. + // We can even modify the attribute layout per slice here, since we can just cast the pointer + // to something else if we want. + float2* positions = registers.positions[slice]; + + // Load the vertex based on VertexIndex instead of an attribute. Fully flexible. + // Only downside is that we do not get format conversion for free like we do with normal vertex attributes. + float2 pos = positions[vertexIndex] * 2.5; + + // Place the quad meshes on screen and center it. + pos += 3.0 * (float2(slice % 8, slice / 8) - 3.5); + + VSOutput output; + // Normal projection. + output.Pos = mul(registers.view_projection, float4(pos, 0.0, 1.0)); + + // Color the vertex. Use a combination of a wave and checkerboard, completely arbitrary. + int index_x = vertexIndex % 16; + int index_y = vertexIndex / 16; + + float r = 0.5 + 0.3 * sin(float(index_x)); + float g = 0.5 + 0.3 * sin(float(index_y)); + + int checkerboard = (index_x ^ index_y) & 1; + r *= float(checkerboard) * 0.8 + 0.2; + g *= float(checkerboard) * 0.8 + 0.2; + + output.Color = float4(r, g, 0.15, 1.0); + + return output; +} diff --git a/shaders/buffer_device_address/slang/render.vert.spv b/shaders/buffer_device_address/slang/render.vert.spv new file mode 100644 index 0000000000..415aa6607d Binary files /dev/null and b/shaders/buffer_device_address/slang/render.vert.spv differ diff --git a/shaders/buffer_device_address/slang/update_vbo.comp.slang b/shaders/buffer_device_address/slang/update_vbo.comp.slang new file mode 100644 index 0000000000..c1b7a76d22 --- /dev/null +++ b/shaders/buffer_device_address/slang/update_vbo.comp.slang @@ -0,0 +1,70 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// If we mark a buffer as buffer_reference, this is treated as a pointer type. +// A variable with the type Position is a 64-bit pointer to the data within. +// We can freely cast between pointer types if we wish, but that is not necessary in this sample. +// buffer_reference_align is used to let the underlying implementation know which alignment to expect. +// The pointer can have scalar alignment, which is something the compiler cannot know unless you tell it. +// It is best to use vector alignment when you can for optimal performance, but scalar alignment is sometimes useful. +// With SSBOs, the API has a minimum offset alignment which guarantees a minimum level of alignment from API side. + +// In push constant we place a pointer to VBO pointers, spicy! +// This way we don't need any descriptor sets, but there's nothing wrong with combining use of descriptor sets and buffer device addresses. +// It is mostly done for convenience here. +struct Registers +{ + float2 **positions; + // A buffer reference is 64-bit, so offset of fract_time is 8 bytes. + float fract_time; +} + +[shader("compute")] +[numthreads(8, 8, 1)] +void main(uint3 globalInvocationID: SV_DispatchThreadID, uint3 workgroupID: SV_GroupID, uniform Registers registers) +{ + uint3 workgroupSize = WorkgroupSize(); + uint3 workgroupCount = WorkgroupCount(); + + // Every slice is a 8x8 grid of vertices which we update here in compute. + uint2 local_offset = globalInvocationID.xy; + uint local_index = local_offset.y * workgroupSize.x * workgroupCount.x + local_offset.x; + uint slice = workgroupID.z; + + float2 *positions = registers.positions[slice]; + + // This is a trivial wave-like function. Arbitrary for demonstration purposes. + const float TWO_PI = 3.1415628 * 2.0; + float offset = TWO_PI * fract(registers.fract_time + float(slice) * 0.1); + + // Simple grid. + float2 pos = float2(local_offset); + + // Wobble, wobble. + pos.x += 0.2 * sin(2.2 * pos.x + offset); + pos.y += 0.2 * sin(2.25 * pos.y + 2.0 * offset); + pos.x += 0.2 * cos(1.8 * pos.y + 3.0 * offset); + pos.y += 0.2 * cos(2.85 * pos.x + 4.0 * offset); + pos.x += 0.5 * sin(offset); + pos.y += 0.5 * sin(offset + 0.3); + + // Center the mesh in [-0.5, 0.5] range. + // Here we write to a raw pointer. + // Be aware, there is no robustness support for buffer_device_address since we don't have a complete descriptor! + positions[local_index] = pos / (float2(workgroupSize.xy) * float2(workgroupCount.xy) - 1.0) - 0.5; +} diff --git a/shaders/buffer_device_address/slang/update_vbo.comp.spv b/shaders/buffer_device_address/slang/update_vbo.comp.spv new file mode 100644 index 0000000000..2f88cdb8c7 Binary files /dev/null and b/shaders/buffer_device_address/slang/update_vbo.comp.spv differ diff --git a/shaders/color_write_enable/glsl/composition.frag.spv b/shaders/color_write_enable/glsl/composition.frag.spv new file mode 100644 index 0000000000..f1548391d2 Binary files /dev/null and b/shaders/color_write_enable/glsl/composition.frag.spv differ diff --git a/shaders/color_write_enable/glsl/composition.vert.spv b/shaders/color_write_enable/glsl/composition.vert.spv new file mode 100644 index 0000000000..6e6ceeada5 Binary files /dev/null and b/shaders/color_write_enable/glsl/composition.vert.spv differ diff --git a/shaders/color_write_enable/glsl/triangle_separate_channels.frag.spv b/shaders/color_write_enable/glsl/triangle_separate_channels.frag.spv new file mode 100644 index 0000000000..5053f3dfb7 Binary files /dev/null and b/shaders/color_write_enable/glsl/triangle_separate_channels.frag.spv differ diff --git a/shaders/color_write_enable/glsl/triangle_separate_channels.vert.spv b/shaders/color_write_enable/glsl/triangle_separate_channels.vert.spv new file mode 100644 index 0000000000..be926244a9 Binary files /dev/null and b/shaders/color_write_enable/glsl/triangle_separate_channels.vert.spv differ diff --git a/shaders/color_write_enable/hlsl/composition.frag.spv b/shaders/color_write_enable/hlsl/composition.frag.spv index 43d955e9cc..b0e7012565 100644 Binary files a/shaders/color_write_enable/hlsl/composition.frag.spv and b/shaders/color_write_enable/hlsl/composition.frag.spv differ diff --git a/shaders/color_write_enable/hlsl/triangle_separate_channels.vert.spv b/shaders/color_write_enable/hlsl/triangle_separate_channels.vert.spv index c54ecea910..76844d79ad 100644 Binary files a/shaders/color_write_enable/hlsl/triangle_separate_channels.vert.spv and b/shaders/color_write_enable/hlsl/triangle_separate_channels.vert.spv differ diff --git a/shaders/color_write_enable/slang/composition.frag.slang b/shaders/color_write_enable/slang/composition.frag.slang new file mode 100644 index 0000000000..76a7c9eade --- /dev/null +++ b/shaders/color_write_enable/slang/composition.frag.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::input_attachment_index(0)]] SubpassInput in_color_r; +[[vk::input_attachment_index(1)]] SubpassInput in_color_g; +[[vk::input_attachment_index(2)]] SubpassInput in_color_b; + +[shader("fragment")] +float4 main() +{ + float4 color_r = in_color_r.SubpassLoad(); + float4 color_g = in_color_g.SubpassLoad(); + float4 color_b = in_color_b.SubpassLoad(); + + return color_r + color_g + color_b; +} diff --git a/shaders/color_write_enable/slang/composition.frag.spv b/shaders/color_write_enable/slang/composition.frag.spv new file mode 100644 index 0000000000..acf8a18133 Binary files /dev/null and b/shaders/color_write_enable/slang/composition.frag.spv differ diff --git a/shaders/color_write_enable/slang/composition.vert.slang b/shaders/color_write_enable/slang/composition.vert.slang new file mode 100644 index 0000000000..0c1ebc5a25 --- /dev/null +++ b/shaders/color_write_enable/slang/composition.vert.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex : SV_VertexID) +{ + VSOutput output; + float2 uv = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(uv * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/color_write_enable/slang/composition.vert.spv b/shaders/color_write_enable/slang/composition.vert.spv new file mode 100644 index 0000000000..7ddf817845 Binary files /dev/null and b/shaders/color_write_enable/slang/composition.vert.spv differ diff --git a/shaders/color_write_enable/slang/triangle_separate_channels.frag.slang b/shaders/color_write_enable/slang/triangle_separate_channels.frag.slang new file mode 100644 index 0000000000..663cf89be0 --- /dev/null +++ b/shaders/color_write_enable/slang/triangle_separate_channels.frag.slang @@ -0,0 +1,42 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +struct FSOutput +{ + float4 ColorR; + float4 ColorG; + float4 ColorB; +}; + +// The full color is copied to individual attachments. +// Each attachment has a single component bit (R, G, B) enabled +// via the blend_attachment in ColorWriteEnable::prepare_pipelines. +[shader("fragment")] +FSOutput main(VSOutput Input) +{ + FSOutput output; + output.ColorR = float4(Input.Color, 1.0f); + output.ColorG = float4(Input.Color, 1.0f); + output.ColorB = float4(Input.Color, 1.0f); + return output; +} diff --git a/shaders/color_write_enable/slang/triangle_separate_channels.frag.spv b/shaders/color_write_enable/slang/triangle_separate_channels.frag.spv new file mode 100644 index 0000000000..192626f377 Binary files /dev/null and b/shaders/color_write_enable/slang/triangle_separate_channels.frag.spv differ diff --git a/shaders/color_write_enable/slang/triangle_separate_channels.vert.slang b/shaders/color_write_enable/slang/triangle_separate_channels.vert.slang new file mode 100644 index 0000000000..7710c0656c --- /dev/null +++ b/shaders/color_write_enable/slang/triangle_separate_channels.vert.slang @@ -0,0 +1,44 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +static float2 triangle_positions[3] = { + float2(0.0, -0.5), + float2(0.5, 0.5), + float2(-0.5, 0.5) +}; + +static float3 triangle_colors[3] = { + float3(1.0, 0.0, 0.0), + float3(0.0, 1.0, 0.0), + float3(0.0, 0.0, 1.0) +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex : SV_VertexID) +{ + VSOutput output; + output.Pos = float4(triangle_positions[VertexIndex], 0.0, 1.0); + output.Color = triangle_colors[VertexIndex]; + return output; +} + diff --git a/shaders/color_write_enable/slang/triangle_separate_channels.vert.spv b/shaders/color_write_enable/slang/triangle_separate_channels.vert.spv new file mode 100644 index 0000000000..f9ce52c127 Binary files /dev/null and b/shaders/color_write_enable/slang/triangle_separate_channels.vert.spv differ diff --git a/shaders/compute_nbody/glsl/particle.frag.spv b/shaders/compute_nbody/glsl/particle.frag.spv new file mode 100644 index 0000000000..69ff9f056f Binary files /dev/null and b/shaders/compute_nbody/glsl/particle.frag.spv differ diff --git a/shaders/compute_nbody/glsl/particle.vert.spv b/shaders/compute_nbody/glsl/particle.vert.spv new file mode 100644 index 0000000000..3303124a1b Binary files /dev/null and b/shaders/compute_nbody/glsl/particle.vert.spv differ diff --git a/shaders/compute_nbody/glsl/particle_calculate.comp.spv b/shaders/compute_nbody/glsl/particle_calculate.comp.spv new file mode 100644 index 0000000000..32a6f39974 Binary files /dev/null and b/shaders/compute_nbody/glsl/particle_calculate.comp.spv differ diff --git a/shaders/compute_nbody/glsl/particle_integrate.comp.spv b/shaders/compute_nbody/glsl/particle_integrate.comp.spv new file mode 100644 index 0000000000..f65866148e Binary files /dev/null and b/shaders/compute_nbody/glsl/particle_integrate.comp.spv differ diff --git a/shaders/compute_nbody/hlsl/particle_calculate.comp.spv b/shaders/compute_nbody/hlsl/particle_calculate.comp.spv index 1084304941..833354d9f9 100644 Binary files a/shaders/compute_nbody/hlsl/particle_calculate.comp.spv and b/shaders/compute_nbody/hlsl/particle_calculate.comp.spv differ diff --git a/shaders/compute_nbody/slang/particle.frag.slang b/shaders/compute_nbody/slang/particle.frag.slang new file mode 100644 index 0000000000..1069c0624c --- /dev/null +++ b/shaders/compute_nbody/slang/particle.frag.slang @@ -0,0 +1,33 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Sampler2D samplerColorMap; +Sampler2D samplerGradientRamp; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 PointCoord : SV_PointCoord; + float GradientPos; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float3 color = samplerGradientRamp.Sample(float2(input.GradientPos, 0.0)).rgb; + return float4(samplerColorMap.Sample(input.PointCoord).rgb * color, 1.0); +} \ No newline at end of file diff --git a/shaders/compute_nbody/slang/particle.frag.spv b/shaders/compute_nbody/slang/particle.frag.spv new file mode 100644 index 0000000000..de6ec18895 Binary files /dev/null and b/shaders/compute_nbody/slang/particle.frag.spv differ diff --git a/shaders/compute_nbody/slang/particle.vert.slang b/shaders/compute_nbody/slang/particle.vert.slang new file mode 100644 index 0000000000..15915bd475 --- /dev/null +++ b/shaders/compute_nbody/slang/particle.vert.slang @@ -0,0 +1,51 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float4 Pos; + float4 Vel; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float PointSize : SV_PointSize; + float GradientPos; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float2 screendim; +}; +[[vk::binding(2, 0)]] ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + const float spriteSize = 0.005 * input.Pos.w; // Point size influenced by mass (stored in input.Pos.w); + float4 eyePos = mul(ubo.modelview, float4(input.Pos.x, input.Pos.y, input.Pos.z, 1.0)); + // Use projection to make sure point sizes uniformly scale independent of current projection + float4 projectedCorner = mul(ubo.projection, float4(0.5 * spriteSize, 0.5 * spriteSize, eyePos.z, eyePos.w)); + output.PointSize = clamp(ubo.screendim.x * projectedCorner.x / projectedCorner.w, 1.0, 128.0); + output.Pos = mul(ubo.projection, eyePos); + output.GradientPos = input.Vel.w; + return output; +} \ No newline at end of file diff --git a/shaders/compute_nbody/slang/particle.vert.spv b/shaders/compute_nbody/slang/particle.vert.spv new file mode 100644 index 0000000000..b6ce6c3d8d Binary files /dev/null and b/shaders/compute_nbody/slang/particle.vert.spv differ diff --git a/shaders/compute_nbody/slang/particle_calculate.comp.slang b/shaders/compute_nbody/slang/particle_calculate.comp.slang new file mode 100644 index 0000000000..db54d7e39d --- /dev/null +++ b/shaders/compute_nbody/slang/particle_calculate.comp.slang @@ -0,0 +1,87 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Particle +{ + float4 pos; + float4 vel; +}; +RWStructuredBuffer particles; + +struct UBO +{ + float deltaT; + int particleCount; +}; +ConstantBuffer ubo; + +[[vk::constant_id(1)]] const int SHARED_DATA_SIZE = 1024; +[[vk::constant_id(2)]] const float GRAVITY = 0.002; +[[vk::constant_id(3)]] const float POWER = 0.75; +[[vk::constant_id(4)]] const float SOFTEN = 0.05; + +// Share data between computer shader invocations to speed up caluclations +groupshared float4 sharedData[SHARED_DATA_SIZE]; + +#define TIME_FACTOR 0.05 + +[shader("compute")] +[numthreads(256, 1, 1)] +void main(uint3 GlobalInvocationID : SV_DispatchThreadID, uint3 LocalInvocationID : SV_GroupThreadID) +{ + // Current SSBO index + uint index = GlobalInvocationID.x; + if (index >= ubo.particleCount) + return; + + float4 position = particles[index].pos; + float4 velocity = particles[index].vel; + float4 acceleration = float4(0, 0, 0, 0); + int3 workgroupSize = WorkgroupSize(); + + for (int i = 0; i < ubo.particleCount; i += SHARED_DATA_SIZE) + { + if (i + LocalInvocationID.x < ubo.particleCount) + { + sharedData[LocalInvocationID.x] = particles[i + LocalInvocationID.x].pos; + } + else + { + sharedData[LocalInvocationID.x] = float4(0, 0, 0, 0); + } + + GroupMemoryBarrierWithGroupSync(); + + for (int j = 0; j < workgroupSize.x; j++) + { + float4 other = sharedData[j]; + float3 len = other.xyz - position.xyz; + acceleration.xyz += GRAVITY * len * other.w / pow(dot(len, len) + SOFTEN, POWER); + } + + GroupMemoryBarrierWithGroupSync(); + } + + particles[index].vel.xyz += ubo.deltaT * TIME_FACTOR * acceleration.xyz; + + // Gradient texture position + particles[index].vel.w += 0.1 * TIME_FACTOR * ubo.deltaT; + if (particles[index].vel.w > 1.0) + { + particles[index].vel.w -= 1.0; + } +} \ No newline at end of file diff --git a/shaders/compute_nbody/slang/particle_calculate.comp.spv b/shaders/compute_nbody/slang/particle_calculate.comp.spv new file mode 100644 index 0000000000..1c0b7bfb94 Binary files /dev/null and b/shaders/compute_nbody/slang/particle_calculate.comp.spv differ diff --git a/shaders/compute_nbody/slang/particle_integrate.comp.slang b/shaders/compute_nbody/slang/particle_integrate.comp.slang new file mode 100644 index 0000000000..559a357dff --- /dev/null +++ b/shaders/compute_nbody/slang/particle_integrate.comp.slang @@ -0,0 +1,43 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Particle +{ + float4 pos; + float4 vel; +}; +RWStructuredBuffer particles; + +struct UBO +{ + float deltaT; + int particleCount; +}; +ConstantBuffer ubo; + +#define TIME_FACTOR 0.05 + +[shader("compute")] +[numthreads(256, 1, 1)] +void main(uint3 GlobalInvocationID : SV_DispatchThreadID) +{ + int index = int(GlobalInvocationID.x); + float4 position = particles[index].pos; + float4 velocity = particles[index].vel; + position += ubo.deltaT * TIME_FACTOR * velocity; + particles[index].pos = position; +} \ No newline at end of file diff --git a/shaders/compute_nbody/slang/particle_integrate.comp.spv b/shaders/compute_nbody/slang/particle_integrate.comp.spv new file mode 100644 index 0000000000..325e3af7ae Binary files /dev/null and b/shaders/compute_nbody/slang/particle_integrate.comp.spv differ diff --git a/shaders/conditional_rendering/glsl/model.frag.spv b/shaders/conditional_rendering/glsl/model.frag.spv new file mode 100644 index 0000000000..684e48a6da Binary files /dev/null and b/shaders/conditional_rendering/glsl/model.frag.spv differ diff --git a/shaders/conditional_rendering/glsl/model.vert.spv b/shaders/conditional_rendering/glsl/model.vert.spv new file mode 100644 index 0000000000..6bf97a9c7b Binary files /dev/null and b/shaders/conditional_rendering/glsl/model.vert.spv differ diff --git a/shaders/conditional_rendering/hlsl/model.frag.spv b/shaders/conditional_rendering/hlsl/model.frag.spv index 3d8ec718bd..6ecd474830 100644 Binary files a/shaders/conditional_rendering/hlsl/model.frag.spv and b/shaders/conditional_rendering/hlsl/model.frag.spv differ diff --git a/shaders/conditional_rendering/hlsl/model.vert.hlsl b/shaders/conditional_rendering/hlsl/model.vert.hlsl index b42125304c..da99759d16 100644 --- a/shaders/conditional_rendering/hlsl/model.vert.hlsl +++ b/shaders/conditional_rendering/hlsl/model.vert.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -49,7 +49,8 @@ VSOutput main(VSInput input) { VSOutput output = (VSOutput) 0; float4 localPos = mul(ubo.view, mul(push_constants.model, float4(input.Pos, 1.0))); - output.Normal = input.Normal; + float3x3 nMat = (float3x3) mul(ubo.view, push_constants.model); + output.Normal = mul(nMat, input.Normal); output.Color = push_constants.color.rgb; output.Pos = mul(ubo.projection, localPos); const float3 lightPos = float3(10.0, -10.0, 10.0); diff --git a/shaders/conditional_rendering/hlsl/model.vert.spv b/shaders/conditional_rendering/hlsl/model.vert.spv index 8d18a37e56..d12230845a 100644 Binary files a/shaders/conditional_rendering/hlsl/model.vert.spv and b/shaders/conditional_rendering/hlsl/model.vert.spv differ diff --git a/shaders/conditional_rendering/slang/model.frag.slang b/shaders/conditional_rendering/slang/model.frag.slang new file mode 100644 index 0000000000..a733c67553 --- /dev/null +++ b/shaders/conditional_rendering/slang/model.frag.slang @@ -0,0 +1,38 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 ViewVec; + float3 LightVec; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 ambient = float3(0.25); + float3 diffuse = max(dot(N, L), 0.0) * float3(1.0); + float3 specular = pow(max(dot(R, V), 0.0), 16.0) * float3(0.75); + return float4((ambient + diffuse) * input.Color.rgb + specular, 1.0); +} \ No newline at end of file diff --git a/shaders/conditional_rendering/slang/model.frag.spv b/shaders/conditional_rendering/slang/model.frag.spv new file mode 100644 index 0000000000..3574a5ecb1 Binary files /dev/null and b/shaders/conditional_rendering/slang/model.frag.spv differ diff --git a/shaders/conditional_rendering/slang/model.vert.slang b/shaders/conditional_rendering/slang/model.vert.slang new file mode 100644 index 0000000000..a88880b913 --- /dev/null +++ b/shaders/conditional_rendering/slang/model.vert.slang @@ -0,0 +1,54 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4x4 modelMatrix, uniform float4 modelColor) +{ + VSOutput output; + float4 localPos = mul(ubo.view, mul(modelMatrix, float4(input.Pos, 1.0))); + float3x3 nMat = (float3x3)mul(ubo.view, modelMatrix); + output.Normal = mul(nMat, input.Normal); + output.Color = modelColor.rgb; + output.Pos = mul(ubo.projection, localPos); + const float3 lightPos = float3(10.0, -10.0, 10.0); + output.LightVec = lightPos - localPos.xyz; + output.ViewVec = -localPos.xyz; + return output; +} \ No newline at end of file diff --git a/shaders/conditional_rendering/slang/model.vert.spv b/shaders/conditional_rendering/slang/model.vert.spv new file mode 100644 index 0000000000..797b77166d Binary files /dev/null and b/shaders/conditional_rendering/slang/model.vert.spv differ diff --git a/shaders/conservative_rasterization/glsl/fullscreen.frag.spv b/shaders/conservative_rasterization/glsl/fullscreen.frag.spv new file mode 100644 index 0000000000..db50761444 Binary files /dev/null and b/shaders/conservative_rasterization/glsl/fullscreen.frag.spv differ diff --git a/shaders/conservative_rasterization/glsl/fullscreen.vert.spv b/shaders/conservative_rasterization/glsl/fullscreen.vert.spv new file mode 100644 index 0000000000..7362f82e59 Binary files /dev/null and b/shaders/conservative_rasterization/glsl/fullscreen.vert.spv differ diff --git a/shaders/conservative_rasterization/glsl/triangle.frag.spv b/shaders/conservative_rasterization/glsl/triangle.frag.spv new file mode 100644 index 0000000000..679d365a65 Binary files /dev/null and b/shaders/conservative_rasterization/glsl/triangle.frag.spv differ diff --git a/shaders/conservative_rasterization/glsl/triangle.vert.spv b/shaders/conservative_rasterization/glsl/triangle.vert.spv new file mode 100644 index 0000000000..2702ca0169 Binary files /dev/null and b/shaders/conservative_rasterization/glsl/triangle.vert.spv differ diff --git a/shaders/conservative_rasterization/glsl/triangleoverlay.frag.spv b/shaders/conservative_rasterization/glsl/triangleoverlay.frag.spv new file mode 100644 index 0000000000..b237cfcd37 Binary files /dev/null and b/shaders/conservative_rasterization/glsl/triangleoverlay.frag.spv differ diff --git a/components/ios/tests/entrypoint.test.cpp b/shaders/conservative_rasterization/slang/fullscreen.frag.slang similarity index 68% rename from components/ios/tests/entrypoint.test.cpp rename to shaders/conservative_rasterization/slang/fullscreen.frag.slang index 68e8822a64..173f9c12d7 100644 --- a/components/ios/tests/entrypoint.test.cpp +++ b/shaders/conservative_rasterization/slang/fullscreen.frag.slang @@ -1,4 +1,4 @@ -/* Copyright (c) 2023-2024, Thomas Atkinson +/* Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -15,17 +15,16 @@ * limitations under the License. */ -#define PLATFORM_LINUX -#include +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; -#include +[[vk::binding(1, 0)]] Sampler2D samplerColor; -CUSTOM_MAIN(context) +[shader("fragment")] +float4 main(VSOutput input) { - if (!dynamic_cast(&context)) - { - throw "context is not a IosPlatformContext"; - } - - return 0; + return samplerColor.Sample(input.UV); } \ No newline at end of file diff --git a/shaders/conservative_rasterization/slang/fullscreen.frag.spv b/shaders/conservative_rasterization/slang/fullscreen.frag.spv new file mode 100644 index 0000000000..7a3e003c10 Binary files /dev/null and b/shaders/conservative_rasterization/slang/fullscreen.frag.spv differ diff --git a/shaders/conservative_rasterization/slang/fullscreen.vert.slang b/shaders/conservative_rasterization/slang/fullscreen.vert.slang new file mode 100644 index 0000000000..fd64a125b8 --- /dev/null +++ b/shaders/conservative_rasterization/slang/fullscreen.vert.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/conservative_rasterization/slang/fullscreen.vert.spv b/shaders/conservative_rasterization/slang/fullscreen.vert.spv new file mode 100644 index 0000000000..26860adcd1 Binary files /dev/null and b/shaders/conservative_rasterization/slang/fullscreen.vert.spv differ diff --git a/shaders/conservative_rasterization/slang/triangle.frag.slang b/shaders/conservative_rasterization/slang/triangle.frag.slang new file mode 100644 index 0000000000..939b207dd9 --- /dev/null +++ b/shaders/conservative_rasterization/slang/triangle.frag.slang @@ -0,0 +1,28 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/conservative_rasterization/slang/triangle.frag.spv b/shaders/conservative_rasterization/slang/triangle.frag.spv new file mode 100644 index 0000000000..57e6ef985c Binary files /dev/null and b/shaders/conservative_rasterization/slang/triangle.frag.spv differ diff --git a/shaders/conservative_rasterization/slang/triangle.vert.slang b/shaders/conservative_rasterization/slang/triangle.vert.slang new file mode 100644 index 0000000000..5f09c7f334 --- /dev/null +++ b/shaders/conservative_rasterization/slang/triangle.vert.slang @@ -0,0 +1,44 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Color; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Color = input.Color; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos, 1.0))); + return output; +} \ No newline at end of file diff --git a/shaders/conservative_rasterization/slang/triangle.vert.spv b/shaders/conservative_rasterization/slang/triangle.vert.spv new file mode 100644 index 0000000000..b18139e2a4 Binary files /dev/null and b/shaders/conservative_rasterization/slang/triangle.vert.spv differ diff --git a/shaders/conservative_rasterization/slang/triangleoverlay.frag.slang b/shaders/conservative_rasterization/slang/triangleoverlay.frag.slang new file mode 100644 index 0000000000..f6eee87537 --- /dev/null +++ b/shaders/conservative_rasterization/slang/triangleoverlay.frag.slang @@ -0,0 +1,22 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[shader("fragment")] +float4 main() +{ + return float4(1.0, 1.0, 1.0, 1.0); +} \ No newline at end of file diff --git a/shaders/conservative_rasterization/slang/triangleoverlay.frag.spv b/shaders/conservative_rasterization/slang/triangleoverlay.frag.spv new file mode 100644 index 0000000000..816bfd9ffe Binary files /dev/null and b/shaders/conservative_rasterization/slang/triangleoverlay.frag.spv differ diff --git a/shaders/constant_data/buffer_array.frag b/shaders/constant_data/buffer_array.frag index 9e147698f4..42442db6bb 100644 --- a/shaders/constant_data/buffer_array.frag +++ b/shaders/constant_data/buffer_array.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,11 +16,11 @@ * limitations under the License. */ +#define MAX_LIGHT_COUNT 8 + precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -28,22 +28,6 @@ layout(location = 2) in vec3 in_normal; layout(location = 0) out vec4 o_color; -struct MVPUniform -{ - mat4 model; - mat4 view_proj; - -#ifdef PUSH_CONSTANT_LIMIT_256 - mat4 scale; - mat4 padding; -#endif -}; - -layout(set = 0, binding = 1) buffer MVPUniformArray -{ - MVPUniform uniform_data[SCENE_MESH_COUNT]; -} mvp_array; - #include "lighting.h" layout(set = 0, binding = 4) uniform LightsInfo @@ -81,11 +65,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = vec4(1.0, 1.0, 1.0, 1.0); -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/constant_data/buffer_array.frag.spv b/shaders/constant_data/buffer_array.frag.spv new file mode 100644 index 0000000000..44473295d5 Binary files /dev/null and b/shaders/constant_data/buffer_array.frag.spv differ diff --git a/shaders/constant_data/buffer_array.vert b/shaders/constant_data/buffer_array.vert index b25f8382b7..ca38b593dc 100644 --- a/shaders/constant_data/buffer_array.vert +++ b/shaders/constant_data/buffer_array.vert @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,6 +16,8 @@ * limitations under the License. */ +#define MAX_SCENE_MESH_COUNT 2048 + layout(location = 0) in vec3 position; layout(location = 1) in vec2 texcoord_0; layout(location = 2) in vec3 normal; @@ -24,16 +26,13 @@ struct MVPUniform { mat4 model; mat4 view_proj; - -#ifdef PUSH_CONSTANT_LIMIT_256 mat4 scale; mat4 padding; -#endif }; layout(set = 0, binding = 1) buffer MVPUniformArray { - MVPUniform uniform_data[SCENE_MESH_COUNT]; + MVPUniform uniform_data[MAX_SCENE_MESH_COUNT]; } mvp_array; layout (location = 0) out vec4 o_pos; @@ -42,15 +41,8 @@ layout (location = 2) out vec3 o_normal; void main(void) { -#ifdef PUSH_CONSTANT_LIMIT_256 o_pos = mvp_array.uniform_data[gl_InstanceIndex].model * mvp_array.uniform_data[gl_InstanceIndex].scale * vec4(position, 1.0); -#else - o_pos = mvp_array.uniform_data[gl_InstanceIndex].model * vec4(position, 1.0); -#endif - o_uv = texcoord_0; - o_normal = mat3(mvp_array.uniform_data[gl_InstanceIndex].model) * normal; - gl_Position = mvp_array.uniform_data[gl_InstanceIndex].view_proj * o_pos; } diff --git a/shaders/constant_data/buffer_array.vert.spv b/shaders/constant_data/buffer_array.vert.spv new file mode 100644 index 0000000000..bffdb1712f Binary files /dev/null and b/shaders/constant_data/buffer_array.vert.spv differ diff --git a/shaders/constant_data/push_constant.frag b/shaders/constant_data/push_constant.frag index dd1b1aafce..42442db6bb 100644 --- a/shaders/constant_data/push_constant.frag +++ b/shaders/constant_data/push_constant.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,11 +16,11 @@ * limitations under the License. */ +#define MAX_LIGHT_COUNT 8 + precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -28,17 +28,6 @@ layout(location = 2) in vec3 in_normal; layout(location = 0) out vec4 o_color; -layout(push_constant, std430) uniform MVPUniform -{ - mat4 model; - mat4 view_proj; - -#ifdef PUSH_CONSTANT_LIMIT_256 - mat4 scale; - mat4 padding; -#endif -} mvp_uniform; - #include "lighting.h" layout(set = 0, binding = 4) uniform LightsInfo @@ -76,11 +65,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = vec4(1.0, 1.0, 1.0, 1.0); -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/constant_data/push_constant.frag.spv b/shaders/constant_data/push_constant.frag.spv new file mode 100644 index 0000000000..44473295d5 Binary files /dev/null and b/shaders/constant_data/push_constant.frag.spv differ diff --git a/shaders/constant_data/push_constant.vert b/shaders/constant_data/push_constant_large.vert similarity index 85% rename from shaders/constant_data/push_constant.vert rename to shaders/constant_data/push_constant_large.vert index ce46aed160..b25595276c 100644 --- a/shaders/constant_data/push_constant.vert +++ b/shaders/constant_data/push_constant_large.vert @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,11 +24,8 @@ layout(push_constant, std430) uniform MVPUniform { mat4 model; mat4 view_proj; - -#ifdef PUSH_CONSTANT_LIMIT_256 mat4 scale; mat4 padding; -#endif } mvp_uniform; layout (location = 0) out vec4 o_pos; @@ -37,15 +34,8 @@ layout (location = 2) out vec3 o_normal; void main(void) { -#ifdef PUSH_CONSTANT_LIMIT_256 o_pos = mvp_uniform.model * mvp_uniform.scale * vec4(position, 1.0); -#else - o_pos = mvp_uniform.model * vec4(position, 1.0); -#endif - o_uv = texcoord_0; - o_normal = mat3(mvp_uniform.model) * normal; - gl_Position = mvp_uniform.view_proj * o_pos; } diff --git a/shaders/constant_data/push_constant_large.vert.spv b/shaders/constant_data/push_constant_large.vert.spv new file mode 100644 index 0000000000..183c3fe42a Binary files /dev/null and b/shaders/constant_data/push_constant_large.vert.spv differ diff --git a/shaders/pbr.vert b/shaders/constant_data/push_constant_small.vert similarity index 54% rename from shaders/pbr.vert rename to shaders/constant_data/push_constant_small.vert index 137dbfebd7..ab29f68ab4 100644 --- a/shaders/pbr.vert +++ b/shaders/constant_data/push_constant_small.vert @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,44 +16,24 @@ * limitations under the License. */ -#define MAX_FORWARD_LIGHT_COUNT 16 - layout(location = 0) in vec3 position; layout(location = 1) in vec2 texcoord_0; layout(location = 2) in vec3 normal; -layout(set = 0, binding = 1) uniform GlobalUniform +layout(push_constant, std430) uniform MVPUniform { mat4 model; mat4 view_proj; - vec3 camera_position; -} -global_uniform; - -struct Light -{ - vec4 position; - vec4 color; -}; - -layout(set = 0, binding = 4) uniform LightsInfo -{ - uint count; - Light lights[MAX_FORWARD_LIGHT_COUNT]; -} -lights; +} mvp_uniform; -layout(location = 0) out vec3 o_pos; -layout(location = 1) out vec2 o_uv; -layout(location = 2) out vec3 o_normal; +layout (location = 0) out vec4 o_pos; +layout (location = 1) out vec2 o_uv; +layout (location = 2) out vec3 o_normal; void main(void) { - o_pos = vec3(global_uniform.model * vec4(position, 1.0)); - - o_uv = texcoord_0; - - o_normal = mat3(global_uniform.model) * normal; - - gl_Position = global_uniform.view_proj * global_uniform.model * vec4(position, 1.0); + o_pos = mvp_uniform.model * vec4(position, 1.0); + o_uv = texcoord_0; + o_normal = mat3(mvp_uniform.model) * normal; + gl_Position = mvp_uniform.view_proj * o_pos; } diff --git a/shaders/constant_data/push_constant_small.vert.spv b/shaders/constant_data/push_constant_small.vert.spv new file mode 100644 index 0000000000..12918fa4eb Binary files /dev/null and b/shaders/constant_data/push_constant_small.vert.spv differ diff --git a/shaders/constant_data/ubo.frag b/shaders/constant_data/ubo.frag index d84ec47301..2b6295da3b 100644 --- a/shaders/constant_data/ubo.frag +++ b/shaders/constant_data/ubo.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,11 +16,11 @@ * limitations under the License. */ +#define MAX_LIGHT_COUNT 8 + precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -32,11 +32,8 @@ layout(set = 0, binding = 1) uniform MVPUniform { mat4 model; mat4 view_proj; - -#ifdef PUSH_CONSTANT_LIMIT_256 mat4 scale; mat4 padding; -#endif } mvp_uniform; #include "lighting.h" @@ -76,11 +73,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = vec4(1.0, 1.0, 1.0, 1.0); -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/constant_data/ubo.frag.spv b/shaders/constant_data/ubo.frag.spv new file mode 100644 index 0000000000..0a6df782dc Binary files /dev/null and b/shaders/constant_data/ubo.frag.spv differ diff --git a/shaders/constant_data/ubo.vert b/shaders/constant_data/ubo_large.vert similarity index 85% rename from shaders/constant_data/ubo.vert rename to shaders/constant_data/ubo_large.vert index 0dcf6e6bf3..ad24a4940b 100644 --- a/shaders/constant_data/ubo.vert +++ b/shaders/constant_data/ubo_large.vert @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -24,11 +24,8 @@ layout(set = 0, binding = 1) uniform MVPUniform { mat4 model; mat4 view_proj; - -#ifdef PUSH_CONSTANT_LIMIT_256 mat4 scale; mat4 padding; -#endif } mvp_uniform; layout (location = 0) out vec4 o_pos; @@ -37,15 +34,8 @@ layout (location = 2) out vec3 o_normal; void main(void) { -#ifdef PUSH_CONSTANT_LIMIT_256 o_pos = mvp_uniform.model * mvp_uniform.scale * vec4(position, 1.0); -#else - o_pos = mvp_uniform.model * vec4(position, 1.0); -#endif - o_uv = texcoord_0; - o_normal = mat3(mvp_uniform.model) * normal; - gl_Position = mvp_uniform.view_proj * o_pos; } diff --git a/shaders/constant_data/ubo_large.vert.spv b/shaders/constant_data/ubo_large.vert.spv new file mode 100644 index 0000000000..b57ff2f00d Binary files /dev/null and b/shaders/constant_data/ubo_large.vert.spv differ diff --git a/shaders/constant_data/ubo_small.vert b/shaders/constant_data/ubo_small.vert new file mode 100644 index 0000000000..375728f4be --- /dev/null +++ b/shaders/constant_data/ubo_small.vert @@ -0,0 +1,39 @@ +#version 320 es +/* Copyright (c) 2019-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) in vec3 position; +layout(location = 1) in vec2 texcoord_0; +layout(location = 2) in vec3 normal; + +layout(set = 0, binding = 1) uniform MVPUniform +{ + mat4 model; + mat4 view_proj; +} mvp_uniform; + +layout (location = 0) out vec4 o_pos; +layout (location = 1) out vec2 o_uv; +layout (location = 2) out vec3 o_normal; + +void main(void) +{ + o_pos = mvp_uniform.model * vec4(position, 1.0); + o_uv = texcoord_0; + o_normal = mat3(mvp_uniform.model) * normal; + gl_Position = mvp_uniform.view_proj * o_pos; +} diff --git a/shaders/constant_data/ubo_small.vert.spv b/shaders/constant_data/ubo_small.vert.spv new file mode 100644 index 0000000000..98eb7666d7 Binary files /dev/null and b/shaders/constant_data/ubo_small.vert.spv differ diff --git a/shaders/debug_utils/glsl/bloom.frag.spv b/shaders/debug_utils/glsl/bloom.frag.spv new file mode 100644 index 0000000000..74109325b0 Binary files /dev/null and b/shaders/debug_utils/glsl/bloom.frag.spv differ diff --git a/shaders/debug_utils/glsl/bloom.vert.spv b/shaders/debug_utils/glsl/bloom.vert.spv new file mode 100644 index 0000000000..7362f82e59 Binary files /dev/null and b/shaders/debug_utils/glsl/bloom.vert.spv differ diff --git a/shaders/debug_utils/glsl/composition.frag.spv b/shaders/debug_utils/glsl/composition.frag.spv new file mode 100644 index 0000000000..5d7ad39dc5 Binary files /dev/null and b/shaders/debug_utils/glsl/composition.frag.spv differ diff --git a/shaders/debug_utils/glsl/composition.vert.spv b/shaders/debug_utils/glsl/composition.vert.spv new file mode 100644 index 0000000000..7362f82e59 Binary files /dev/null and b/shaders/debug_utils/glsl/composition.vert.spv differ diff --git a/shaders/debug_utils/glsl/gbuffer.frag.spv b/shaders/debug_utils/glsl/gbuffer.frag.spv new file mode 100644 index 0000000000..8b4ea1ffc1 Binary files /dev/null and b/shaders/debug_utils/glsl/gbuffer.frag.spv differ diff --git a/shaders/debug_utils/glsl/gbuffer.vert.spv b/shaders/debug_utils/glsl/gbuffer.vert.spv new file mode 100644 index 0000000000..4b206a6e85 Binary files /dev/null and b/shaders/debug_utils/glsl/gbuffer.vert.spv differ diff --git a/shaders/debug_utils/hlsl/bloom.frag.hlsl b/shaders/debug_utils/hlsl/bloom.frag.hlsl index fda19e15f6..4edc5ca634 100644 --- a/shaders/debug_utils/hlsl/bloom.frag.hlsl +++ b/shaders/debug_utils/hlsl/bloom.frag.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -52,8 +52,8 @@ float4 main([[vk::location(0)]] float2 inUV : TEXCOORD0) : SV_TARGET 0.0024499299678342}; - const float blurScale = 0.003; - const float blurStrength = 1.0; + const float blurScale = 0.004; + const float blurStrength = 0.6; float ar = 1.0; // Aspect ratio for vertical blur pass diff --git a/shaders/debug_utils/hlsl/bloom.frag.spv b/shaders/debug_utils/hlsl/bloom.frag.spv index 53b8873486..a64091b893 100644 Binary files a/shaders/debug_utils/hlsl/bloom.frag.spv and b/shaders/debug_utils/hlsl/bloom.frag.spv differ diff --git a/shaders/debug_utils/hlsl/gbuffer.frag.spv b/shaders/debug_utils/hlsl/gbuffer.frag.spv index 92b71c5d15..356d0788f6 100644 Binary files a/shaders/debug_utils/hlsl/gbuffer.frag.spv and b/shaders/debug_utils/hlsl/gbuffer.frag.spv differ diff --git a/shaders/debug_utils/slang/bloom.frag.slang b/shaders/debug_utils/slang/bloom.frag.slang new file mode 100644 index 0000000000..6bf579022e --- /dev/null +++ b/shaders/debug_utils/slang/bloom.frag.slang @@ -0,0 +1,76 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Sampler2D samplerColor0; +Sampler2D samplerColor1; + +[[SpecializationConstant]] const int dir = 0; + +[shader("fragment")] +float4 main(float2 inUV : TEXCOORD0) +{ + // From the OpenGL Super bible + const float weights[] = { 0.0024499299678342, + 0.0043538453346397, + 0.0073599963704157, + 0.0118349786570722, + 0.0181026699707781, + 0.0263392293891488, + 0.0364543006660986, + 0.0479932050577658, + 0.0601029809166942, + 0.0715974486241365, + 0.0811305381519717, + 0.0874493212267511, + 0.0896631113333857, + 0.0874493212267511, + 0.0811305381519717, + 0.0715974486241365, + 0.0601029809166942, + 0.0479932050577658, + 0.0364543006660986, + 0.0263392293891488, + 0.0181026699707781, + 0.0118349786570722, + 0.0073599963704157, + 0.0043538453346397, + 0.0024499299678342}; + + + const float blurScale = 0.003; + const float blurStrength = 1.0; + + float ar = 1.0; + // Aspect ratio for vertical blur pass + if (dir == 1) + { + float2 ts; + samplerColor1.GetDimensions(ts.x, ts.y); + ar = ts.y / ts.x; + } + + float2 P = inUV.yx - float2(0, (weights.getCount() >> 1) * ar * blurScale); + + float4 color = float4(0.0, 0.0, 0.0, 0.0); + for (int i = 0; i < weights.getCount(); i++) + { + float2 dv = float2(0.0, i * blurScale) * ar; + color += samplerColor1.Sample(P + dv) * weights[i] * blurStrength; + } + + return color; +} \ No newline at end of file diff --git a/shaders/debug_utils/slang/bloom.frag.spv b/shaders/debug_utils/slang/bloom.frag.spv new file mode 100644 index 0000000000..e5b9623eb2 Binary files /dev/null and b/shaders/debug_utils/slang/bloom.frag.spv differ diff --git a/shaders/debug_utils/slang/bloom.vert.slang b/shaders/debug_utils/slang/bloom.vert.slang new file mode 100644 index 0000000000..162407b488 --- /dev/null +++ b/shaders/debug_utils/slang/bloom.vert.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex : SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} diff --git a/shaders/debug_utils/slang/bloom.vert.spv b/shaders/debug_utils/slang/bloom.vert.spv new file mode 100644 index 0000000000..26860adcd1 Binary files /dev/null and b/shaders/debug_utils/slang/bloom.vert.spv differ diff --git a/components/windows/tests/entrypoint.test.cpp b/shaders/debug_utils/slang/composition.frag.slang similarity index 67% rename from components/windows/tests/entrypoint.test.cpp rename to shaders/debug_utils/slang/composition.frag.slang index 1110d2a8b8..0d7e4a00b3 100644 --- a/components/windows/tests/entrypoint.test.cpp +++ b/shaders/debug_utils/slang/composition.frag.slang @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Thomas Atkinson +/* Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -15,17 +15,17 @@ * limitations under the License. */ -#define PLATFORM_LINUX -#include +Sampler2D samplerColor0; +Sampler2D samplerColor1; -#include - -CUSTOM_MAIN(context) +struct VSOutput { - if (!dynamic_cast(&context)) - { - throw "context is not a WindowsPlatformContext"; - } + float4 Pos : SV_POSITION; + float2 UV; +}; - return 0; +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerColor0.Sample(input.UV); } \ No newline at end of file diff --git a/shaders/debug_utils/slang/composition.frag.spv b/shaders/debug_utils/slang/composition.frag.spv new file mode 100644 index 0000000000..3da8d86bed Binary files /dev/null and b/shaders/debug_utils/slang/composition.frag.spv differ diff --git a/shaders/debug_utils/slang/composition.vert.slang b/shaders/debug_utils/slang/composition.vert.slang new file mode 100644 index 0000000000..162407b488 --- /dev/null +++ b/shaders/debug_utils/slang/composition.vert.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex : SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} diff --git a/shaders/debug_utils/slang/composition.vert.spv b/shaders/debug_utils/slang/composition.vert.spv new file mode 100644 index 0000000000..26860adcd1 Binary files /dev/null and b/shaders/debug_utils/slang/composition.vert.spv differ diff --git a/shaders/debug_utils/slang/gbuffer.frag.slang b/shaders/debug_utils/slang/gbuffer.frag.slang new file mode 100644 index 0000000000..73fd55d29f --- /dev/null +++ b/shaders/debug_utils/slang/gbuffer.frag.slang @@ -0,0 +1,71 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] Sampler2D samplerEnvMap; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +struct FSOutput +{ + float4 Color0; + float4 Color1; +}; + +[shader("fragment")] +FSOutput main(VSOutput input, uniform float4 offset, uniform float4 color, uniform int object_type) +{ + FSOutput output; + float4 out_color; + + switch (object_type) { + case 0: // Skysphere + { + out_color = samplerEnvMap.Sample(float2(input.UV.x, 1.0 - input.UV.y)); + } + break; + + case 1: // Phong shading + { + float3 ambient = color.rgb * 0.5; + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = max(dot(N, L), 0.0).xxx * color.rgb; + float3 specular = (pow(max(dot(R, V), 0.0), 8.0)).xxx; + out_color = float4(ambient + diffuse + specular, 1.0); + } + break; + } + + // Base color into attachment 0 + output.Color0 = float4(out_color.rgb, 1.0); + + // Bright parts for bloom into attachment 1 + float l = dot(output.Color0.rgb, float3(0.2126, 0.7152, 0.0722)); + float threshold = 0.75; + output.Color1.rgb = (l > threshold) ? output.Color0.rgb : float3(0.0, 0.0, 0.0); + output.Color1.a = 1.0; + return output; +} \ No newline at end of file diff --git a/shaders/debug_utils/slang/gbuffer.frag.spv b/shaders/debug_utils/slang/gbuffer.frag.spv new file mode 100644 index 0000000000..5e51c7a58d Binary files /dev/null and b/shaders/debug_utils/slang/gbuffer.frag.spv differ diff --git a/shaders/debug_utils/slang/gbuffer.vert.slang b/shaders/debug_utils/slang/gbuffer.vert.slang new file mode 100644 index 0000000000..2ff5182828 --- /dev/null +++ b/shaders/debug_utils/slang/gbuffer.vert.slang @@ -0,0 +1,66 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; + float2 UV; +}; + +struct UBO { + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float modelscale; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4 offset, uniform float4 color, uniform int object_type) +{ + VSOutput output; + float3 worldPos; + + switch(object_type) { + case 0: // Skybox + worldPos = mul((float3x3) ubo.skyboxModelview, input.Pos.xyz); + output.Pos = mul(ubo.projection, float4(worldPos, 1.0)); + break; + case 1: // Object + float3 localPos = input.Pos * ubo.modelscale + offset.xyz; + worldPos = mul(ubo.modelview, float4(localPos, 1.0)).xyz; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(localPos, 1.0))); + break; + } + output.Normal = mul((float3x3)ubo.modelview, input.Normal); + output.UV = input.UV; + + float3 lightPos = float3(0.0f, -10.0f, 10.0f); + output.LightVec = lightPos.xyz - worldPos.xyz; + output.ViewVec = -worldPos.xyz; + return output; +} diff --git a/shaders/debug_utils/slang/gbuffer.vert.spv b/shaders/debug_utils/slang/gbuffer.vert.spv new file mode 100644 index 0000000000..61f7c1458b Binary files /dev/null and b/shaders/debug_utils/slang/gbuffer.vert.spv differ diff --git a/shaders/deferred/geometry.frag b/shaders/deferred/geometry.frag index 71605988f0..43f8f3af8c 100644 --- a/shaders/deferred/geometry.frag +++ b/shaders/deferred/geometry.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,7 @@ precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE layout (set=0, binding=0) uniform sampler2D base_color_texture; -#endif layout (location = 0) in vec4 in_pos; layout (location = 1) in vec2 in_uv; @@ -49,11 +47,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = pbr_material_uniform.base_color_factor; -#endif o_albedo = base_color; } diff --git a/shaders/deferred/geometry.frag.spv b/shaders/deferred/geometry.frag.spv new file mode 100644 index 0000000000..93450e2dcd Binary files /dev/null and b/shaders/deferred/geometry.frag.spv differ diff --git a/shaders/deferred/geometry.vert.spv b/shaders/deferred/geometry.vert.spv new file mode 100644 index 0000000000..77397e5f12 Binary files /dev/null and b/shaders/deferred/geometry.vert.spv differ diff --git a/shaders/deferred/lighting.frag b/shaders/deferred/lighting.frag index c5c4428782..41751c6ce1 100644 --- a/shaders/deferred/lighting.frag +++ b/shaders/deferred/lighting.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -35,9 +35,9 @@ global_uniform; layout(set = 0, binding = 4) uniform LightsInfo { - Light directional_lights[MAX_LIGHT_COUNT]; - Light point_lights[MAX_LIGHT_COUNT]; - Light spot_lights[MAX_LIGHT_COUNT]; + Light directional_lights[48]; + Light point_lights[48]; + Light spot_lights[48]; } lights_info; diff --git a/shaders/deferred/lighting.frag.spv b/shaders/deferred/lighting.frag.spv new file mode 100644 index 0000000000..e4ef8c2a3f Binary files /dev/null and b/shaders/deferred/lighting.frag.spv differ diff --git a/shaders/deferred/lighting.vert.spv b/shaders/deferred/lighting.vert.spv new file mode 100644 index 0000000000..cf04ec75b5 Binary files /dev/null and b/shaders/deferred/lighting.vert.spv differ diff --git a/shaders/descriptor_buffer_basic/glsl/cube.frag.spv b/shaders/descriptor_buffer_basic/glsl/cube.frag.spv new file mode 100644 index 0000000000..6220e5e493 Binary files /dev/null and b/shaders/descriptor_buffer_basic/glsl/cube.frag.spv differ diff --git a/shaders/descriptor_buffer_basic/glsl/cube.vert b/shaders/descriptor_buffer_basic/glsl/cube.vert index 43a8bdb35b..df6a230c6c 100644 --- a/shaders/descriptor_buffer_basic/glsl/cube.vert +++ b/shaders/descriptor_buffer_basic/glsl/cube.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023-2024, Sascha Willems +/* Copyright (c) 2023-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -17,8 +17,7 @@ */ layout (location = 0) in vec3 inPos; -layout (location = 1) in vec3 inNormal; -layout (location = 2) in vec2 inUV; +layout (location = 1) in vec2 inUV; layout (set = 0, binding = 0) uniform UBOScene { mat4 projection; diff --git a/shaders/descriptor_buffer_basic/glsl/cube.vert.spv b/shaders/descriptor_buffer_basic/glsl/cube.vert.spv new file mode 100644 index 0000000000..6eee67a683 Binary files /dev/null and b/shaders/descriptor_buffer_basic/glsl/cube.vert.spv differ diff --git a/shaders/descriptor_buffer_basic/hlsl/cube.vert.hlsl b/shaders/descriptor_buffer_basic/hlsl/cube.vert.hlsl index 7afdcdca89..6cd690e60f 100644 --- a/shaders/descriptor_buffer_basic/hlsl/cube.vert.hlsl +++ b/shaders/descriptor_buffer_basic/hlsl/cube.vert.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -18,8 +18,7 @@ struct VSInput { [[vk::location(0)]] float3 Pos : POSITION0; - [[vk::location(1)]] float3 Normal : NORMAL0; - [[vk::location(2)]] float2 UV : TEXCOORD0; + [[vk::location(1)]] float2 UV : TEXCOORD0; }; struct UBOCamera diff --git a/shaders/descriptor_buffer_basic/hlsl/cube.vert.spv b/shaders/descriptor_buffer_basic/hlsl/cube.vert.spv index 580d0d31c5..4e07bc6f0b 100644 Binary files a/shaders/descriptor_buffer_basic/hlsl/cube.vert.spv and b/shaders/descriptor_buffer_basic/hlsl/cube.vert.spv differ diff --git a/shaders/descriptor_buffer_basic/slang/cube.frag.slang b/shaders/descriptor_buffer_basic/slang/cube.frag.slang new file mode 100644 index 0000000000..8d5f117321 --- /dev/null +++ b/shaders/descriptor_buffer_basic/slang/cube.frag.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[[vk::binding(0, 2)]] Sampler2D samplerColorMap; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerColorMap.Sample(input.UV); +} \ No newline at end of file diff --git a/shaders/descriptor_buffer_basic/slang/cube.frag.spv b/shaders/descriptor_buffer_basic/slang/cube.frag.spv new file mode 100644 index 0000000000..f7b54d9c1b Binary files /dev/null and b/shaders/descriptor_buffer_basic/slang/cube.frag.spv differ diff --git a/shaders/descriptor_buffer_basic/slang/cube.vert.slang b/shaders/descriptor_buffer_basic/slang/cube.vert.slang new file mode 100644 index 0000000000..7e56262d7d --- /dev/null +++ b/shaders/descriptor_buffer_basic/slang/cube.vert.slang @@ -0,0 +1,48 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +struct UBOCamera { + float4x4 projection; + float4x4 view; +}; +ConstantBuffer uboCamera; + +struct UBOModel { + float4x4 local; +}; +[[vk::binding(0, 1)]] ConstantBuffer uboModel; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(uboCamera.projection, mul(uboCamera.view, mul(uboModel.local, float4(input.Pos.xyz, 1.0)))); + return output; +} \ No newline at end of file diff --git a/shaders/descriptor_buffer_basic/slang/cube.vert.spv b/shaders/descriptor_buffer_basic/slang/cube.vert.spv new file mode 100644 index 0000000000..f22d5c5e9a Binary files /dev/null and b/shaders/descriptor_buffer_basic/slang/cube.vert.spv differ diff --git a/shaders/descriptor_indexing/glsl/nonuniform-quads.frag.spv b/shaders/descriptor_indexing/glsl/nonuniform-quads.frag.spv new file mode 100644 index 0000000000..ec2f58f0ae Binary files /dev/null and b/shaders/descriptor_indexing/glsl/nonuniform-quads.frag.spv differ diff --git a/shaders/descriptor_indexing/glsl/nonuniform-quads.vert.spv b/shaders/descriptor_indexing/glsl/nonuniform-quads.vert.spv new file mode 100644 index 0000000000..c37928d289 Binary files /dev/null and b/shaders/descriptor_indexing/glsl/nonuniform-quads.vert.spv differ diff --git a/shaders/descriptor_indexing/glsl/update-after-bind-quads.frag.spv b/shaders/descriptor_indexing/glsl/update-after-bind-quads.frag.spv new file mode 100644 index 0000000000..0fa042a14b Binary files /dev/null and b/shaders/descriptor_indexing/glsl/update-after-bind-quads.frag.spv differ diff --git a/shaders/descriptor_indexing/glsl/update-after-bind-quads.vert.spv b/shaders/descriptor_indexing/glsl/update-after-bind-quads.vert.spv new file mode 100644 index 0000000000..1bc2c27b97 Binary files /dev/null and b/shaders/descriptor_indexing/glsl/update-after-bind-quads.vert.spv differ diff --git a/shaders/descriptor_indexing/hlsl/nonuniform-quads.vert.spv b/shaders/descriptor_indexing/hlsl/nonuniform-quads.vert.spv index ca1e0053f4..f34017dbcc 100644 Binary files a/shaders/descriptor_indexing/hlsl/nonuniform-quads.vert.spv and b/shaders/descriptor_indexing/hlsl/nonuniform-quads.vert.spv differ diff --git a/shaders/descriptor_indexing/hlsl/update-after-bind-quads.vert.spv b/shaders/descriptor_indexing/hlsl/update-after-bind-quads.vert.spv index 4d0023c583..4b17a49425 100644 Binary files a/shaders/descriptor_indexing/hlsl/update-after-bind-quads.vert.spv and b/shaders/descriptor_indexing/hlsl/update-after-bind-quads.vert.spv differ diff --git a/shaders/descriptor_indexing/slang/nonuniform-quads.frag.slang b/shaders/descriptor_indexing/slang/nonuniform-quads.frag.slang new file mode 100644 index 0000000000..8001ffd00b --- /dev/null +++ b/shaders/descriptor_indexing/slang/nonuniform-quads.frag.slang @@ -0,0 +1,94 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + nointerpolation uint TextureIndex; +}; + +[[vk::binding(0, 0)]] Texture2D Textures[]; +[[vk::binding(0, 1)]] SamplerState ImmutableSampler; + +[shader("fragment")] +float4 main(VSOutput input) +{ + // Here we are indexing into the texture array, with a non-uniform index. + // Across the draw-call, there are different instance indices being used, so we must use nonuniformEXT. + // It is important to note that to be 100% correct, we must use: + // nonuniformEXT(sampler2D()). + // It is the final argument to a call like texture() which determines if the access is to be considered non-uniform. + // It is very common in the wild to see code like: + // - sampler2D(Textures[nonuniformEXT(in_texture_index)], ...) + // This looks very similar to HLSL, but it is somewhat wrong. + // Generally, it will work on drivers, but it is not technically correct. + + // To quote GL_EXT_nonuniform_qualifier: + + /* + Only some operations discussed in Chapter 5 (Operators and Expressions) + can be applied to nonuniform value(s) and still yield a result that is + nonuniform. The operations that do so are listed below. When a + nonuniform value is operated on with one of these operators (regardless + of whether any and other operands are nonuniform), the result is + implicitly nonuniform: + + ... + + * Structure and Array Operations in Section 5.7, except for the length + method and assignment operator. + + ... + + Constructors and builtin functions, which all have return types that + are not qualified by nonuniformEXT, will not generate nonuniform results. + Shaders need to use the constructor syntax (or assignment to a + nonuniformEXT-qualified variable) to re-add the nonuniformEXT qualifier + to the result of builtin functions. + + ... + */ + + // sampler2D is such a constructor, so we must add nonuniformEXT afterwards. + return Textures[NonUniformResourceIndex(input.TextureIndex)].Sample(ImmutableSampler, input.UV); + + // For all other use cases of nonuniformEXT however, we can write code like: + // uniform UBO { vec4 data; } UBOs[]; vec4 foo = UBOs[nonuniformEXT(index)].data; + // buffer SSBO { vec4 data; } SSBOs[]; vec4 foo = SSBOs[nonuniformEXT(index)].data; + // uniform sampler2D Tex[]; vec4 foo = texture(Tex[nonuniformEXT(index)], uv); + // uniform uimage2D Img[]; uint count = imageAtomicAdd(Img[nonuniformEXT(index)], uv, val); + // etc. The nonuniform qualifier will propagate up to the final argument which is used in the load/store or atomic operation. + + // Using implicit LOD with nonuniformEXT can be spicy! If the threads in a quad do not have the same index, + // LOD might not be computed correctly. The quadDivergentImplicitLOD property lets you know if it will work. + // In this case however, it is completely fine, since the helper lanes in a quad must come from the same primitive, + // which all have the same flat fragment input. + + // You might consider using subgroup operations to implement nonuniformEXT on your own. + // This is technically out of spec, since the SPIR-V specification states that to avoid nonuniformEXT, + // the shader must guarantee that the index is "dynamically uniform". + // "Dynamically uniform" means the value is the same across all invocations in an "invocation group". + // The invocation group is defined to be all invocations (threads) for: + // - An entire draw command (for graphics) + // - A single workgroup (for compute). + // Avoiding nonuniformEXT with clever programming is far more likely to succeed when writing compute shaders, + // since the workgroup boundary serves as a much easier boundary to control than entire draw commands. + // It is often possible to match workgroup to subgroup 1:1, unlike graphics where you cannot control how + // quads are packed into subgroups at all. + // The recommended approach here is to just let the compiler do its thing to avoid horrible bugs in the future. +} diff --git a/shaders/descriptor_indexing/slang/nonuniform-quads.frag.spv b/shaders/descriptor_indexing/slang/nonuniform-quads.frag.spv new file mode 100644 index 0000000000..889af0c1eb Binary files /dev/null and b/shaders/descriptor_indexing/slang/nonuniform-quads.frag.spv differ diff --git a/shaders/descriptor_indexing/slang/nonuniform-quads.vert.slang b/shaders/descriptor_indexing/slang/nonuniform-quads.vert.slang new file mode 100644 index 0000000000..cbd49042ab --- /dev/null +++ b/shaders/descriptor_indexing/slang/nonuniform-quads.vert.slang @@ -0,0 +1,50 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + nointerpolation uint TextureIndex; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID, uint InstanceIndex: SV_VulkanInstanceID, uniform float registers_phase) +{ + VSOutput output; + + float2 local_offset = float2(VertexIndex & 1, VertexIndex >> 1); + output.UV = local_offset; + + // A lazy quad rotation, could easily have been precomputed on CPU. + float cos_phase = cos(registers_phase); + float sin_phase = sin(registers_phase); + local_offset = mul(float2x2(cos_phase, -sin_phase, sin_phase, cos_phase), (local_offset - 0.5)); + + // To keep the sample as simple as possible, use InstanceIndex to move the quads around on screen. + int instance_x = InstanceIndex % 8; + int instance_y = InstanceIndex / 8; + float2 instance_offset = float2(instance_x, instance_y) / float2(15.0, 7.0); + instance_offset = 2.1 * (instance_offset - 0.5); + + output.Pos = float4((0.10 * local_offset) + instance_offset, 0.0, 1.0); + + // Pass down an index which we will use to index into the descriptor array. + output.TextureIndex = InstanceIndex; + + return output; +} diff --git a/shaders/descriptor_indexing/slang/nonuniform-quads.vert.spv b/shaders/descriptor_indexing/slang/nonuniform-quads.vert.spv new file mode 100644 index 0000000000..311fec15ec Binary files /dev/null and b/shaders/descriptor_indexing/slang/nonuniform-quads.vert.spv differ diff --git a/shaders/descriptor_indexing/slang/update-after-bind-quads.frag.slang b/shaders/descriptor_indexing/slang/update-after-bind-quads.frag.slang new file mode 100644 index 0000000000..bc79e2043c --- /dev/null +++ b/shaders/descriptor_indexing/slang/update-after-bind-quads.frag.slang @@ -0,0 +1,44 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[[vk::binding(0, 0)]] Texture2D Textures[]; +[[vk::binding(0, 1)]] SamplerState ImmutableSampler; + +struct Registers +{ + [[vk::offset(4)]] uint table_offset; +}; +[[vk::push_constant]] Registers registers; + +[shader("fragment")] +float4 main(VSOutput input) +{ + // This is a very common usage pattern for streamed descriptors with UPDATE_AFTER_BIND. + // We only need to update push constants, and our materials can access new descriptors. + // This avoids having to allocate and manage individual descriptor sets. + // It does mean that the chance to introduce bugs is higher however ... + + // A push constant must be dynamically uniform over our draw call, so we do not have to do anything here. + // This is simply considered dynamic indexing, which is a feature in core Vulkan 1.0. + return Textures[registers.table_offset].Sample(ImmutableSampler, input.UV); +} diff --git a/shaders/descriptor_indexing/slang/update-after-bind-quads.frag.spv b/shaders/descriptor_indexing/slang/update-after-bind-quads.frag.spv new file mode 100644 index 0000000000..a3db2c71b4 Binary files /dev/null and b/shaders/descriptor_indexing/slang/update-after-bind-quads.frag.spv differ diff --git a/shaders/descriptor_indexing/slang/update-after-bind-quads.vert.slang b/shaders/descriptor_indexing/slang/update-after-bind-quads.vert.slang new file mode 100644 index 0000000000..3a6e4de38d --- /dev/null +++ b/shaders/descriptor_indexing/slang/update-after-bind-quads.vert.slang @@ -0,0 +1,46 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID, uint InstanceIndex: SV_VulkanInstanceID, uniform float registers_phase) +{ + VSOutput output; + + float2 local_offset = float2(VertexIndex & 1, VertexIndex >> 1); + output.UV = local_offset; + + // A lazy quad rotation, could easily have been precomputed on CPU. + float cos_phase = cos(registers_phase); + float sin_phase = sin(registers_phase); + local_offset = mul(float2x2(cos_phase, -sin_phase, sin_phase, cos_phase), (local_offset - 0.5)); + + // To keep the sample as simple as possible, use InstanceIndex to move the quads around on screen. + int instance_x = InstanceIndex % 8 + 8; + int instance_y = InstanceIndex / 8; + float2 instance_offset = float2(instance_x, instance_y) / float2(15.0, 7.0); + instance_offset = 2.1 * (instance_offset - 0.5); + + output.Pos = float4((0.10 * local_offset) + instance_offset, 0.0, 1.0); + + return output; +} diff --git a/shaders/descriptor_indexing/slang/update-after-bind-quads.vert.spv b/shaders/descriptor_indexing/slang/update-after-bind-quads.vert.spv new file mode 100644 index 0000000000..1254b1e3e5 Binary files /dev/null and b/shaders/descriptor_indexing/slang/update-after-bind-quads.vert.spv differ diff --git a/shaders/dynamic_blending/glsl/blending.frag.spv b/shaders/dynamic_blending/glsl/blending.frag.spv new file mode 100644 index 0000000000..ef77f827bb Binary files /dev/null and b/shaders/dynamic_blending/glsl/blending.frag.spv differ diff --git a/shaders/dynamic_blending/glsl/blending.vert.spv b/shaders/dynamic_blending/glsl/blending.vert.spv new file mode 100644 index 0000000000..c915feea03 Binary files /dev/null and b/shaders/dynamic_blending/glsl/blending.vert.spv differ diff --git a/shaders/dynamic_blending/slang/blending.frag.slang b/shaders/dynamic_blending/slang/blending.frag.slang new file mode 100644 index 0000000000..ef284ea400 --- /dev/null +++ b/shaders/dynamic_blending/slang/blending.frag.slang @@ -0,0 +1,50 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + nointerpolation uint ColorOffset; +}; + +struct Col +{ + float4 data[8]; +}; +[[vk::binding(1, 0)]] ConstantBuffer color; + +float4 sampleColor(VSOutput input) +{ + float4 c00 = color.data[0 + input.ColorOffset]; + float4 c01 = color.data[1 + input.ColorOffset]; + float4 c02 = color.data[2 + input.ColorOffset]; + float4 c03 = color.data[3 + input.ColorOffset]; + + float4 b0 = lerp(c00, c01, input.UV.x); + float4 b1 = lerp(c02, c03, input.UV.x); + + float4 p0 = lerp(b0, b1, input.UV.y); + + return p0; +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + return sampleColor(input); +} \ No newline at end of file diff --git a/shaders/dynamic_blending/slang/blending.frag.spv b/shaders/dynamic_blending/slang/blending.frag.spv new file mode 100644 index 0000000000..016877f9b4 Binary files /dev/null and b/shaders/dynamic_blending/slang/blending.frag.spv differ diff --git a/shaders/dynamic_blending/slang/blending.vert.slang b/shaders/dynamic_blending/slang/blending.vert.slang new file mode 100644 index 0000000000..0dabab8e40 --- /dev/null +++ b/shaders/dynamic_blending/slang/blending.vert.slang @@ -0,0 +1,47 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float2 UV; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + nointerpolation uint ColorOffset; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.ColorOffset = input.Pos.z == 1.0 ? 4 : 0; + output.Pos = mul(ubo.projection, mul(ubo.view, mul(ubo.model, float4(input.Pos.xyz, 1.0)))); + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_blending/slang/blending.vert.spv b/shaders/dynamic_blending/slang/blending.vert.spv new file mode 100644 index 0000000000..a56e7edf9f Binary files /dev/null and b/shaders/dynamic_blending/slang/blending.vert.spv differ diff --git a/shaders/dynamic_line_rasterization/glsl/base.frag.spv b/shaders/dynamic_line_rasterization/glsl/base.frag.spv new file mode 100644 index 0000000000..a31536ff02 Binary files /dev/null and b/shaders/dynamic_line_rasterization/glsl/base.frag.spv differ diff --git a/shaders/dynamic_line_rasterization/glsl/base.vert.spv b/shaders/dynamic_line_rasterization/glsl/base.vert.spv new file mode 100644 index 0000000000..5ce07eb2cb Binary files /dev/null and b/shaders/dynamic_line_rasterization/glsl/base.vert.spv differ diff --git a/shaders/dynamic_line_rasterization/glsl/grid.frag.spv b/shaders/dynamic_line_rasterization/glsl/grid.frag.spv new file mode 100644 index 0000000000..82a032ce9e Binary files /dev/null and b/shaders/dynamic_line_rasterization/glsl/grid.frag.spv differ diff --git a/shaders/dynamic_line_rasterization/glsl/grid.vert.spv b/shaders/dynamic_line_rasterization/glsl/grid.vert.spv new file mode 100644 index 0000000000..970c5b5ce6 Binary files /dev/null and b/shaders/dynamic_line_rasterization/glsl/grid.vert.spv differ diff --git a/shaders/dynamic_line_rasterization/hlsl/grid.frag.spv b/shaders/dynamic_line_rasterization/hlsl/grid.frag.spv index 8bb62bb880..c1096c233c 100644 Binary files a/shaders/dynamic_line_rasterization/hlsl/grid.frag.spv and b/shaders/dynamic_line_rasterization/hlsl/grid.frag.spv differ diff --git a/shaders/dynamic_line_rasterization/hlsl/grid.vert.spv b/shaders/dynamic_line_rasterization/hlsl/grid.vert.spv index 5b5e7e6126..b67111b609 100644 Binary files a/shaders/dynamic_line_rasterization/hlsl/grid.vert.spv and b/shaders/dynamic_line_rasterization/hlsl/grid.vert.spv differ diff --git a/shaders/dynamic_line_rasterization/slang/base.frag.slang b/shaders/dynamic_line_rasterization/slang/base.frag.slang new file mode 100644 index 0000000000..ff902259ea --- /dev/null +++ b/shaders/dynamic_line_rasterization/slang/base.frag.slang @@ -0,0 +1,22 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[shader("fragment")] +float4 main(uniform float4 color) +{ + return color; +} \ No newline at end of file diff --git a/shaders/dynamic_line_rasterization/slang/base.frag.spv b/shaders/dynamic_line_rasterization/slang/base.frag.spv new file mode 100644 index 0000000000..409a30ae53 Binary files /dev/null and b/shaders/dynamic_line_rasterization/slang/base.frag.spv differ diff --git a/shaders/dynamic_line_rasterization/slang/base.vert.slang b/shaders/dynamic_line_rasterization/slang/base.vert.slang new file mode 100644 index 0000000000..50501ddb7b --- /dev/null +++ b/shaders/dynamic_line_rasterization/slang/base.vert.slang @@ -0,0 +1,42 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Pos = mul(ubo.projection, mul(ubo.view, mul(ubo.model, float4(input.Pos - float3(0.0f, 1.0f, 0.0f), 1.0)))); + return output; +} diff --git a/shaders/dynamic_line_rasterization/slang/base.vert.spv b/shaders/dynamic_line_rasterization/slang/base.vert.spv new file mode 100644 index 0000000000..f620735360 Binary files /dev/null and b/shaders/dynamic_line_rasterization/slang/base.vert.spv differ diff --git a/shaders/dynamic_line_rasterization/slang/grid.frag.slang b/shaders/dynamic_line_rasterization/slang/grid.frag.slang new file mode 100644 index 0000000000..6414c3b58c --- /dev/null +++ b/shaders/dynamic_line_rasterization/slang/grid.frag.slang @@ -0,0 +1,63 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 nearPoint; + float3 farPoint; + float4x4 view; + float4x4 projection; +}; + +float4 grid(float3 pos) { + float2 coord = pos.xz; + float2 derivative = fwidth(coord); + float2 grid = abs(frac(coord - 0.5) - 0.5) / derivative; + float _line = min(grid.x, grid.y); + float minimumz = min(derivative.y, 1); + float minimumx = min(derivative.x, 1); + float4 color = float4(0.5, 0.5, 0.5, 1.0 - min(_line, 1.0)); + + if(abs(pos.x) < minimumx) + color.y = 1; + if(abs(pos.z) < minimumz) + color.x = 1; + return color; +} + +float fadeFactor(float3 pos, VSOutput input) { + float z = mul(input.projection, mul(input.view, float4(pos.xyz, 1.0))).z; + // Empirical values are used to determine when to cut off the grid before moire patterns become visible. + return z * 6 - 0.5; +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + float t = -input.nearPoint.y / (input.farPoint.y - input.nearPoint.y); + float3 pos = input.nearPoint + t * (input.farPoint - input.nearPoint); + + // Display only the lower plane + if(t < 1.0) { + float4 gridColor = grid(pos); + return float4(gridColor.xyz, gridColor.w * fadeFactor(pos, input)); + } + else { + return float4(0.0); + } +} diff --git a/shaders/dynamic_line_rasterization/slang/grid.frag.spv b/shaders/dynamic_line_rasterization/slang/grid.frag.spv new file mode 100644 index 0000000000..5c16cb153f Binary files /dev/null and b/shaders/dynamic_line_rasterization/slang/grid.frag.spv differ diff --git a/shaders/dynamic_line_rasterization/slang/grid.vert.slang b/shaders/dynamic_line_rasterization/slang/grid.vert.slang new file mode 100644 index 0000000000..cc1076e3d0 --- /dev/null +++ b/shaders/dynamic_line_rasterization/slang/grid.vert.slang @@ -0,0 +1,64 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + struct VSInput +{ + float3 Pos : POSITION0; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; + float4x4 viewProjectionInverse; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 nearPoint; + float3 farPoint; + float4x4 view; + float4x4 projection; +}; + +float3 unprojectPoint(float x, float y, float z, float4x4 viewProjectionInverse) { + float4 clipSpacePos = float4(x, y, z, 1.0); + float4 eyeSpacePos = mul(viewProjectionInverse, clipSpacePos); + return eyeSpacePos.xyz / eyeSpacePos.w; +} + +static float3 gridPlane[6] = { + float3(1, 1, 0), float3(-1, -1, 0), float3(-1, 1, 0), + float3(-1, -1, 0), float3(1, 1, 0), float3(1, -1, 0) +}; + +[shader("vertex")] +VSOutput main(VSInput input, uint VertexIndex : SV_VertexID) +{ + float3 pos = gridPlane[VertexIndex].xyz; + + VSOutput output; + output.nearPoint = unprojectPoint(pos.x, pos.y, 0.0, ubo.viewProjectionInverse); + output.farPoint = unprojectPoint(pos.x, pos.y, 1.0, ubo.viewProjectionInverse); + output.view = ubo.view; + output.projection = ubo.projection; + output.Pos = float4(pos, 1.0); + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_line_rasterization/slang/grid.vert.spv b/shaders/dynamic_line_rasterization/slang/grid.vert.spv new file mode 100644 index 0000000000..becd1fa84b Binary files /dev/null and b/shaders/dynamic_line_rasterization/slang/grid.vert.spv differ diff --git a/shaders/dynamic_multisample_rasterization/glsl/model.frag b/shaders/dynamic_multisample_rasterization/glsl/model.frag new file mode 100644 index 0000000000..7377a4233e --- /dev/null +++ b/shaders/dynamic_multisample_rasterization/glsl/model.frag @@ -0,0 +1,76 @@ +#version 450 +/* Copyright (c) 2024-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (location = 0) in vec3 inNormal; +layout (location = 1) in vec2 inUV; +layout (location = 2) in vec3 inViewVec; +layout (location = 3) in vec3 inLightVec; +layout (location = 4) flat in vec4 inBaseColorFactor; +layout (location = 5) flat in float inMetallicFactor; +layout (location = 6) flat in float inRoughnessFactor; +layout (location = 7) flat in uint inBaseTextureIndex; +layout (location = 8) flat in uint inNormalTextureIndex; +layout (location = 9) flat in uint inMetallicRoughnessTextureIndex; + +layout(binding = 1, set = 0) uniform sampler2D textures[15]; + +layout (location = 0) out vec4 outFragColor; + +vec4 getColor() +{ + vec4 color = inBaseColorFactor; + + if (inBaseTextureIndex != -1) + color = texture(textures[uint(round(inBaseTextureIndex))], inUV); + + return color; +} + +vec3 getNormal() +{ + vec3 normal = inNormal; + + if (inNormalTextureIndex != -1) + normal = texture(textures[uint(round(inNormalTextureIndex))], inUV).xyz * 2.0 - 1.0; + + return normal; +} + +vec3 getPBR() +{ + vec3 pbr = vec3(inMetallicFactor, inRoughnessFactor, 0.0); + + if (inMetallicRoughnessTextureIndex != -1) + pbr = texture(textures[uint(round(inMetallicRoughnessTextureIndex))], inUV).xyz; + + return pbr; +} + +void main() +{ + vec3 N = normalize(getNormal()); + vec3 L = normalize(inLightVec); + vec3 V = normalize(inViewVec); + vec3 R = reflect(-L, N); + vec3 ambient = vec3(0.25); + vec3 diffuse = max(dot(N, L), 0.0) * vec3(0.75) * getPBR(); + vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.75); + + vec4 base_color = getColor(); + outFragColor = vec4(ambient * base_color.rgb + specular, base_color.a); +} diff --git a/shaders/dynamic_multisample_rasterization/glsl/model.frag.spv b/shaders/dynamic_multisample_rasterization/glsl/model.frag.spv new file mode 100644 index 0000000000..d582ea759d Binary files /dev/null and b/shaders/dynamic_multisample_rasterization/glsl/model.frag.spv differ diff --git a/shaders/dynamic_multisample_rasterization/glsl/model.vert b/shaders/dynamic_multisample_rasterization/glsl/model.vert new file mode 100644 index 0000000000..7f337136c9 --- /dev/null +++ b/shaders/dynamic_multisample_rasterization/glsl/model.vert @@ -0,0 +1,66 @@ +#version 450 +/* Copyright (c) 2024-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (location = 0) in vec3 inPos; +layout (location = 1) in vec3 inNormal; +layout (location = 2) in vec2 inUV; + +layout (set = 0, binding = 0) uniform UBO { + mat4 projection; + mat4 view; +} ubo; + +layout(push_constant) uniform Push_Constants { + mat4 model; + + vec4 base_color_factor; + float metallic_factor; + float roughness_factor; + + uint baseTextureIndex; + uint normalTextureIndex; + uint metallicRoughnessTextureIndex; +} push_constants; + +layout (location = 0) out vec3 outNormal; +layout (location = 1) out vec2 outUV; +layout (location = 2) out vec3 outViewVec; +layout (location = 3) out vec3 outLightVec; +layout (location = 4) out vec4 outBaseColorFactor; +layout (location = 5) out float outMetallicFactor; +layout (location = 6) out float outRoughnessFactor; +layout (location = 7) out uint outBaseTextureIndex; +layout (location = 8) out uint outNormalTextureIndex; +layout (location = 9) out uint outMetallicRoughnessTextureIndex; + +void main() +{ + outUV = inUV; + vec4 localPos = ubo.view * push_constants.model * vec4(inPos, 1.0); + gl_Position = ubo.projection * localPos; + outNormal = mat3(ubo.view * push_constants.model) * inNormal; + vec3 lightPos = vec3(10.0, -10.0, 10.0); + outLightVec = lightPos.xyz; + outViewVec = -localPos.xyz; + outBaseColorFactor = push_constants.base_color_factor; + outMetallicFactor = push_constants.metallic_factor; + outRoughnessFactor = push_constants.roughness_factor; + outBaseTextureIndex = push_constants.baseTextureIndex; + outNormalTextureIndex = push_constants.normalTextureIndex; + outMetallicRoughnessTextureIndex = push_constants.metallicRoughnessTextureIndex; +} diff --git a/shaders/dynamic_multisample_rasterization/glsl/model.vert.spv b/shaders/dynamic_multisample_rasterization/glsl/model.vert.spv new file mode 100644 index 0000000000..b903c86444 Binary files /dev/null and b/shaders/dynamic_multisample_rasterization/glsl/model.vert.spv differ diff --git a/shaders/dynamic_multisample_rasterization/slang/model.frag.slang b/shaders/dynamic_multisample_rasterization/slang/model.frag.slang new file mode 100644 index 0000000000..18eded5be4 --- /dev/null +++ b/shaders/dynamic_multisample_rasterization/slang/model.frag.slang @@ -0,0 +1,79 @@ +/* Copyright (c) 2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; + nointerpolation float4 BaseColorFactor; + nointerpolation float MetallicFactor; + nointerpolation float RoughnessFactor; + nointerpolation uint BaseTextureIndex; + nointerpolation uint NormalTextureIndex; + nointerpolation uint MetallicRoughnessTextureIndex; +}; + +[[vk::binding(1, 0)]] Sampler2D Textures[15]; + +float4 getColor(in VSOutput input) +{ + float4 color = input.BaseColorFactor; + + if (input.BaseTextureIndex != -1) + color = Textures[uint(round(input.BaseTextureIndex))].Sample(input.UV); + + return color; +} + +float3 getNormal(in VSOutput input) +{ + float3 normal = input.Normal; + + if (input.NormalTextureIndex != -1) + normal = Textures[uint(round(input.NormalTextureIndex))].Sample(input.UV).xyz * 2.0 - 1.0; + + return normal; +} + +float3 getPBR(in VSOutput input) +{ + float3 pbr = float3(input.MetallicFactor, input.RoughnessFactor, 0.0); + + if (input.MetallicRoughnessTextureIndex != -1) + pbr = Textures[uint(round(input.MetallicRoughnessTextureIndex))].Sample(input.UV).xyz; + + return pbr; +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + float3 N = normalize(getNormal(input)); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 ambient = float3(0.25); + float3 diffuse = max(dot(N, L), 0.0) * float3(0.75) * getPBR(input); + float3 specular = pow(max(dot(R, V), 0.0), 16.0) * float3(0.75); + + float4 base_color = getColor(input); + return float4(ambient * base_color.rgb + specular, base_color.a); +} diff --git a/shaders/dynamic_multisample_rasterization/slang/model.frag.spv b/shaders/dynamic_multisample_rasterization/slang/model.frag.spv new file mode 100644 index 0000000000..f616395bd4 Binary files /dev/null and b/shaders/dynamic_multisample_rasterization/slang/model.frag.spv differ diff --git a/shaders/dynamic_multisample_rasterization/slang/model.vert.slang b/shaders/dynamic_multisample_rasterization/slang/model.vert.slang new file mode 100644 index 0000000000..031ae08313 --- /dev/null +++ b/shaders/dynamic_multisample_rasterization/slang/model.vert.slang @@ -0,0 +1,78 @@ +/* Copyright (c) 2024-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; + nointerpolation float4 BaseColorFactor; + nointerpolation float MetallicFactor; + nointerpolation float RoughnessFactor; + nointerpolation uint BaseTextureIndex; + nointerpolation uint NormalTextureIndex; + nointerpolation uint MetallicRoughnessTextureIndex; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct Push_Constants { + float4x4 model; + + float4 base_color_factor; + float metallic_factor; + float roughness_factor; + + uint baseTextureIndex; + uint normalTextureIndex; + uint metallicRoughnessTextureIndex; +} ; + +[shader("vertex")] +VSOutput main(VSInput input, uniform Push_Constants push_constants) +{ + VSOutput output; + output.UV = input.UV; + float4 localPos = mul(ubo.view, mul(push_constants.model, float4(input.Pos, 1.0))); + output.Pos = mul(ubo.projection, localPos); + output.Normal = mul(float3x3(mul(ubo.view, push_constants.model)), input.Normal); + float3 lightPos = float3(10.0, -10.0, 10.0); + output.LightVec = lightPos.xyz; + output.ViewVec = -localPos.xyz; + output.BaseColorFactor = push_constants.base_color_factor; + output.MetallicFactor = push_constants.metallic_factor; + output.RoughnessFactor = push_constants.roughness_factor; + output.BaseTextureIndex = push_constants.baseTextureIndex; + output.NormalTextureIndex = push_constants.normalTextureIndex; + output.MetallicRoughnessTextureIndex = push_constants.metallicRoughnessTextureIndex; + return output; +} diff --git a/shaders/dynamic_multisample_rasterization/slang/model.vert.spv b/shaders/dynamic_multisample_rasterization/slang/model.vert.spv new file mode 100644 index 0000000000..992280b639 Binary files /dev/null and b/shaders/dynamic_multisample_rasterization/slang/model.vert.spv differ diff --git a/shaders/dynamic_primitive_clipping/glsl/primitive_clipping.frag.spv b/shaders/dynamic_primitive_clipping/glsl/primitive_clipping.frag.spv new file mode 100644 index 0000000000..d9d8623348 Binary files /dev/null and b/shaders/dynamic_primitive_clipping/glsl/primitive_clipping.frag.spv differ diff --git a/shaders/dynamic_primitive_clipping/glsl/primitive_clipping.vert.spv b/shaders/dynamic_primitive_clipping/glsl/primitive_clipping.vert.spv new file mode 100644 index 0000000000..bfd9a604ef Binary files /dev/null and b/shaders/dynamic_primitive_clipping/glsl/primitive_clipping.vert.spv differ diff --git a/shaders/dynamic_primitive_clipping/hlsl/primitive_clipping.vert.spv b/shaders/dynamic_primitive_clipping/hlsl/primitive_clipping.vert.spv index a28f4838b5..d8e9ce90c3 100644 Binary files a/shaders/dynamic_primitive_clipping/hlsl/primitive_clipping.vert.spv and b/shaders/dynamic_primitive_clipping/hlsl/primitive_clipping.vert.spv differ diff --git a/shaders/dynamic_primitive_clipping/slang/primitive_clipping.frag.slang b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.frag.slang new file mode 100644 index 0000000000..5e6717d8c6 --- /dev/null +++ b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.frag.slang @@ -0,0 +1,42 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float ClipDistance : SV_ClipDistance0; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; + float4 colorTransformation; + int2 sceneTransformation; + float usePrimitiveClipping; +}; +ConstantBuffer ubo; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float4 outColor = float4(0.5 * input.Normal + 0.5.xxx, 1.0); + outColor.xyz = ubo.colorTransformation.x * outColor.xyz + ubo.colorTransformation.yyy; + return outColor; +} diff --git a/shaders/dynamic_primitive_clipping/slang/primitive_clipping.frag.spv b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.frag.spv new file mode 100644 index 0000000000..3285db4d83 Binary files /dev/null and b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.frag.spv differ diff --git a/shaders/dynamic_primitive_clipping/slang/primitive_clipping.vert.slang b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.vert.slang new file mode 100644 index 0000000000..69f34b27a5 --- /dev/null +++ b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.vert.slang @@ -0,0 +1,116 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; + float2 UV; +}; + +// In a fixed pipeline approach which you can still find in OpenGL implementations you could define +// up to maximum 6 clipping half-spaces and a distance to each clipping half-space was stored in gl_ClipDistance. +// That's why gl_ClipDistance[] is an array which maximum size is limited by maxClipDistances. +// +// In our example we show you how to define such half-spaces using plane equation: Ax+By+Cz+D=0 +// You could transmit information about values of A,B,C and D using UBO for example, but for simplicity we will use const declaration: + +static float4 planeValues = float4(0.0, 1.0, 0.0, 0.0); + +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; + float4 colorTransformation; + int2 sceneTransformation; + float usePrimitiveClipping; +}; +ConstantBuffer ubo; + +// Additionally we will show you that you can use more than half-spaces only. +// We will use some more advanced math functions to calculate gl_ClipDistance. + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float ClipDistance : SV_ClipDistance0; + float3 Normal; +}; + +// Cases 0 and 1 present how to use world space coordinates with more advanced functions +// Case 2 shows how to use half-space in world space coordinates +// Case 3 shows how to use half-space in clip space coordinates +// Cases 4-6 present how to use clip space coordinates with more advanced functions +// Cases 0,1,4,5 use sin() function to create strips in which values of gl_ClipDistance below 0 cause triangle primitives +// to be clipped according to Vulkan specification chapter 27.4 +// Cases 6-8 use different types of distance functions from center of the screen ( Euclidean, Manhattan, Chebyshev ) +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + + float4 worldPosition = mul(ubo.model, float4(input.Pos, 1.0)); + + output.Pos = mul(ubo.projection, mul(ubo.view, worldPosition)); + + float clipResult = 1.0, tmp; + float distance = 0.4; + + // Primitive clipping does not have any vkCmd* command that turns it off. + // If we want to turn it off - we have to transfer this information to shader through UBO variable and + // then use code similar to this: + if(ubo.usePrimitiveClipping > 0.0) + { + switch(ubo.sceneTransformation.x) + { + case 0: + clipResult = sin(worldPosition.x * 0.1 * 2.0 * 3.1415); + break; + case 1: + clipResult = sin(worldPosition.y * 0.1 * 2.0 * 3.1415); + break; + case 2: + clipResult = dot(worldPosition, planeValues ); + break; + case 3: + clipResult = dot(output.Pos, planeValues); + break; + case 4: + clipResult = sin(output.Pos.x / output.Pos.w * 3.0 * 2.0 * 3.1415); + break; + case 5: + clipResult = sin(output.Pos.y / output.Pos.w * 3.0 * 2.0 * 3.1415); + break; + case 6: + clipResult = (output.Pos.x*output.Pos.x + output.Pos.y*output.Pos.y) / (output.Pos.w*output.Pos.w) - distance*distance; + break; + case 7: + clipResult = (abs(output.Pos.x) + abs(output.Pos.y)) / output.Pos.w - distance; + break; + case 8: + clipResult = max(abs(output.Pos.x), abs(output.Pos.y)) / output.Pos.w - distance; + break; + } + + output.ClipDistance = clipResult * float(ubo.sceneTransformation.y); + } + + output.Normal = normalize(mul((float4x3)mul(ubo.view, ubo.model), input.Normal).xyz); + + return output; +} diff --git a/shaders/dynamic_primitive_clipping/slang/primitive_clipping.vert.spv b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.vert.spv new file mode 100644 index 0000000000..07caa265de Binary files /dev/null and b/shaders/dynamic_primitive_clipping/slang/primitive_clipping.vert.spv differ diff --git a/shaders/dynamic_rendering/glsl/gbuffer.frag.spv b/shaders/dynamic_rendering/glsl/gbuffer.frag.spv new file mode 100644 index 0000000000..e129b83568 Binary files /dev/null and b/shaders/dynamic_rendering/glsl/gbuffer.frag.spv differ diff --git a/shaders/dynamic_rendering/glsl/gbuffer.vert.spv b/shaders/dynamic_rendering/glsl/gbuffer.vert.spv new file mode 100644 index 0000000000..2b09381a23 Binary files /dev/null and b/shaders/dynamic_rendering/glsl/gbuffer.vert.spv differ diff --git a/shaders/dynamic_rendering/hlsl/gbuffer.frag.hlsl b/shaders/dynamic_rendering/hlsl/gbuffer.frag.hlsl index c75e22b19f..3b2a87bc65 100644 --- a/shaders/dynamic_rendering/hlsl/gbuffer.frag.hlsl +++ b/shaders/dynamic_rendering/hlsl/gbuffer.frag.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -91,7 +91,7 @@ FSOutput main(VSOutput input) fresnel *= (1.0 - F0); fresnel += F0; - float spec = (fresnel * geoAtt) / (NdotV * NdotL * 3.14); + float spec = max((fresnel * geoAtt) / (NdotV * NdotL * 3.14), 0.0); color = textureEnvMap.Sample(samplerEnvMap, reflect(-wViewVec, wNormal)); diff --git a/shaders/dynamic_rendering/hlsl/gbuffer.frag.spv b/shaders/dynamic_rendering/hlsl/gbuffer.frag.spv index 1456b573ed..3ae1c7f54c 100644 Binary files a/shaders/dynamic_rendering/hlsl/gbuffer.frag.spv and b/shaders/dynamic_rendering/hlsl/gbuffer.frag.spv differ diff --git a/shaders/dynamic_rendering/slang/gbuffer.frag.slang b/shaders/dynamic_rendering/slang/gbuffer.frag.slang new file mode 100644 index 0000000000..8e6d84d042 --- /dev/null +++ b/shaders/dynamic_rendering/slang/gbuffer.frag.slang @@ -0,0 +1,109 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[[SpecializationConstant]] const int type = 0; + +#define PI 3.1415926 +#define TwoPI (2.0 * PI) + +struct UBOMatrices +{ + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float4x4 inverseModelView; + float modelscale; +}; +ConstantBuffer uboMatrices; + +SamplerCube samplerEnvMap; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float4 color; + float3 wcNormal; + + switch (type) + { + case 0: // Skybox + { + float3 normal = normalize(input.UVW); + color = samplerEnvMap.Sample(normal); + } + break; + + case 1: // Reflect + { + float3 wViewVec = mul((float3x3) uboMatrices.inverseModelView, normalize(input.ViewVec)).xyz; + float3 normal = normalize(input.Normal); + float3 wNormal = mul((float3x3) uboMatrices.inverseModelView, normal).xyz; + + float NdotL = max(dot(normal, input.LightVec), 0.0); + + float3 eyeDir = normalize(input.ViewVec); + float3 halfVec = normalize(input.LightVec + eyeDir); + float NdotH = max(dot(normal, halfVec), 0.0); + float NdotV = max(dot(normal, eyeDir), 0.0); + float VdotH = max(dot(eyeDir, halfVec), 0.0); + + // Geometric attenuation + float NH2 = 2.0 * NdotH; + float g1 = (NH2 * NdotV) / VdotH; + float g2 = (NH2 * NdotL) / VdotH; + float geoAtt = min(1.0, min(g1, g2)); + + const float F0 = 0.6; + const float k = 0.2; + + // Fresnel (schlick approximation) + float fresnel = pow(1.0 - VdotH, 5.0); + fresnel *= (1.0 - F0); + fresnel += F0; + + float spec = max((fresnel * geoAtt) / (NdotV * NdotL * 3.14), 0.0); + + color = samplerEnvMap.Sample(reflect(-wViewVec, wNormal)); + + color = float4(color.rgb * NdotL * (k + spec * (1.0 - k)), 1.0); + } + break; + + case 2: // Refract + { + float3 wViewVec = mul((float4x3) uboMatrices.inverseModelView, normalize(input.ViewVec)).xyz; + float3 wNormal = mul((float4x3)uboMatrices.inverseModelView, input.Normal).xyz; + color = samplerEnvMap.Sample(refract(-wViewVec, wNormal, 1.0 / 1.6)); + } + break; + } + + + // Color with manual exposure into attachment 0 + const float exposure = 1.0; + float3 outColor = float3(1.0, 1.0, 1.0) - exp(-color.rgb * exposure); + return float4(outColor, 1.0); +} diff --git a/shaders/dynamic_rendering/slang/gbuffer.frag.spv b/shaders/dynamic_rendering/slang/gbuffer.frag.spv new file mode 100644 index 0000000000..a0487c9e3e Binary files /dev/null and b/shaders/dynamic_rendering/slang/gbuffer.frag.spv differ diff --git a/shaders/dynamic_rendering/slang/gbuffer.vert.slang b/shaders/dynamic_rendering/slang/gbuffer.vert.slang new file mode 100644 index 0000000000..567d547f34 --- /dev/null +++ b/shaders/dynamic_rendering/slang/gbuffer.vert.slang @@ -0,0 +1,69 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +[[SpecializationConstant]] const int type = 0; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float4x4 inverseModelView; + float modelscale; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UVW = input.Pos; + float3 worldPos; + + switch (type) + { + case 0: // Skybox + worldPos = mul((float4x3) ubo.skyboxModelview, input.Pos).xyz; + output.Pos = mul(ubo.projection, float4(worldPos, 1.0)); + break; + case 1: // Object + worldPos = mul(ubo.modelview, float4(input.Pos * ubo.modelscale, 1.0)).xyz; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(input.Pos.xyz * ubo.modelscale, 1.0))); + break; + } + output.Normal = mul((float4x3) ubo.modelview, input.Normal).xyz; + + float3 lightPos = float3(0.0f, -5.0f, 5.0f); + output.LightVec = lightPos.xyz - worldPos.xyz; + output.ViewVec = -worldPos.xyz; + return output; +} diff --git a/shaders/dynamic_rendering/slang/gbuffer.vert.spv b/shaders/dynamic_rendering/slang/gbuffer.vert.spv new file mode 100644 index 0000000000..2f43f56ba4 Binary files /dev/null and b/shaders/dynamic_rendering/slang/gbuffer.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/composition.frag b/shaders/dynamic_rendering_local_read/glsl/composition.frag similarity index 97% rename from shaders/dynamic_rendering_local_read/composition.frag rename to shaders/dynamic_rendering_local_read/glsl/composition.frag index 762cfc051d..4d48d732ef 100644 --- a/shaders/dynamic_rendering_local_read/composition.frag +++ b/shaders/dynamic_rendering_local_read/glsl/composition.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/dynamic_rendering_local_read/glsl/composition.frag.spv b/shaders/dynamic_rendering_local_read/glsl/composition.frag.spv new file mode 100644 index 0000000000..3dc44843a9 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/glsl/composition.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/composition.vert b/shaders/dynamic_rendering_local_read/glsl/composition.vert similarity index 94% rename from shaders/dynamic_rendering_local_read/composition.vert rename to shaders/dynamic_rendering_local_read/glsl/composition.vert index 16364a9a77..55e9bc0d2d 100644 --- a/shaders/dynamic_rendering_local_read/composition.vert +++ b/shaders/dynamic_rendering_local_read/glsl/composition.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/dynamic_rendering_local_read/glsl/composition.vert.spv b/shaders/dynamic_rendering_local_read/glsl/composition.vert.spv new file mode 100644 index 0000000000..0a17214219 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/glsl/composition.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/scene_opaque.frag b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.frag similarity index 97% rename from shaders/dynamic_rendering_local_read/scene_opaque.frag rename to shaders/dynamic_rendering_local_read/glsl/scene_opaque.frag index 6058066359..ce1cadf3a1 100644 --- a/shaders/dynamic_rendering_local_read/scene_opaque.frag +++ b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/dynamic_rendering_local_read/glsl/scene_opaque.frag.spv b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.frag.spv new file mode 100644 index 0000000000..8a06b9b743 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/scene_opaque.vert b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.vert similarity index 85% rename from shaders/dynamic_rendering_local_read/scene_opaque.vert rename to shaders/dynamic_rendering_local_read/glsl/scene_opaque.vert index 53a2f85e47..31876872d4 100644 --- a/shaders/dynamic_rendering_local_read/scene_opaque.vert +++ b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -16,7 +16,7 @@ * limitations under the License. */ -layout (location = 0) in vec4 inPos; +layout (location = 0) in vec3 inPos; layout (location = 1) in vec3 inNormal; layout (binding = 0) uniform UBO @@ -39,10 +39,10 @@ void main() { mat4 nodeMat = ubo.model * sceneNode.matrix; - gl_Position = ubo.projection * ubo.view * nodeMat * inPos; + gl_Position = ubo.projection * ubo.view * nodeMat * vec4(inPos, 1.0); // Vertex position in world space - outWorldPos = vec3(sceneNode.matrix * inPos); + outWorldPos = vec3(sceneNode.matrix * vec4(inPos, 1.0)); // GL to Vulkan coord space outWorldPos.y = -outWorldPos.y; diff --git a/shaders/dynamic_rendering_local_read/glsl/scene_opaque.vert.spv b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.vert.spv new file mode 100644 index 0000000000..883d990b97 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/glsl/scene_opaque.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/scene_transparent.frag b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.frag similarity index 97% rename from shaders/dynamic_rendering_local_read/scene_transparent.frag rename to shaders/dynamic_rendering_local_read/glsl/scene_transparent.frag index fa24ba47aa..e3c4388171 100644 --- a/shaders/dynamic_rendering_local_read/scene_transparent.frag +++ b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/dynamic_rendering_local_read/glsl/scene_transparent.frag.spv b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.frag.spv new file mode 100644 index 0000000000..6746acec12 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/scene_transparent.vert b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.vert similarity index 93% rename from shaders/dynamic_rendering_local_read/scene_transparent.vert rename to shaders/dynamic_rendering_local_read/glsl/scene_transparent.vert index 7cefc475a5..fc72c69353 100644 --- a/shaders/dynamic_rendering_local_read/scene_transparent.vert +++ b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -16,7 +16,7 @@ * limitations under the License. */ -layout (location = 0) in vec4 inPos; +layout (location = 0) in vec3 inPos; layout (location = 1) in vec3 inNormal; layout (location = 2) in vec2 inUV; diff --git a/shaders/dynamic_rendering_local_read/glsl/scene_transparent.vert.spv b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.vert.spv new file mode 100644 index 0000000000..065f24d0d5 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/glsl/scene_transparent.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/hlsl/composition.frag.hlsl b/shaders/dynamic_rendering_local_read/hlsl/composition.frag.hlsl new file mode 100644 index 0000000000..2505ee6382 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/hlsl/composition.frag.hlsl @@ -0,0 +1,67 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::input_attachment_index(0)]] SubpassInput positionDepthAttachment; +[[vk::input_attachment_index(1)]] SubpassInput normalAttachment; +[[vk::input_attachment_index(2)]] SubpassInput albedoAttachment; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV : TEXCOORD0; +}; + +struct Light +{ + float4 position; + float3 color; + float radius; +}; +// Binding 0 : Position storage buffer +StructuredBuffer lights; + +float4 main(VSOutput input) : SV_TARGET +{ + // Read G-Buffer values from previous sub pass + float3 fragPos = positionDepthAttachment.SubpassLoad().rgb; + float3 normal = normalAttachment.SubpassLoad().rgb; + float4 albedo = albedoAttachment.SubpassLoad(); + + #define ambient 0.005 + + // Ambient part + float3 fragcolor = albedo.rgb * ambient; + + uint lightsLength; + uint lightsStride; + lights.GetDimensions(lightsLength, lightsStride); + + for(int i = 0; i < lightsLength; ++i) + { + float3 L = lights[i].position.xyz - fragPos; + float dist = length(L); + + float attenuation = lights[i].radius / (pow(dist, 8.0) + 1.0); + + float NdotL = max(0.0, dot(normalize(normal), normalize(L))); + float3 diffuse = lights[i].color * albedo.rgb * NdotL * attenuation; + + fragcolor += diffuse; + } + + return float4(fragcolor, 1.0); +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/hlsl/composition.frag.spv b/shaders/dynamic_rendering_local_read/hlsl/composition.frag.spv new file mode 100644 index 0000000000..62c22b2631 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/hlsl/composition.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/hlsl/composition.vert.hlsl b/shaders/dynamic_rendering_local_read/hlsl/composition.vert.hlsl new file mode 100644 index 0000000000..748a55ba70 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/hlsl/composition.vert.hlsl @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV : TEXCOORD0; +}; + +VSOutput main(uint VertexIndex: SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/hlsl/composition.vert.spv b/shaders/dynamic_rendering_local_read/hlsl/composition.vert.spv new file mode 100644 index 0000000000..021a77e713 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/hlsl/composition.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.frag.hlsl b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.frag.hlsl new file mode 100644 index 0000000000..fddcdaefef --- /dev/null +++ b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.frag.hlsl @@ -0,0 +1,56 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal : NORMAL0; + float4 Color : COLOR0; + float3 WorldPos : POS0; +}; + +[[vk::constant_id(0)]] const float NEAR_PLANE = 0.1; +[[vk::constant_id(1)]] const float FAR_PLANE = 256.0; + +float linearDepth(float depth) +{ + float z = depth * 2.0f - 1.0f; + return (2.0f * NEAR_PLANE * FAR_PLANE) / (FAR_PLANE + NEAR_PLANE - z * (FAR_PLANE - NEAR_PLANE)); +} + +struct FSOutput +{ + float4 Color : SV_TARGET0; + float4 PositionDepth : SV_TARGET1; + float4 Normal : SV_TARGET2; + float4 Albedo : SV_TARGET3; +}; + +FSOutput main(VSOutput input) +{ + FSOutput output; + float3 N = normalize(input.Normal); + N.y = -N.y; + output.Normal = float4(N, 1.0); + output.Albedo = input.Color; + // Store linearized depth in alpha component + output.PositionDepth.rgb = input.WorldPos; + output.PositionDepth.a = linearDepth(input.Pos.z); + // Write color attachments to avoid undefined behaviour (validation error) + output.Color = (1.0).rrrr; + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.frag.spv b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.frag.spv new file mode 100644 index 0000000000..987f5248b1 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.vert.hlsl b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.vert.hlsl new file mode 100644 index 0000000000..1e3347928b --- /dev/null +++ b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.vert.hlsl @@ -0,0 +1,59 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal : NORMAL0; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4x4 view; + float4x4 inverseTranspose; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal : NORMAL0; + float4 Color : COLOR0; + float3 WorldPos : POS0; +}; + +struct PushConsts { + float4x4 Matrix; + float4 Color; +}; +[[vk::push_constant]] PushConsts pushConsts; + +VSOutput main(VSInput input) +{ + float4x4 nodeMat = mul(ubo.model, pushConsts.Matrix); + VSOutput output; + output.Pos = mul(ubo.projection, mul(ubo.view, mul(pushConsts.Matrix, float4(input.Pos, 1.0)))); + // Vertex position in world space + output.WorldPos = mul(pushConsts.Matrix, float4(input.Pos, 1.0)).xyz; + // GL to Vulkan coord space + output.WorldPos.y = -output.WorldPos.y; + output.Normal = mul((float3x3)nodeMat, input.Normal); + output.Color = pushConsts.Color; + return output; +} diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.vert.spv b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.vert.spv new file mode 100644 index 0000000000..a97343958b Binary files /dev/null and b/shaders/dynamic_rendering_local_read/hlsl/scene_opaque.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.frag.hlsl b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.frag.hlsl new file mode 100644 index 0000000000..ffe18443eb --- /dev/null +++ b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.frag.hlsl @@ -0,0 +1,54 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::input_attachment_index(0)]] SubpassInput positionDepthAttachment; + +Texture2D texture : register(t2); +SamplerState samplerTexture : register(s2); + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color : COLOR0; + float2 UV : TEXCOORD0; +}; + +[[vk::constant_id(0)]] const float NEAR_PLANE = 0.1; +[[vk::constant_id(1)]] const float FAR_PLANE = 256.0; + +float linearDepth(float depth) +{ + float z = depth * 2.0f - 1.0f; + return (2.0f * NEAR_PLANE * FAR_PLANE) / (FAR_PLANE + NEAR_PLANE - z * (FAR_PLANE - NEAR_PLANE)); +} + +float4 main(VSOutput input) : SV_TARGET +{ + // Sample depth from deferred depth buffer and discard if obscured + float depth = positionDepthAttachment.SubpassLoad().a; + + // Save the sampled texture color before discarding. + // This is to avoid implicit derivatives in non-uniform control flow. + // @todo: reversed depth + float4 sampledColor = texture.Sample(samplerTexture, input.UV); + if ((depth != 0.0) && (linearDepth(input.Pos.z) < depth)) + { +// discard; + }; + + return sampledColor; +} diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.frag.spv b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.frag.spv new file mode 100644 index 0000000000..c6b84c66d0 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.vert.hlsl b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.vert.hlsl new file mode 100644 index 0000000000..26a95dda20 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.vert.hlsl @@ -0,0 +1,53 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal : NORMAL0; + float2 UV : TEXCOORD; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4x4 view; +}; +[[vk::binding(1,0)]] ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color : COLOR0; + float2 UV : TEXCOORD0; +}; + +struct PushConsts { + float4x4 Matrix; + float4 Color; +}; +[[vk::push_constant]] PushConsts pushConsts; + +VSOutput main(VSInput input) +{ + VSOutput output; + output.Color = pushConsts.Color.rgb; + output.Pos = mul(ubo.projection, mul(ubo.view, mul(pushConsts.Matrix, float4(input.Pos, 1.0)))); + output.UV = input.UV; + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.vert.spv b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.vert.spv new file mode 100644 index 0000000000..343da4c943 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/hlsl/scene_transparent.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/slang/composition.frag.slang b/shaders/dynamic_rendering_local_read/slang/composition.frag.slang new file mode 100644 index 0000000000..b113502a7e --- /dev/null +++ b/shaders/dynamic_rendering_local_read/slang/composition.frag.slang @@ -0,0 +1,68 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::input_attachment_index(0)]] SubpassInput positionDepthAttachment; +[[vk::input_attachment_index(1)]] SubpassInput normalAttachment; +[[vk::input_attachment_index(2)]] SubpassInput albedoAttachment; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +struct Light +{ + float4 position; + float3 color; + float radius; +}; +// Binding 0 : Position storage buffer +StructuredBuffer lights; + +[shader("fragment")] +float4 main(VSOutput input) +{ + // Read G-Buffer values from previous sub pass + float3 fragPos = positionDepthAttachment.SubpassLoad().rgb; + float3 normal = normalAttachment.SubpassLoad().rgb; + float4 albedo = albedoAttachment.SubpassLoad(); + + #define ambient 0.005 + + // Ambient part + float3 fragcolor = albedo.rgb * ambient; + + uint lightsLength; + uint lightsStride; + lights.GetDimensions(lightsLength, lightsStride); + + for(int i = 0; i < lightsLength; ++i) + { + float3 L = lights[i].position.xyz - fragPos; + float dist = length(L); + + float attenuation = lights[i].radius / (pow(dist, 8.0) + 1.0); + + float NdotL = max(0.0, dot(normalize(normal), normalize(L))); + float3 diffuse = lights[i].color * albedo.rgb * NdotL * attenuation; + + fragcolor += diffuse; + } + + return float4(fragcolor, 1.0); +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/slang/composition.frag.spv b/shaders/dynamic_rendering_local_read/slang/composition.frag.spv new file mode 100644 index 0000000000..c81d79c01a Binary files /dev/null and b/shaders/dynamic_rendering_local_read/slang/composition.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/slang/composition.vert.slang b/shaders/dynamic_rendering_local_read/slang/composition.vert.slang new file mode 100644 index 0000000000..fd64a125b8 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/slang/composition.vert.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/slang/composition.vert.spv b/shaders/dynamic_rendering_local_read/slang/composition.vert.spv new file mode 100644 index 0000000000..26860adcd1 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/slang/composition.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/slang/scene_opaque.frag.slang b/shaders/dynamic_rendering_local_read/slang/scene_opaque.frag.slang new file mode 100644 index 0000000000..49f168c407 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/slang/scene_opaque.frag.slang @@ -0,0 +1,57 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float4 Color; + float3 WorldPos; +}; + +[[SpecializationConstant]] const float NEAR_PLANE = 0.1; +[[SpecializationConstant]] const float FAR_PLANE = 256.0; + +float linearDepth(float depth) +{ + float z = depth * 2.0f - 1.0f; + return (2.0f * NEAR_PLANE * FAR_PLANE) / (FAR_PLANE + NEAR_PLANE - z * (FAR_PLANE - NEAR_PLANE)); +} + +struct FSOutput +{ + float4 Color; + float4 PositionDepth; + float4 Normal; + float4 Albedo; +}; + +[shader("fragment")] +FSOutput main(VSOutput input) +{ + FSOutput output; + float3 N = normalize(input.Normal); + N.y = -N.y; + output.Normal = float4(N, 1.0); + output.Albedo = input.Color; + // Store linearized depth in alpha component + output.PositionDepth.rgb = input.WorldPos; + output.PositionDepth.a = linearDepth(input.Pos.z); + // Write color attachments to avoid undefined behaviour (validation error) + output.Color = (1.0).rrrr; + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/slang/scene_opaque.frag.spv b/shaders/dynamic_rendering_local_read/slang/scene_opaque.frag.spv new file mode 100644 index 0000000000..48a44fcc9e Binary files /dev/null and b/shaders/dynamic_rendering_local_read/slang/scene_opaque.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/slang/scene_opaque.vert.slang b/shaders/dynamic_rendering_local_read/slang/scene_opaque.vert.slang new file mode 100644 index 0000000000..644e03362e --- /dev/null +++ b/shaders/dynamic_rendering_local_read/slang/scene_opaque.vert.slang @@ -0,0 +1,54 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4x4 view; + float4x4 inverseTranspose; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float4 Color; + float3 WorldPos; +}; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4x4 pushMatrix, uniform float4 pushColor) +{ + float4x4 nodeMat = mul(ubo.model, pushMatrix); + VSOutput output; + output.Pos = mul(ubo.projection, mul(ubo.view, mul(pushMatrix, float4(input.Pos, 1.0)))); + // Vertex position in world space + output.WorldPos = mul(pushMatrix, float4(input.Pos, 1.0)).xyz; + // GL to Vulkan coord space + output.WorldPos.y = -output.WorldPos.y; + output.Normal = mul((float3x3)nodeMat, input.Normal); + output.Color = pushColor; + return output; +} diff --git a/shaders/dynamic_rendering_local_read/slang/scene_opaque.vert.spv b/shaders/dynamic_rendering_local_read/slang/scene_opaque.vert.spv new file mode 100644 index 0000000000..a3b727c2c8 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/slang/scene_opaque.vert.spv differ diff --git a/shaders/dynamic_rendering_local_read/slang/scene_transparent.frag.slang b/shaders/dynamic_rendering_local_read/slang/scene_transparent.frag.slang new file mode 100644 index 0000000000..0be49ce3b9 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/slang/scene_transparent.frag.slang @@ -0,0 +1,53 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::input_attachment_index(0)]] SubpassInput positionDepthAttachment; + +[[vk::binding(2, 0)]] Sampler2D samplerTexture; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; + float2 UV; +}; + +[[SpecializationConstant]] const float NEAR_PLANE = 0.1; +[[SpecializationConstant]] const float FAR_PLANE = 256.0; + +float linearDepth(float depth) +{ + float z = depth * 2.0f - 1.0f; + return (2.0f * NEAR_PLANE * FAR_PLANE) / (FAR_PLANE + NEAR_PLANE - z * (FAR_PLANE - NEAR_PLANE)); +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + // Sample depth from deferred depth buffer and discard if obscured + float depth = positionDepthAttachment.SubpassLoad().a; + + // Save the sampled texture color before discarding. + // This is to avoid implicit derivatives in non-uniform control flow. + float4 sampledColor = samplerTexture.Sample(input.UV); + if ((depth != 0.0) && (linearDepth(input.Pos.z) < depth)) + { +// discard; + }; + + return sampledColor; +} diff --git a/shaders/dynamic_rendering_local_read/slang/scene_transparent.frag.spv b/shaders/dynamic_rendering_local_read/slang/scene_transparent.frag.spv new file mode 100644 index 0000000000..e152209289 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/slang/scene_transparent.frag.spv differ diff --git a/shaders/dynamic_rendering_local_read/slang/scene_transparent.vert.slang b/shaders/dynamic_rendering_local_read/slang/scene_transparent.vert.slang new file mode 100644 index 0000000000..0343f3f536 --- /dev/null +++ b/shaders/dynamic_rendering_local_read/slang/scene_transparent.vert.slang @@ -0,0 +1,48 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; + float2 UV; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4x4 view; +}; +[[vk::binding(1,0)]] ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float4 Color; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4x4 pushMatrix, uniform float4 pushColor) +{ + VSOutput output; + output.Color = pushColor; + output.Pos = mul(ubo.projection, mul(ubo.view, mul(pushMatrix, float4(input.Pos, 1.0)))); + output.UV = input.UV; + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_rendering_local_read/slang/scene_transparent.vert.spv b/shaders/dynamic_rendering_local_read/slang/scene_transparent.vert.spv new file mode 100644 index 0000000000..35aba50021 Binary files /dev/null and b/shaders/dynamic_rendering_local_read/slang/scene_transparent.vert.spv differ diff --git a/shaders/dynamic_uniform_buffers/glsl/base.frag.spv b/shaders/dynamic_uniform_buffers/glsl/base.frag.spv new file mode 100644 index 0000000000..bab0e7c1bb Binary files /dev/null and b/shaders/dynamic_uniform_buffers/glsl/base.frag.spv differ diff --git a/shaders/dynamic_uniform_buffers/glsl/base.vert.spv b/shaders/dynamic_uniform_buffers/glsl/base.vert.spv new file mode 100644 index 0000000000..2a063d0608 Binary files /dev/null and b/shaders/dynamic_uniform_buffers/glsl/base.vert.spv differ diff --git a/shaders/dynamic_uniform_buffers/slang/base.frag.slang b/shaders/dynamic_uniform_buffers/slang/base.frag.slang new file mode 100644 index 0000000000..939b207dd9 --- /dev/null +++ b/shaders/dynamic_uniform_buffers/slang/base.frag.slang @@ -0,0 +1,28 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/dynamic_uniform_buffers/slang/base.frag.spv b/shaders/dynamic_uniform_buffers/slang/base.frag.spv new file mode 100644 index 0000000000..57e6ef985c Binary files /dev/null and b/shaders/dynamic_uniform_buffers/slang/base.frag.spv differ diff --git a/shaders/dynamic_uniform_buffers/slang/base.vert.slang b/shaders/dynamic_uniform_buffers/slang/base.vert.slang new file mode 100644 index 0000000000..e300db2af0 --- /dev/null +++ b/shaders/dynamic_uniform_buffers/slang/base.vert.slang @@ -0,0 +1,52 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Color; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +struct UboView +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer uboView; + +struct UboInstance +{ + float4x4 model; +}; +ConstantBuffer uboInstance; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Color = input.Color; + float4x4 modelView = mul(uboView.view, uboInstance.model); + float3 worldPos = mul(modelView, float4(input.Pos, 1.0)).xyz; + output.Pos = mul(uboView.projection, mul(modelView, float4(input.Pos.xyz, 1.0))); + return output; +} \ No newline at end of file diff --git a/shaders/dynamic_uniform_buffers/slang/base.vert.spv b/shaders/dynamic_uniform_buffers/slang/base.vert.spv new file mode 100644 index 0000000000..cdb30e9312 Binary files /dev/null and b/shaders/dynamic_uniform_buffers/slang/base.vert.spv differ diff --git a/shaders/extended_dynamic_state2/background.frag b/shaders/extended_dynamic_state2/glsl/background.frag similarity index 95% rename from shaders/extended_dynamic_state2/background.frag rename to shaders/extended_dynamic_state2/glsl/background.frag index b93012ca40..6b0acfed8c 100644 --- a/shaders/extended_dynamic_state2/background.frag +++ b/shaders/extended_dynamic_state2/glsl/background.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/background.frag.spv b/shaders/extended_dynamic_state2/glsl/background.frag.spv new file mode 100644 index 0000000000..b73641f230 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/background.frag.spv differ diff --git a/shaders/extended_dynamic_state2/background.vert b/shaders/extended_dynamic_state2/glsl/background.vert similarity index 95% rename from shaders/extended_dynamic_state2/background.vert rename to shaders/extended_dynamic_state2/glsl/background.vert index 73b6d10cba..f82528197d 100644 --- a/shaders/extended_dynamic_state2/background.vert +++ b/shaders/extended_dynamic_state2/glsl/background.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/background.vert.spv b/shaders/extended_dynamic_state2/glsl/background.vert.spv new file mode 100644 index 0000000000..5464765b4e Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/background.vert.spv differ diff --git a/shaders/extended_dynamic_state2/baseline.frag b/shaders/extended_dynamic_state2/glsl/baseline.frag similarity index 97% rename from shaders/extended_dynamic_state2/baseline.frag rename to shaders/extended_dynamic_state2/glsl/baseline.frag index 20733fc8e6..634e6d7f35 100644 --- a/shaders/extended_dynamic_state2/baseline.frag +++ b/shaders/extended_dynamic_state2/glsl/baseline.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/baseline.frag.spv b/shaders/extended_dynamic_state2/glsl/baseline.frag.spv new file mode 100644 index 0000000000..7c258c1395 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/baseline.frag.spv differ diff --git a/shaders/extended_dynamic_state2/baseline.vert b/shaders/extended_dynamic_state2/glsl/baseline.vert similarity index 97% rename from shaders/extended_dynamic_state2/baseline.vert rename to shaders/extended_dynamic_state2/glsl/baseline.vert index 42687a5def..18b925218d 100644 --- a/shaders/extended_dynamic_state2/baseline.vert +++ b/shaders/extended_dynamic_state2/glsl/baseline.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/baseline.vert.spv b/shaders/extended_dynamic_state2/glsl/baseline.vert.spv new file mode 100644 index 0000000000..e519504b09 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/baseline.vert.spv differ diff --git a/shaders/extended_dynamic_state2/tess.frag b/shaders/extended_dynamic_state2/glsl/tess.frag similarity index 94% rename from shaders/extended_dynamic_state2/tess.frag rename to shaders/extended_dynamic_state2/glsl/tess.frag index c0131da033..38227abbc9 100644 --- a/shaders/extended_dynamic_state2/tess.frag +++ b/shaders/extended_dynamic_state2/glsl/tess.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/tess.frag.spv b/shaders/extended_dynamic_state2/glsl/tess.frag.spv new file mode 100644 index 0000000000..7f1174fdb0 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/tess.frag.spv differ diff --git a/shaders/extended_dynamic_state2/tess.tesc b/shaders/extended_dynamic_state2/glsl/tess.tesc similarity index 97% rename from shaders/extended_dynamic_state2/tess.tesc rename to shaders/extended_dynamic_state2/glsl/tess.tesc index e35671a0de..bdebb6cae6 100644 --- a/shaders/extended_dynamic_state2/tess.tesc +++ b/shaders/extended_dynamic_state2/glsl/tess.tesc @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/tess.tesc.spv b/shaders/extended_dynamic_state2/glsl/tess.tesc.spv new file mode 100644 index 0000000000..519a493149 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/tess.tesc.spv differ diff --git a/shaders/extended_dynamic_state2/tess.tese b/shaders/extended_dynamic_state2/glsl/tess.tese similarity index 97% rename from shaders/extended_dynamic_state2/tess.tese rename to shaders/extended_dynamic_state2/glsl/tess.tese index 1b67100f83..7ce98aab8d 100644 --- a/shaders/extended_dynamic_state2/tess.tese +++ b/shaders/extended_dynamic_state2/glsl/tess.tese @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/tess.tese.spv b/shaders/extended_dynamic_state2/glsl/tess.tese.spv new file mode 100644 index 0000000000..fa0080c639 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/tess.tese.spv differ diff --git a/shaders/extended_dynamic_state2/tess.vert b/shaders/extended_dynamic_state2/glsl/tess.vert similarity index 95% rename from shaders/extended_dynamic_state2/tess.vert rename to shaders/extended_dynamic_state2/glsl/tess.vert index 2884fa2ba8..f7a447c89c 100644 --- a/shaders/extended_dynamic_state2/tess.vert +++ b/shaders/extended_dynamic_state2/glsl/tess.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/extended_dynamic_state2/glsl/tess.vert.spv b/shaders/extended_dynamic_state2/glsl/tess.vert.spv new file mode 100644 index 0000000000..e18debf463 Binary files /dev/null and b/shaders/extended_dynamic_state2/glsl/tess.vert.spv differ diff --git a/shaders/extended_dynamic_state2/slang/background.frag.slang b/shaders/extended_dynamic_state2/slang/background.frag.slang new file mode 100644 index 0000000000..83068291d2 --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/background.frag.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] SamplerCube samplerEnvMap; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(samplerEnvMap.Sample(normalize(input.UVW)).rgb, 1.0); +} diff --git a/shaders/extended_dynamic_state2/slang/background.frag.spv b/shaders/extended_dynamic_state2/slang/background.frag.spv new file mode 100644 index 0000000000..99dfa9a720 Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/background.frag.spv differ diff --git a/shaders/extended_dynamic_state2/slang/background.vert.slang b/shaders/extended_dynamic_state2/slang/background.vert.slang new file mode 100644 index 0000000000..c035090d9c --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/background.vert.slang @@ -0,0 +1,45 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UVW = input.Pos; + output.Pos = mul(ubo.projection, mul(ubo.view, float4(input.Pos * 10.0, 1.0))); + return output; +} diff --git a/shaders/extended_dynamic_state2/slang/background.vert.spv b/shaders/extended_dynamic_state2/slang/background.vert.spv new file mode 100644 index 0000000000..37a4e3df46 Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/background.vert.spv differ diff --git a/shaders/extended_dynamic_state2/slang/baseline.frag.slang b/shaders/extended_dynamic_state2/slang/baseline.frag.slang new file mode 100644 index 0000000000..67b27128d2 --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/baseline.frag.slang @@ -0,0 +1,46 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float4 FragColor; + float3 LightVec; + float3 LightColor[2]; + float3 ViewVec; + float LightIntensity; +}; + +[[SpecializationConstant]] const int type = 0; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float attenuation = 1.0 / dot(input.LightVec, input.LightVec); + + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + + float3 diffuse = input.LightColor[0] * attenuation * max(dot(N, L), 0) * input.LightIntensity; + float3 ambient = input.LightColor[1]; + float3 specular = pow(max(dot(R, V), 0.0), 16.0) * float3(0.65); + return float4((ambient + diffuse) * input.FragColor.rgb + (specular * input.LightIntensity / 50.0), input.FragColor.a); +} diff --git a/shaders/extended_dynamic_state2/slang/baseline.frag.spv b/shaders/extended_dynamic_state2/slang/baseline.frag.spv new file mode 100644 index 0000000000..8fd12532cc Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/baseline.frag.spv differ diff --git a/shaders/extended_dynamic_state2/slang/baseline.vert.slang b/shaders/extended_dynamic_state2/slang/baseline.vert.slang new file mode 100644 index 0000000000..88edc13bdc --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/baseline.vert.slang @@ -0,0 +1,69 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float4 FragColor; + float3 LightVec; + float3 LightColor[2]; + float3 ViewVec; + float LightIntensity; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct UBOBaseline +{ + float4 ambientLightColor; + float4 lightPosition; + float4 lightColor; + float lightIntensity; +}; +ConstantBuffer ubo_baseline; + +[[SpecializationConstant]] const int type = 0; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4x4 model, uniform float4 color) +{ + VSOutput output; + output.FragColor = color; + float4 localPos = mul(ubo.view, mul(model, float4(input.Pos, 1.0))); + output.Pos = mul(ubo.projection, localPos); + output.Normal = mul((float3x3)mul(ubo.view, model), input.Normal); + float4 positionWorld = mul(model, float4(input.Pos, 1.0)); + output.LightVec = ubo_baseline.lightPosition.xyz - positionWorld.xyz; + output.LightColor[0] = ubo_baseline.lightColor.xyz * ubo_baseline.lightColor.w; + output.LightColor[1] = ubo_baseline.ambientLightColor.xyz * ubo_baseline.ambientLightColor.w; + output.ViewVec = -localPos.xyz; + output.LightIntensity = ubo_baseline.lightIntensity; + return output; +} diff --git a/shaders/extended_dynamic_state2/slang/baseline.vert.spv b/shaders/extended_dynamic_state2/slang/baseline.vert.spv new file mode 100644 index 0000000000..2c1b4ab357 Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/baseline.vert.spv differ diff --git a/shaders/extended_dynamic_state2/slang/tess.frag.slang b/shaders/extended_dynamic_state2/slang/tess.frag.slang new file mode 100644 index 0000000000..d05b6f5392 --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/tess.frag.slang @@ -0,0 +1,23 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[shader("fragment")] +float4 main() +{ + return float4(0.6667, 0.1176, 0.1176, 1.0); +} diff --git a/shaders/extended_dynamic_state2/slang/tess.frag.spv b/shaders/extended_dynamic_state2/slang/tess.frag.spv new file mode 100644 index 0000000000..40ff486d8a Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/tess.frag.spv differ diff --git a/shaders/extended_dynamic_state2/slang/tess.tesc.slang b/shaders/extended_dynamic_state2/slang/tess.tesc.slang new file mode 100644 index 0000000000..f1ace2e7ac --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/tess.tesc.slang @@ -0,0 +1,75 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 LocPos; + float3 Normal; +}; + +struct HSOutput +{ + float3 Pos : SV_POSITION; + float3 Normal; +}; + +struct ConstantsHSOutput +{ + float TessLevelOuter[3] : SV_TessFactor; + float TessLevelInner[2] : SV_InsideTessFactor; +}; + +struct UBO +{ + float tessellationFactor; +}; +[[vk::binding(1, 0)]] ConstantBuffer ubo; + +ConstantsHSOutput ConstantsHS(InputPatch patch) +{ + ConstantsHSOutput output; + if (ubo.tessellationFactor > 0.0) { + output.TessLevelInner[0] = ubo.tessellationFactor; + output.TessLevelInner[1] = ubo.tessellationFactor; + output.TessLevelOuter[0] = ubo.tessellationFactor; + output.TessLevelOuter[1] = ubo.tessellationFactor; + output.TessLevelOuter[2] = ubo.tessellationFactor; + } else { + output.TessLevelInner[0] = 1; + output.TessLevelInner[1] = 1; + output.TessLevelOuter[0] = 1; + output.TessLevelOuter[1] = 1; + output.TessLevelOuter[2] = 1; + } + return output; +} + +[shader("hull")] +[domain("tri")] +[partitioning("integer")] +[outputtopology("triangle_cw")] +[outputcontrolpoints(3)] +[patchconstantfunc("ConstantsHS")] +HSOutput main(InputPatch patch, uint InvocationID: SV_OutputControlPointID) +{ + HSOutput output; + output.Pos = patch[InvocationID].Pos.xyz; + output.Normal = patch[InvocationID].Normal; + return output; +} diff --git a/shaders/extended_dynamic_state2/slang/tess.tesc.spv b/shaders/extended_dynamic_state2/slang/tess.tesc.spv new file mode 100644 index 0000000000..ad8bd95a03 Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/tess.tesc.spv differ diff --git a/shaders/extended_dynamic_state2/slang/tess.tese.slang b/shaders/extended_dynamic_state2/slang/tess.tese.slang new file mode 100644 index 0000000000..0dd9b1ff47 --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/tess.tese.slang @@ -0,0 +1,63 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 LocPos; + float3 Normal; +}; + +struct HSOutput +{ + float3 Pos : SV_POSITION; + float3 Normal; +}; + +struct DSOutput +{ + float4 Pos : SV_POSITION; +}; + +struct ConstantsHSOutput +{ + float TessLevelOuter[3] : SV_TessFactor; + float TessLevelInner[2] : SV_InsideTessFactor; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +float3 interpolate3D(float3 v0, float3 v1, float3 v2, float3 tessCoord) +{ + return float3(tessCoord.x) * v0 + float3(tessCoord.y) * v1 + float3(tessCoord.z) * v2; +} + +[domain("tri")] +[shader("domain")] +DSOutput main(ConstantsHSOutput input, float3 tessCoord: SV_DomainLocation, const OutputPatch patch, uniform float4x4 model, uniform float3 color) +{ + DSOutput output; + float4 pos = float4(interpolate3D(patch[0].Pos, patch[1].Pos, patch[2].Pos, tessCoord), 1.0); + output.Pos = mul(ubo.projection, mul(ubo.view, mul(model, pos))); + return output; +} diff --git a/shaders/extended_dynamic_state2/slang/tess.tese.spv b/shaders/extended_dynamic_state2/slang/tess.tese.spv new file mode 100644 index 0000000000..2b4c16ac13 Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/tess.tese.spv differ diff --git a/shaders/extended_dynamic_state2/slang/tess.vert.slang b/shaders/extended_dynamic_state2/slang/tess.vert.slang new file mode 100644 index 0000000000..3aeb984895 --- /dev/null +++ b/shaders/extended_dynamic_state2/slang/tess.vert.slang @@ -0,0 +1,47 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 LocPos; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Pos = float4(input.Pos, 1.0); + output.Normal = mul(float3x3(ubo.view), input.Normal); + output.LocPos = input.Pos; + return output; +} diff --git a/shaders/extended_dynamic_state2/slang/tess.vert.spv b/shaders/extended_dynamic_state2/slang/tess.vert.spv new file mode 100644 index 0000000000..9ab23591be Binary files /dev/null and b/shaders/extended_dynamic_state2/slang/tess.vert.spv differ diff --git a/shaders/fragment_density_map/debug_fdm.glsl b/shaders/fragment_density_map/debug_fdm.glsl new file mode 100644 index 0000000000..1e1098d2e2 --- /dev/null +++ b/shaders/fragment_density_map/debug_fdm.glsl @@ -0,0 +1,73 @@ +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +# extension GL_EXT_fragment_invocation_density : enable + +vec3 get_fdm_debug_color(vec3 original_color) +{ + const float debug_fdm_factor = 0.2f; + original_color *= (1.0f - debug_fdm_factor); + + const vec3 red = vec3(debug_fdm_factor, 0.0, 0.0); + const vec3 green = vec3(0.0, debug_fdm_factor, 0.0); + const vec3 blue = vec3(0.0, 0.0, debug_fdm_factor); + const vec3 cyan = vec3(0.0, debug_fdm_factor, debug_fdm_factor); + const vec3 magenta = vec3(debug_fdm_factor, 0.0, debug_fdm_factor); + const vec3 yellow = vec3(debug_fdm_factor, debug_fdm_factor, 0.0); + const vec3 orange = vec3(debug_fdm_factor, 0.5 * debug_fdm_factor, 0.0); + const vec3 purple = vec3(0.5 * debug_fdm_factor, 0.0, 0.5 * debug_fdm_factor); + const vec3 pink = vec3(debug_fdm_factor, 0.0, 0.5 * debug_fdm_factor); + + if (all(equal(gl_FragSizeEXT, ivec2(1)))) + { + original_color += green; + } + else if (all(equal(gl_FragSizeEXT, ivec2(1, 2)))) + { + original_color += red; + } + else if (all(equal(gl_FragSizeEXT, ivec2(2, 1)))) + { + original_color += blue; + } + else if (all(equal(gl_FragSizeEXT, ivec2(2)))) + { + original_color += cyan; + } + else if (all(equal(gl_FragSizeEXT, ivec2(2, 4)))) + { + original_color += magenta; + } + else if (all(equal(gl_FragSizeEXT, ivec2(4, 2)))) + { + original_color += yellow; + } + else if (all(equal(gl_FragSizeEXT, ivec2(4)))) + { + original_color += orange; + } + else if (any(lessThan(gl_FragSizeEXT, ivec2(1)))) + { + original_color += purple; + } + else + { + original_color += pink; + } + return original_color; +} diff --git a/shaders/fragment_density_map/forward.frag b/shaders/fragment_density_map/forward.frag new file mode 100644 index 0000000000..56ffc1d552 --- /dev/null +++ b/shaders/fragment_density_map/forward.frag @@ -0,0 +1,49 @@ +#version 320 es +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +precision mediump float; + +precision highp float; + +layout(set = 0, binding = 1) uniform sampler2D base_color_texture; + +layout(location = 0) in vec2 in_uv; +layout(location = 1) in vec3 in_normal; + +layout(location = 0) out vec4 o_color; + +#include "lighting.h" + +void main(void) +{ + vec3 normal = normalize(in_normal); + + Light directional_light; + directional_light.color = vec4(0.95, 0.87, 0.85, 1); + directional_light.direction = vec4(normalize(vec3(1)), 0); + + vec3 light_contribution = apply_directional_light(directional_light, normal); + + vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); + + base_color = texture(base_color_texture, in_uv); + + vec3 ambient_color = vec3(0.25) * base_color.xyz; + + o_color = vec4(ambient_color + light_contribution * base_color.xyz, base_color.w); +} diff --git a/shaders/fragment_density_map/forward.frag.spv b/shaders/fragment_density_map/forward.frag.spv new file mode 100644 index 0000000000..67a9a8f1e4 Binary files /dev/null and b/shaders/fragment_density_map/forward.frag.spv differ diff --git a/shaders/fragment_density_map/forward.vert b/shaders/fragment_density_map/forward.vert new file mode 100644 index 0000000000..4a5eafb8b4 --- /dev/null +++ b/shaders/fragment_density_map/forward.vert @@ -0,0 +1,40 @@ +#version 320 es +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) in vec3 i_position; +layout(location = 1) in vec3 i_normal; +layout(location = 2) in vec2 i_texcoord_0; + +layout(set = 0, binding = 0) uniform GlobalUniform +{ + mat4 projection; + mat4 modelview; +} +global_uniform; + +layout(location = 0) out vec2 o_uv; +layout(location = 1) out vec3 o_normal; + +void main(void) +{ + o_uv = i_texcoord_0; + + o_normal = mat3(global_uniform.modelview) * i_normal; + + gl_Position = global_uniform.projection * global_uniform.modelview * vec4(i_position, 1.0); +} diff --git a/shaders/fragment_density_map/forward.vert.spv b/shaders/fragment_density_map/forward.vert.spv new file mode 100644 index 0000000000..a5bdc8dda7 Binary files /dev/null and b/shaders/fragment_density_map/forward.vert.spv differ diff --git a/shaders/fragment_density_map/forward_debug.frag b/shaders/fragment_density_map/forward_debug.frag new file mode 100644 index 0000000000..6582e91dc2 --- /dev/null +++ b/shaders/fragment_density_map/forward_debug.frag @@ -0,0 +1,51 @@ +#version 320 es +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +precision mediump float; +#include "debug_fdm.glsl" + +precision highp float; + +layout(set = 0, binding = 1) uniform sampler2D base_color_texture; + +layout(location = 0) in vec2 in_uv; +layout(location = 1) in vec3 in_normal; + +layout(location = 0) out vec4 o_color; + +#include "lighting.h" + +void main(void) +{ + vec3 normal = normalize(in_normal); + + Light directional_light; + directional_light.color = vec4(0.95, 0.87, 0.85, 1); + directional_light.direction = vec4(normalize(vec3(1)), 0); + + vec3 light_contribution = apply_directional_light(directional_light, normal); + + vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); + + base_color = texture(base_color_texture, in_uv); + + vec3 ambient_color = vec3(0.25) * base_color.xyz; + + o_color = vec4(ambient_color + light_contribution * base_color.xyz, base_color.w); + o_color.rgb = get_fdm_debug_color(o_color.rgb); +} diff --git a/shaders/fragment_density_map/forward_debug.frag.spv b/shaders/fragment_density_map/forward_debug.frag.spv new file mode 100644 index 0000000000..7395671d66 Binary files /dev/null and b/shaders/fragment_density_map/forward_debug.frag.spv differ diff --git a/shaders/fragment_density_map/generate_density_map.comp b/shaders/fragment_density_map/generate_density_map.comp new file mode 100644 index 0000000000..3aae1d8222 --- /dev/null +++ b/shaders/fragment_density_map/generate_density_map.comp @@ -0,0 +1,41 @@ +#version 450 +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(local_size_x = 4, local_size_y = 8) in; + +layout(set = 0, binding = 0) uniform UBO +{ + vec4 eye_center; + vec4 circle_radius; +} +u_ubo; + +layout(set = 0, binding = 1, rg8) uniform writeonly image2D storage_image; + +#include "generate_fdm.glsl" + +void main() +{ + if (any(greaterThan(gl_GlobalInvocationID.xy, imageSize(storage_image)))) + { + return; + } + vec2 eye_distance_vec = vec2(gl_GlobalInvocationID.xy) - u_ubo.eye_center.xy; + vec2 colScale = get_fragment_size_from_eye_distance(eye_distance_vec, u_ubo.circle_radius); + imageStore(storage_image, ivec2(gl_GlobalInvocationID.xy), vec4(colScale, 0.0, 0.0)); +} diff --git a/shaders/fragment_density_map/generate_density_map.comp.spv b/shaders/fragment_density_map/generate_density_map.comp.spv new file mode 100644 index 0000000000..b7851c8fd3 Binary files /dev/null and b/shaders/fragment_density_map/generate_density_map.comp.spv differ diff --git a/shaders/fragment_density_map/generate_density_map.frag b/shaders/fragment_density_map/generate_density_map.frag new file mode 100644 index 0000000000..b34f561bbb --- /dev/null +++ b/shaders/fragment_density_map/generate_density_map.frag @@ -0,0 +1,35 @@ +#version 450 +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) out vec2 outFragColor; + +// UBO with all parameters +layout(set = 0, binding = 0) uniform UBO +{ + vec4 eye_center; + vec4 circle_radius; +} +u_ubo; + +#include "generate_fdm.glsl" + +void main() +{ + vec2 eye_distance_vec = vec2(gl_FragCoord.xy) - u_ubo.eye_center.xy; + outFragColor = get_fragment_size_from_eye_distance(eye_distance_vec, u_ubo.circle_radius); +} diff --git a/shaders/fragment_density_map/generate_density_map.frag.spv b/shaders/fragment_density_map/generate_density_map.frag.spv new file mode 100644 index 0000000000..30ccb7d8e2 Binary files /dev/null and b/shaders/fragment_density_map/generate_density_map.frag.spv differ diff --git a/shaders/fragment_density_map/generate_fdm.glsl b/shaders/fragment_density_map/generate_fdm.glsl new file mode 100644 index 0000000000..6862b4a007 --- /dev/null +++ b/shaders/fragment_density_map/generate_fdm.glsl @@ -0,0 +1,56 @@ +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// We want the current fragment density map to look like concentric circles +vec2 get_fragment_size_from_eye_distance(vec2 eye_distance_vec, vec4 circle_radius) +{ + float eye_distance = length(eye_distance_vec); + if (eye_distance < circle_radius.x) + { + return vec2(1.0); + } + else if (eye_distance < circle_radius.y) + { + if (abs(eye_distance_vec.x) < abs(eye_distance_vec.y)) + { + return vec2(0.49, 1.0); + } + else + { + return vec2(1.0, 0.49); + } + } + else if (eye_distance < circle_radius.z) + { + return vec2(0.49); + } + else if (eye_distance < circle_radius.w) + { + if (abs(eye_distance_vec.x) < abs(eye_distance_vec.y)) + { + return vec2(0.24, 0.49); + } + else + { + return vec2(0.49, 0.24); + } + } + else + { + return vec2(0.24); + } +} diff --git a/shaders/fragment_density_map/quad_uv.vert b/shaders/fragment_density_map/quad_uv.vert new file mode 100644 index 0000000000..1c5c3af3fb --- /dev/null +++ b/shaders/fragment_density_map/quad_uv.vert @@ -0,0 +1,25 @@ +#version 450 +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) out vec2 outUV; + +void main() +{ + outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); + gl_Position = vec4(outUV.st * 2.0f - 1.0f, 0.0f, 1.0f); +} diff --git a/shaders/fragment_density_map/quad_uv.vert.spv b/shaders/fragment_density_map/quad_uv.vert.spv new file mode 100644 index 0000000000..0a17214219 Binary files /dev/null and b/shaders/fragment_density_map/quad_uv.vert.spv differ diff --git a/shaders/fragment_density_map/quad_uvw.vert b/shaders/fragment_density_map/quad_uvw.vert new file mode 100644 index 0000000000..de575e6255 --- /dev/null +++ b/shaders/fragment_density_map/quad_uvw.vert @@ -0,0 +1,25 @@ +#version 450 +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) out vec3 outUVW; + +void main() +{ + outUVW = vec3((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2, gl_VertexIndex & 2); + gl_Position = vec4(outUVW.st * 2.0f - 1.0f, 0.0f, 1.0f); +} diff --git a/shaders/fragment_density_map/quad_uvw.vert.spv b/shaders/fragment_density_map/quad_uvw.vert.spv new file mode 100644 index 0000000000..d5c1cd773a Binary files /dev/null and b/shaders/fragment_density_map/quad_uvw.vert.spv differ diff --git a/shaders/fragment_density_map/sky.frag b/shaders/fragment_density_map/sky.frag new file mode 100644 index 0000000000..9ed59962b0 --- /dev/null +++ b/shaders/fragment_density_map/sky.frag @@ -0,0 +1,55 @@ +#version 450 +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Adapted from instancing/starField.frag + +precision mediump float; + +layout(location = 0) in vec3 inUVW; + +layout(location = 0) out vec4 outFragColor; + +#define HASHSCALE3 vec3(443.897, 441.423, 437.195) +#define STARFREQUENCY 0.01 + +// Hash function by Dave Hoskins (https://www.shadertoy.com/view/4djSRW) +float hash33(vec3 p3) +{ + p3 = fract(p3 * HASHSCALE3); + p3 += dot(p3, p3.yxz + vec3(19.19)); + return fract((p3.x + p3.y) * p3.z + (p3.x + p3.z) * p3.y + (p3.y + p3.z) * p3.x); +} + +vec3 starField(vec3 pos) +{ + vec3 color = vec3(0.0); + float threshhold = (1.0 - STARFREQUENCY); + float rnd = hash33(pos); + if (rnd >= threshhold) + { + float starCol = pow((rnd - threshhold) / (1.0 - threshhold), 16.0); + color += vec3(starCol); + } + return color; +} + +void main() +{ + outFragColor = vec4(starField(inUVW), 1.0); +} diff --git a/shaders/fragment_density_map/sky.frag.spv b/shaders/fragment_density_map/sky.frag.spv new file mode 100644 index 0000000000..ff6efc11d9 Binary files /dev/null and b/shaders/fragment_density_map/sky.frag.spv differ diff --git a/shaders/fragment_density_map/sky_debug.frag b/shaders/fragment_density_map/sky_debug.frag new file mode 100644 index 0000000000..1f17fdbb5b --- /dev/null +++ b/shaders/fragment_density_map/sky_debug.frag @@ -0,0 +1,57 @@ +#version 450 +/* Copyright (c) 2019-2025, Sascha Willems + * Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Adapted from instancing/starField.frag + +precision mediump float; +#include "debug_fdm.glsl" + +layout(location = 0) in vec3 inUVW; + +layout(location = 0) out vec4 outFragColor; + +#define HASHSCALE3 vec3(443.897, 441.423, 437.195) +#define STARFREQUENCY 0.01 + +// Hash function by Dave Hoskins (https://www.shadertoy.com/view/4djSRW) +float hash33(vec3 p3) +{ + p3 = fract(p3 * HASHSCALE3); + p3 += dot(p3, p3.yxz + vec3(19.19)); + return fract((p3.x + p3.y) * p3.z + (p3.x + p3.z) * p3.y + (p3.y + p3.z) * p3.x); +} + +vec3 starField(vec3 pos) +{ + vec3 color = vec3(0.0); + float threshhold = (1.0 - STARFREQUENCY); + float rnd = hash33(pos); + if (rnd >= threshhold) + { + float starCol = pow((rnd - threshhold) / (1.0 - threshhold), 16.0); + color += vec3(starCol); + } + return color; +} + +void main() +{ + outFragColor = vec4(starField(inUVW), 1.0); + outFragColor.rgb = get_fdm_debug_color(outFragColor.rgb); +} diff --git a/shaders/fragment_density_map/sky_debug.frag.spv b/shaders/fragment_density_map/sky_debug.frag.spv new file mode 100644 index 0000000000..23985132f9 Binary files /dev/null and b/shaders/fragment_density_map/sky_debug.frag.spv differ diff --git a/shaders/fragment_density_map/texture.frag b/shaders/fragment_density_map/texture.frag new file mode 100644 index 0000000000..071f4ac720 --- /dev/null +++ b/shaders/fragment_density_map/texture.frag @@ -0,0 +1,27 @@ +#version 450 +/* Copyright (c) 2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) in vec2 in_uv; +layout(binding = 0) uniform sampler2D subsampled_image; + +layout(location = 0) out vec4 frag_colour; + +void main() +{ + frag_colour = texture(subsampled_image, in_uv); +} diff --git a/shaders/fragment_density_map/texture.frag.spv b/shaders/fragment_density_map/texture.frag.spv new file mode 100644 index 0000000000..dd370c5f5a Binary files /dev/null and b/shaders/fragment_density_map/texture.frag.spv differ diff --git a/shaders/fragment_shader_barycentric/object.frag b/shaders/fragment_shader_barycentric/glsl/object.frag similarity index 98% rename from shaders/fragment_shader_barycentric/object.frag rename to shaders/fragment_shader_barycentric/glsl/object.frag index 7d46a336c1..a5fffdc544 100644 --- a/shaders/fragment_shader_barycentric/object.frag +++ b/shaders/fragment_shader_barycentric/glsl/object.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/fragment_shader_barycentric/glsl/object.frag.spv b/shaders/fragment_shader_barycentric/glsl/object.frag.spv new file mode 100644 index 0000000000..ab67376368 Binary files /dev/null and b/shaders/fragment_shader_barycentric/glsl/object.frag.spv differ diff --git a/shaders/fragment_shader_barycentric/object.vert b/shaders/fragment_shader_barycentric/glsl/object.vert similarity index 96% rename from shaders/fragment_shader_barycentric/object.vert rename to shaders/fragment_shader_barycentric/glsl/object.vert index 0fcc57210d..09d190d16f 100644 --- a/shaders/fragment_shader_barycentric/object.vert +++ b/shaders/fragment_shader_barycentric/glsl/object.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/fragment_shader_barycentric/glsl/object.vert.spv b/shaders/fragment_shader_barycentric/glsl/object.vert.spv new file mode 100644 index 0000000000..35deede502 Binary files /dev/null and b/shaders/fragment_shader_barycentric/glsl/object.vert.spv differ diff --git a/shaders/fragment_shader_barycentric/skybox.frag b/shaders/fragment_shader_barycentric/glsl/skybox.frag similarity index 94% rename from shaders/fragment_shader_barycentric/skybox.frag rename to shaders/fragment_shader_barycentric/glsl/skybox.frag index dec0532d72..a2bcd172dc 100644 --- a/shaders/fragment_shader_barycentric/skybox.frag +++ b/shaders/fragment_shader_barycentric/glsl/skybox.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/fragment_shader_barycentric/glsl/skybox.frag.spv b/shaders/fragment_shader_barycentric/glsl/skybox.frag.spv new file mode 100644 index 0000000000..335eeedc65 Binary files /dev/null and b/shaders/fragment_shader_barycentric/glsl/skybox.frag.spv differ diff --git a/shaders/fragment_shader_barycentric/skybox.vert b/shaders/fragment_shader_barycentric/glsl/skybox.vert similarity index 95% rename from shaders/fragment_shader_barycentric/skybox.vert rename to shaders/fragment_shader_barycentric/glsl/skybox.vert index 97e54f9a32..14282682d1 100644 --- a/shaders/fragment_shader_barycentric/skybox.vert +++ b/shaders/fragment_shader_barycentric/glsl/skybox.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/fragment_shader_barycentric/glsl/skybox.vert.spv b/shaders/fragment_shader_barycentric/glsl/skybox.vert.spv new file mode 100644 index 0000000000..6796418c83 Binary files /dev/null and b/shaders/fragment_shader_barycentric/glsl/skybox.vert.spv differ diff --git a/shaders/fragment_shader_barycentric/slang/object.frag.slang b/shaders/fragment_shader_barycentric/slang/object.frag.slang new file mode 100644 index 0000000000..ceab9fff28 --- /dev/null +++ b/shaders/fragment_shader_barycentric/slang/object.frag.slang @@ -0,0 +1,74 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +[[vk::binding(1, 0)]] Sampler2D samplerColorMap; + +[shader("fragment")] +float4 main(VSOutput input, float3 baryCoords: SV_Barycentrics, noperspective float3 baryCoordsAffine: SV_Barycentrics, uint vertexIndex: SV_VertexID, uniform int type) +{ + float3 vColor0 = GetAttributeAtVertex(input.Color, 0); + float3 vColor1 = GetAttributeAtVertex(input.Color, 1); + float3 vColor2 = GetAttributeAtVertex(input.Color, 2); + + float4 outColor = 0.0; + switch (type) { + case 0: + { + outColor.rgb = vColor0 * baryCoords.x + + vColor1 * baryCoords.y + + vColor2 * baryCoords.z; + outColor.a = 1.0; + break; + } + case 1: + { + outColor.rgb = baryCoords - baryCoordsAffine; + const float exposure = 10.f; + outColor = float4(float3(1.0) - exp(-outColor.rgb * exposure), 1.0); + break; + } + case 2: + { + if (baryCoords.x < 0.01 || baryCoords.y < 0.01 || baryCoords.z < 0.01) + outColor = float4(0.0, 0.0, 0.0, 1.0); + else + outColor = float4(0.5, 0.5, 0.5, 1.0); + break; + } + case 3: + { + if (baryCoords.x <= baryCoords.y && baryCoords.x <= baryCoords.z) + outColor = float4(vColor0.rgb * baryCoords.x, 1.0); + else if (baryCoords.y < baryCoords.x && baryCoords.y <= baryCoords.z) + outColor = float4(vColor1.rgb * baryCoords.y, 1.0); + else + outColor = float4(vColor2.rgb * baryCoords.z, 1.0); + break; + } + case 4: + { + outColor = samplerColorMap.Sample(float2(sin(baryCoords.x) + cos(2 * baryCoords.z), sin(baryCoords.x) + cos(2 * baryCoords.y))); + } + } + return outColor; +} diff --git a/shaders/fragment_shader_barycentric/slang/object.frag.spv b/shaders/fragment_shader_barycentric/slang/object.frag.spv new file mode 100644 index 0000000000..b6dce4b67c Binary files /dev/null and b/shaders/fragment_shader_barycentric/slang/object.frag.spv differ diff --git a/shaders/fragment_shader_barycentric/slang/object.vert.slang b/shaders/fragment_shader_barycentric/slang/object.vert.slang new file mode 100644 index 0000000000..f62036dae3 --- /dev/null +++ b/shaders/fragment_shader_barycentric/slang/object.vert.slang @@ -0,0 +1,51 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +struct UBO { + float4x4 projection; + float4x4 modelview; +}; +ConstantBuffer ubo; + +static float3 triangleColors[6] = { + float3(1.0, 0.0, 0.0), + float3(0.0, 1.0, 0.0), + float3(0.0, 0.0, 1.0), + float3(0.0, 0.0, 1.0), + float3(0.0, 1.0, 0.0), + float3(1.0, 0.0, 0.0) +}; + +[shader("vertex")] +VSOutput main(VSInput input, uint VertexIndex: SV_VertexID) +{ + VSOutput output; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(input.Pos.xyz, 1.0))); + output.Color = triangleColors[VertexIndex % 6]; + return output; +} diff --git a/shaders/fragment_shader_barycentric/slang/object.vert.spv b/shaders/fragment_shader_barycentric/slang/object.vert.spv new file mode 100644 index 0000000000..c0304c811d Binary files /dev/null and b/shaders/fragment_shader_barycentric/slang/object.vert.spv differ diff --git a/shaders/fragment_shader_barycentric/slang/skybox.frag.slang b/shaders/fragment_shader_barycentric/slang/skybox.frag.slang new file mode 100644 index 0000000000..ce762ea41f --- /dev/null +++ b/shaders/fragment_shader_barycentric/slang/skybox.frag.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +[[vk::binding(1, 0)]] SamplerCube samplerEnvMap; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerEnvMap.Sample(input.UVW); +} diff --git a/shaders/fragment_shader_barycentric/slang/skybox.frag.spv b/shaders/fragment_shader_barycentric/slang/skybox.frag.spv new file mode 100644 index 0000000000..7d67132ace Binary files /dev/null and b/shaders/fragment_shader_barycentric/slang/skybox.frag.spv differ diff --git a/shaders/fragment_shader_barycentric/slang/skybox.vert.slang b/shaders/fragment_shader_barycentric/slang/skybox.vert.slang new file mode 100644 index 0000000000..7bc9115621 --- /dev/null +++ b/shaders/fragment_shader_barycentric/slang/skybox.vert.slang @@ -0,0 +1,42 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +struct UBO { + float4x4 projection; + float4x4 modelview; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Pos = mul(ubo.projection, float4(mul((float3x3)ubo.modelview, input.Pos), 1.0)); + output.UVW = input.Pos; + return output; +} \ No newline at end of file diff --git a/shaders/fragment_shader_barycentric/slang/skybox.vert.spv b/shaders/fragment_shader_barycentric/slang/skybox.vert.spv new file mode 100644 index 0000000000..8952701f42 Binary files /dev/null and b/shaders/fragment_shader_barycentric/slang/skybox.vert.spv differ diff --git a/shaders/fragment_shading_rate/glsl/scene.frag.spv b/shaders/fragment_shading_rate/glsl/scene.frag.spv new file mode 100644 index 0000000000..33076c00f8 Binary files /dev/null and b/shaders/fragment_shading_rate/glsl/scene.frag.spv differ diff --git a/shaders/fragment_shading_rate/glsl/scene.vert.spv b/shaders/fragment_shading_rate/glsl/scene.vert.spv new file mode 100644 index 0000000000..b995aeb171 Binary files /dev/null and b/shaders/fragment_shading_rate/glsl/scene.vert.spv differ diff --git a/shaders/fragment_shading_rate/hlsl/scene.frag.spv b/shaders/fragment_shading_rate/hlsl/scene.frag.spv index fe6f1b9f5f..5693d65e75 100644 Binary files a/shaders/fragment_shading_rate/hlsl/scene.frag.spv and b/shaders/fragment_shading_rate/hlsl/scene.frag.spv differ diff --git a/shaders/fragment_shading_rate/slang/scene.frag.slang b/shaders/fragment_shading_rate/slang/scene.frag.slang new file mode 100644 index 0000000000..25c8020505 --- /dev/null +++ b/shaders/fragment_shading_rate/slang/scene.frag.slang @@ -0,0 +1,107 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4x4 skybox_modelview; + int color_shading_rates; +}; +ConstantBuffer ubo; + +[[vk::binding(1, 0)]] Sampler2D samplerEnvMap; +[[vk::binding(2, 0)]] Sampler2D samplerSphere; + +static const uint SHADING_RATE_PER_PIXEL = 0; +static const uint SHADING_RATE_PER_2X1_PIXELS = 6; +static const uint SHADING_RATE_PER_1X2_PIXELS = 7; +static const uint SHADING_RATE_PER_2X2_PIXELS = 8; +static const uint SHADING_RATE_PER_4X2_PIXELS = 9; +static const uint SHADING_RATE_PER_2X4_PIXELS = 10; + +[shader("fragment")] +float4 main(VSOutput input, uint shadingRate: SV_ShadingRate, uniform float4 offset, uniform int object_type) +{ + float4 color; + + switch (object_type) { + case 0: // Skysphere + { + color = samplerEnvMap.Sample(float2(input.UV.x, 1.0 - input.UV.y)); + } + break; + + case 1: // Phong shading + { + float3 ambient = samplerSphere.Sample(input.UV).rgb; + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = float3(max(dot(N, L), (0.0).xxx)); + float3 specular = float3(pow(max(dot(R, V), (0.0).xxx), 8.0)); + color = float4(ambient + diffuse + specular, 1.0); + } + break; + } + + if (ubo.color_shading_rates == 1) { + // Visualize fragment shading rates + + const uint SHADING_RATE_1X1 = 0; + const uint SHADING_RATE_1X2 = 0x1; + const uint SHADING_RATE_2X1 = 0x4; + const uint SHADING_RATE_2X2 = 0x5; + const uint SHADING_RATE_2X4 = 0x6; + const uint SHADING_RATE_4X2 = 0x9; + const uint SHADING_RATE_4X4 = 0xa; + + int v = 1; + int h = 1; + + if ((shadingRate == SHADING_RATE_1X2) || (shadingRate == SHADING_RATE_2X2) || (shadingRate == SHADING_RATE_4X2)) { + v = 2; + } + if ((shadingRate == SHADING_RATE_2X4) || (shadingRate == SHADING_RATE_4X4)) { + v = 4; + } + if ((shadingRate == SHADING_RATE_2X1) || (shadingRate == SHADING_RATE_2X2) || (shadingRate == SHADING_RATE_2X4)) { + h = 2; + } + if ((shadingRate == SHADING_RATE_4X2) || (shadingRate == SHADING_RATE_4X4)) { + h = 4; + } + + if (v == 1 && h == 1) { + return float4(color.rrr * 1.0, 1.0); + } else { + return float4(color.rrr * 1.0 - ((v + h) * 0.05), 1.0); + } + } else { + return float4(color.rgb, 1.0); + } +} \ No newline at end of file diff --git a/shaders/fragment_shading_rate/slang/scene.frag.spv b/shaders/fragment_shading_rate/slang/scene.frag.spv new file mode 100644 index 0000000000..54d7cd15bc Binary files /dev/null and b/shaders/fragment_shading_rate/slang/scene.frag.spv differ diff --git a/shaders/fragment_shading_rate/slang/scene.vert.slang b/shaders/fragment_shading_rate/slang/scene.vert.slang new file mode 100644 index 0000000000..5fe17a1d87 --- /dev/null +++ b/shaders/fragment_shading_rate/slang/scene.vert.slang @@ -0,0 +1,66 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4x4 skybox_modelview; + int color_shading_rates; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4 offset, uniform int object_type) +{ + VSOutput output; + float3 outPos; + + switch (object_type) { + case 0: // Skysphere + outPos = mul((float3x3)ubo.skybox_modelview, input.Pos); + output.Pos = float4(mul(ubo.projection, float4(outPos, 1.0))); + break; + case 1: // Object + float3 localPos = input.Pos + offset.xyz; + outPos = mul((float3x3)ubo.modelview, localPos); + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(localPos, 1.0))); + break; + } + output.UV = input.UV; + output.Normal = mul((float3x3)ubo.modelview, input.Normal); + float3 lightPos = mul((float3x3)ubo.modelview, float3(0.0, -10.0, -10.0)); + output.LightVec = lightPos.xyz - outPos.xyz; + output.ViewVec = -outPos.xyz; + return output; +} \ No newline at end of file diff --git a/shaders/fragment_shading_rate/slang/scene.vert.spv b/shaders/fragment_shading_rate/slang/scene.vert.spv new file mode 100644 index 0000000000..a1c9b15ac6 Binary files /dev/null and b/shaders/fragment_shading_rate/slang/scene.vert.spv differ diff --git a/shaders/graphics_pipeline_library/glsl/shared.vert.spv b/shaders/graphics_pipeline_library/glsl/shared.vert.spv new file mode 100644 index 0000000000..c65515c7bb Binary files /dev/null and b/shaders/graphics_pipeline_library/glsl/shared.vert.spv differ diff --git a/shaders/graphics_pipeline_library/glsl/uber.frag.spv b/shaders/graphics_pipeline_library/glsl/uber.frag.spv new file mode 100644 index 0000000000..5ede8850a5 Binary files /dev/null and b/shaders/graphics_pipeline_library/glsl/uber.frag.spv differ diff --git a/shaders/graphics_pipeline_library/hlsl/uber.frag.spv b/shaders/graphics_pipeline_library/hlsl/uber.frag.spv index 906ffdf9b2..fe753a7b33 100644 Binary files a/shaders/graphics_pipeline_library/hlsl/uber.frag.spv and b/shaders/graphics_pipeline_library/hlsl/uber.frag.spv differ diff --git a/shaders/graphics_pipeline_library/slang/shared.vert.slang b/shaders/graphics_pipeline_library/slang/shared.vert.slang new file mode 100644 index 0000000000..fd667312f8 --- /dev/null +++ b/shaders/graphics_pipeline_library/slang/shared.vert.slang @@ -0,0 +1,54 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; + float3 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 ViewVec; + float3 LightVec; + nointerpolation float3 FlatNormal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 lightPos; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4 color) +{ + VSOutput output; + float3 vecPos = mul((float3x3)ubo.model, input.Pos.xyz).xyz; + output.Color = color.rgb; + output.Normal = mul((float3x3)ubo.model, input.Normal); + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + output.LightVec = ubo.lightPos.xyz - vecPos; + output.ViewVec = -vecPos; + return output; +} \ No newline at end of file diff --git a/shaders/graphics_pipeline_library/slang/shared.vert.spv b/shaders/graphics_pipeline_library/slang/shared.vert.spv new file mode 100644 index 0000000000..153d1379f4 Binary files /dev/null and b/shaders/graphics_pipeline_library/slang/shared.vert.spv differ diff --git a/shaders/graphics_pipeline_library/slang/uber.frag.slang b/shaders/graphics_pipeline_library/slang/uber.frag.slang new file mode 100644 index 0000000000..8219d54805 --- /dev/null +++ b/shaders/graphics_pipeline_library/slang/uber.frag.slang @@ -0,0 +1,70 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 ViewVec; + float3 LightVec; +}; + + +// We use this constant to control the flow of the shader depending on the +// lighting model selected at pipeline creation time +[[SpecializationConstant]] const int LIGHTING_MODEL = 0; + +[shader("fragment")] +float4 main(VSOutput input) +{ + switch (LIGHTING_MODEL) { + case 0: // Phong + { + float3 ambient = input.Color * (0.25).xxx; + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = max(dot(N, L), (0.0).xxx) * input.Color; + float3 specular = pow(max(dot(R, V), (0.0).xxx), 32.0) * (0.75).xxx; + return float4(ambient + diffuse * 1.75 + specular, 1.0); + } + case 1: // Toon + { + + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float intensity = dot(N, L); + float3 color; + if (intensity > 0.98) + color = input.Color * 1.5; + else if (intensity > 0.9) + color = input.Color * 1.0; + else if (intensity > 0.5) + color = input.Color * 0.6; + else if (intensity > 0.25) + color = input.Color * 0.4; + else + color = input.Color * 0.2; + // Desaturate a bit + color = float3(lerp(color, float3(dot(float3(0.2126, 0.7152, 0.0722), color).xxx), 0.25)); + return float4(color, 1.0); + } + } + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/graphics_pipeline_library/slang/uber.frag.spv b/shaders/graphics_pipeline_library/slang/uber.frag.spv new file mode 100644 index 0000000000..3eb4f79972 Binary files /dev/null and b/shaders/graphics_pipeline_library/slang/uber.frag.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader.frag b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.frag similarity index 96% rename from shaders/gshader_to_mshader/gshader_to_mshader.frag rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader.frag index 5b7a0d480b..4460cb7441 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader.frag +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader.frag.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.frag.spv new file mode 100644 index 0000000000..5c14846c1f Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.frag.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader.geom b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.geom similarity index 97% rename from shaders/gshader_to_mshader/gshader_to_mshader.geom rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader.geom index daa64a9a93..7de58bf055 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader.geom +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.geom @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader.geom.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.geom.spv new file mode 100644 index 0000000000..bff3c8f5ec Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.geom.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader.mesh b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.mesh similarity index 98% rename from shaders/gshader_to_mshader/gshader_to_mshader.mesh rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader.mesh index 92d7fe365f..d99a4616ba 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader.mesh +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.mesh @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader.mesh.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.mesh.spv new file mode 100644 index 0000000000..2c96f75743 Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.mesh.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader.vert b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.vert similarity index 92% rename from shaders/gshader_to_mshader/gshader_to_mshader.vert rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader.vert index 45585ae6fc..e6f0d54772 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader.vert +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -20,6 +20,7 @@ layout(set = 0, binding = 0) uniform UniformBufferObject { mat4 model; mat4 view; mat4 proj; + mat4 normal; } ubo; layout(location = 0) in vec3 inPosition; @@ -38,7 +39,7 @@ void main() vec4 FragPos = ubo.model * vec4(inPosition, 1.0f); vec3 lightPos = vec3(-20.0f, 5.0f, 5.0f); vec3 lPos = mat3(ubo.model) * lightPos.xyz; - outNormal = mat3(transpose(inverse( ubo.view *ubo.model))) * inNormal; + outNormal = mat3(ubo.normal) * inNormal; outLightVec = lPos.xyz - FragPos.xyz; outViewVec = - (ubo.view * ubo.model * vec4(inPosition, 1.0f)).xyz; diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader.vert.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.vert.spv new file mode 100644 index 0000000000..eb2852e78b Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader.vert.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader_base.frag b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.frag similarity index 94% rename from shaders/gshader_to_mshader/gshader_to_mshader_base.frag rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.frag index 622cdfc0d8..c4a34be539 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader_base.frag +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.frag.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.frag.spv new file mode 100644 index 0000000000..7cd7470de9 Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.frag.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader_base.vert b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.vert similarity index 95% rename from shaders/gshader_to_mshader/gshader_to_mshader_base.vert rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.vert index 36050c745b..283e64af1f 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader_base.vert +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.vert.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.vert.spv new file mode 100644 index 0000000000..bcd71f34b9 Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_base.vert.spv differ diff --git a/shaders/gshader_to_mshader/gshader_to_mshader_mesh.frag b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag similarity index 94% rename from shaders/gshader_to_mshader/gshader_to_mshader_mesh.frag rename to shaders/gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag index 5d1625ef19..1f40549f0e 100644 --- a/shaders/gshader_to_mshader/gshader_to_mshader_mesh.frag +++ b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, Mobica Limited +/* Copyright (c) 2023-2025, Mobica Limited * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag.spv b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag.spv new file mode 100644 index 0000000000..0d245eb18d Binary files /dev/null and b/shaders/gshader_to_mshader/glsl/gshader_to_mshader_mesh.frag.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.frag.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader.frag.slang new file mode 100644 index 0000000000..b1248ca076 --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader.frag.slang @@ -0,0 +1,45 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + float3 Normal; + float3 Color; + float3 ViewVec; + float3 LightVec; +} +[shader("fragment")] +float4 main(VSOutput input) +{ + float ambientStrength = 0.2; + float3 ambient = ambientStrength * float3(1.0); + + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + + float3 diffuse = max(dot(N,L), 0.0) * float3(1.0); + + float3 specular = pow(max(dot(R, V), 0.0), 64.0) * float3(0.65); + + float3 result = (ambient + diffuse) * input.Color + specular; + + return float4(result, 1.0f); +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.frag.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader.frag.spv new file mode 100644 index 0000000000..bbd30b3a53 Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader.frag.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.geom.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader.geom.slang new file mode 100644 index 0000000000..439a4b24c1 --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader.geom.slang @@ -0,0 +1,60 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + float3 Normal; +}; + +struct GSOutput +{ + float4 Pos : SV_Position; + float3 Color; +}; + +struct UBO { + float4x4 model; + float4x4 view; + float4x4 proj; +}; +[[vk::binding(1, 0)]] ConstantBuffer ubo; + +[shader("geometry")] +[maxvertexcount(2)] +void main(triangle VSOutput input[3], inout LineStream outStream) +{ + float normalLength = 0.1f; + + // middle point of triangle + float3 pos = (input[0].Pos.xyz + input[1].Pos.xyz + input[2].Pos.xyz) / 3.0; + float3 normal = input[0].Normal.xyz; + + GSOutput output; + + // line vertices + output.Pos = mul(ubo.proj, mul(ubo.view, mul(ubo.model, float4(pos, 1.0)))); + output.Color = float3(1.0, 0.0, 0.0); + outStream.Append(output); + + output.Pos = mul(ubo.proj, mul(ubo.view, mul(ubo.model, float4(pos + normal * normalLength, 1.0)))); + output.Color = float3(0.0, 0.0, 1.0); + outStream.Append(output); + + outStream.RestartStrip(); +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.geom.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader.geom.spv new file mode 100644 index 0000000000..a2525eb65c Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader.geom.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.mesh.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader.mesh.slang new file mode 100644 index 0000000000..269dce1630 --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader.mesh.slang @@ -0,0 +1,95 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct UBO +{ + float4x4 model; + float4x4 view; + float4x4 proj; +}; +[[vk::binding(2, 0)]] ConstantBuffer ubo; + +struct s_meshlet +{ + uint vertices[64]; + uint indices[126]; + uint vertex_count; + uint index_count; +}; +[[vk::binding(3, 0)]] StructuredBuffer meshlets; + +struct s_vertex +{ + float4 position; + float4 normal; +}; +[[vk::binding(4, 0)]] StructuredBuffer vertices; + +struct VertexOut { + float4 Pos : SV_Position; + float4 color; +} + +[shader("mesh")] +[outputtopology("line")] +[numthreads(1, 1, 1)] +void main(out indices uint2 outIndices[64], out vertices VertexOut outVertices[126], uint3 groupId: SV_GroupID, uint3 groupThreadId: SV_GroupThreadID) +{ + uint meshlet_index = groupId.x; + uint thread_id = groupThreadId.x; + uint vertex_count = meshlets[meshlet_index].vertex_count; + uint index_count = meshlets[meshlet_index].index_count; + uint primitive_count = index_count/3; + SetMeshOutputCounts(primitive_count * 2, primitive_count); + + float normalLength = 0.1; + + float4x4 MVP = mul(ubo.proj, mul(ubo.view, ubo.model)); + + uint j = 0; + uint k = 0; + for (uint i = 0; i < primitive_count; ++i) + { + //triangle indices + uint vi1 = meshlets[meshlet_index].indices[j]; + uint vi2 = meshlets[meshlet_index].indices[j + 1]; + uint vi3 = meshlets[meshlet_index].indices[j + 2]; + + //middle point of triangle + float3 pos = (vertices[vi1].position.xyz + vertices[vi2].position.xyz + vertices[vi3].position.xyz) / 3.0; + float3 normal = vertices[vi1].normal.xyz; + + // line vertices + outVertices[k].Pos = mul(MVP, float4(pos, 1.0)); + outVertices[k].color = float4(0.0, 0.0, 1.0, 1.0); + + outVertices[k + 1].Pos = mul(MVP, float4(pos + normal * normalLength, 1.0)); + outVertices[k + 1].color = float4(1.0, 0.0, 0.0, 1.0); + + k = k + 2; + j= j + 3; + } + + //indices for line vertices + k = 0; + for (uint i = 0; i < primitive_count; i++) + { + outIndices[i] = uint2(k, k+1); + k = k + 2; + } +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.mesh.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader.mesh.spv new file mode 100644 index 0000000000..e3be80d38c Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader.mesh.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.vert.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader.vert.slang new file mode 100644 index 0000000000..01f23cf6dd --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader.vert.slang @@ -0,0 +1,57 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO { + float4x4 model; + float4x4 view; + float4x4 proj; + float4x4 normal; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Color = float3(0.0f, 1.0f, 1.0f); + output.Pos = mul(ubo.proj, mul(ubo.view, mul(ubo.model, float4(input.Pos, 1.0f)))); + + float4 FragPos = mul(ubo.model, float4(input.Pos, 1.0f)); + float3 lightPos = float3(-20.0f, 5.0f, 5.0f); + float3 lPos = mul(float3x3(ubo.model), lightPos.xyz); + output.Normal = mul(float3x3(ubo.normal), input.Normal); + + output.LightVec = lPos.xyz - FragPos.xyz; + output.ViewVec = -mul(ubo.view, mul(ubo.model, float4(input.Pos, 1.0f))).xyz; + return output; +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader.vert.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader.vert.spv new file mode 100644 index 0000000000..fdf81d885d Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader.vert.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.frag.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.frag.slang new file mode 100644 index 0000000000..5f4ebe2f00 --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.frag.slang @@ -0,0 +1,29 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + float3 Color; +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(input.Color, 1.0f); +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.frag.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.frag.spv new file mode 100644 index 0000000000..57e6ef985c Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.frag.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.vert.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.vert.slang new file mode 100644 index 0000000000..55e202897b --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.vert.slang @@ -0,0 +1,38 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float4 Pos; + float3 Normal; +} + +struct VSOutput +{ + float4 Pos : SV_Position; + float3 Normal; +} + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Normal = input.Normal; + output.Pos = float4(input.Pos.xyz, 1.0); + return output; +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.vert.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.vert.spv new file mode 100644 index 0000000000..a81a2a5598 Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader_base.vert.spv differ diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.slang b/shaders/gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.slang new file mode 100644 index 0000000000..cf009f07c9 --- /dev/null +++ b/shaders/gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.slang @@ -0,0 +1,29 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + float4 Color; +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + return input.Color; +} diff --git a/shaders/gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.spv b/shaders/gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.spv new file mode 100644 index 0000000000..d6f2503d7d Binary files /dev/null and b/shaders/gshader_to_mshader/slang/gshader_to_mshader_mesh.frag.spv differ diff --git a/shaders/hdr/glsl/bloom.frag.spv b/shaders/hdr/glsl/bloom.frag.spv new file mode 100644 index 0000000000..9ce0979992 Binary files /dev/null and b/shaders/hdr/glsl/bloom.frag.spv differ diff --git a/shaders/hdr/glsl/bloom.vert.spv b/shaders/hdr/glsl/bloom.vert.spv new file mode 100644 index 0000000000..7362f82e59 Binary files /dev/null and b/shaders/hdr/glsl/bloom.vert.spv differ diff --git a/shaders/hdr/glsl/composition.frag.spv b/shaders/hdr/glsl/composition.frag.spv new file mode 100644 index 0000000000..5d7ad39dc5 Binary files /dev/null and b/shaders/hdr/glsl/composition.frag.spv differ diff --git a/shaders/hdr/glsl/composition.vert.spv b/shaders/hdr/glsl/composition.vert.spv new file mode 100644 index 0000000000..7362f82e59 Binary files /dev/null and b/shaders/hdr/glsl/composition.vert.spv differ diff --git a/shaders/hdr/glsl/gbuffer.frag.spv b/shaders/hdr/glsl/gbuffer.frag.spv new file mode 100644 index 0000000000..b8ca69b9f2 Binary files /dev/null and b/shaders/hdr/glsl/gbuffer.frag.spv differ diff --git a/shaders/hdr/glsl/gbuffer.vert.spv b/shaders/hdr/glsl/gbuffer.vert.spv new file mode 100644 index 0000000000..5fbdae77ab Binary files /dev/null and b/shaders/hdr/glsl/gbuffer.vert.spv differ diff --git a/shaders/hdr/hlsl/gbuffer.frag.hlsl b/shaders/hdr/hlsl/gbuffer.frag.hlsl index de0355b5ae..4a09800df0 100644 --- a/shaders/hdr/hlsl/gbuffer.frag.hlsl +++ b/shaders/hdr/hlsl/gbuffer.frag.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -97,7 +97,8 @@ FSOutput main(VSOutput input) fresnel *= (1.0 - F0); fresnel += F0; - float spec = (fresnel * geoAtt) / (NdotV * NdotL * 3.14); + // Note: clamp to zero to mitigate any divide by zero + float spec = max((fresnel * geoAtt) / (NdotV * NdotL * 3.14), 0.0); color = textureEnvMap.Sample(samplerEnvMap, reflect(-wViewVec, wNormal)); diff --git a/shaders/hdr/hlsl/gbuffer.frag.spv b/shaders/hdr/hlsl/gbuffer.frag.spv index 89a20a663f..722cb6d711 100644 Binary files a/shaders/hdr/hlsl/gbuffer.frag.spv and b/shaders/hdr/hlsl/gbuffer.frag.spv differ diff --git a/shaders/hdr/slang/bloom.frag.slang b/shaders/hdr/slang/bloom.frag.slang new file mode 100644 index 0000000000..5ab45958a7 --- /dev/null +++ b/shaders/hdr/slang/bloom.frag.slang @@ -0,0 +1,82 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +Sampler2D samplerColor0; +Sampler2D samplerColor1; + +[[SpecializationConstant]] const int dir = 0; + +[shader("fragment")] +float4 main(VSOutput input) +{ + // From the OpenGL Super bible + const float weights[] = { 0.0024499299678342, + 0.0043538453346397, + 0.0073599963704157, + 0.0118349786570722, + 0.0181026699707781, + 0.0263392293891488, + 0.0364543006660986, + 0.0479932050577658, + 0.0601029809166942, + 0.0715974486241365, + 0.0811305381519717, + 0.0874493212267511, + 0.0896631113333857, + 0.0874493212267511, + 0.0811305381519717, + 0.0715974486241365, + 0.0601029809166942, + 0.0479932050577658, + 0.0364543006660986, + 0.0263392293891488, + 0.0181026699707781, + 0.0118349786570722, + 0.0073599963704157, + 0.0043538453346397, + 0.0024499299678342}; + + + const float blurScale = 0.003; + const float blurStrength = 1.0; + + float ar = 1.0; + // Aspect ratio for vertical blur pass + if (dir == 1) + { + float2 ts; + samplerColor1.GetDimensions(ts.x, ts.y); + ar = ts.y / ts.x; + } + + float2 P = input.UV.yx - float2(0, (weights.getCount() >> 1) * ar * blurScale); + + float4 color = float4(0.0, 0.0, 0.0, 0.0); + for (int i = 0; i < weights.getCount(); i++) + { + float2 dv = float2(0.0, i * blurScale) * ar; + color += samplerColor1.Sample(P + dv) * weights[i] * blurStrength; + } + + return color; +} \ No newline at end of file diff --git a/shaders/hdr/slang/bloom.frag.spv b/shaders/hdr/slang/bloom.frag.spv new file mode 100644 index 0000000000..23cc325c64 Binary files /dev/null and b/shaders/hdr/slang/bloom.frag.spv differ diff --git a/shaders/hdr/slang/bloom.vert.slang b/shaders/hdr/slang/bloom.vert.slang new file mode 100644 index 0000000000..fd64a125b8 --- /dev/null +++ b/shaders/hdr/slang/bloom.vert.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/hdr/slang/bloom.vert.spv b/shaders/hdr/slang/bloom.vert.spv new file mode 100644 index 0000000000..26860adcd1 Binary files /dev/null and b/shaders/hdr/slang/bloom.vert.spv differ diff --git a/shaders/hdr/slang/composition.frag.slang b/shaders/hdr/slang/composition.frag.slang new file mode 100644 index 0000000000..263cb5cb73 --- /dev/null +++ b/shaders/hdr/slang/composition.frag.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +Sampler2D samplerColor; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerColor.Sample(input.UV); +} \ No newline at end of file diff --git a/shaders/hdr/slang/composition.frag.spv b/shaders/hdr/slang/composition.frag.spv new file mode 100644 index 0000000000..40782f9691 Binary files /dev/null and b/shaders/hdr/slang/composition.frag.spv differ diff --git a/shaders/hdr/slang/composition.vert.slang b/shaders/hdr/slang/composition.vert.slang new file mode 100644 index 0000000000..fd64a125b8 --- /dev/null +++ b/shaders/hdr/slang/composition.vert.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID) +{ + VSOutput output; + output.UV = float2((VertexIndex << 1) & 2, VertexIndex & 2); + output.Pos = float4(output.UV * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/hdr/slang/composition.vert.spv b/shaders/hdr/slang/composition.vert.spv new file mode 100644 index 0000000000..26860adcd1 Binary files /dev/null and b/shaders/hdr/slang/composition.vert.spv differ diff --git a/shaders/hdr/slang/gbuffer.frag.slang b/shaders/hdr/slang/gbuffer.frag.slang new file mode 100644 index 0000000000..a45e6d995a --- /dev/null +++ b/shaders/hdr/slang/gbuffer.frag.slang @@ -0,0 +1,122 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +struct FSOutput +{ + float4 Color0; + float4 Color1; +}; + +struct UBOMatrices +{ + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float4x4 inverseModelView; + float modelscale; +}; +ConstantBuffer uboMatrices; + +SamplerCube samplerEnvMap; + +struct UBO { + float exposure; +}; +ConstantBuffer ubo; + +[[SpecializationConstant]] const int type = 0; + +[shader("fragment")] +FSOutput main(VSOutput input) +{ + FSOutput output; + float4 color; + float3 wcNormal; + + switch (type) { + case 0: // Skybox + { + float3 normal = normalize(input.UVW); + color = samplerEnvMap.Sample(normal); + } + break; + + case 1: // Reflect + { + float3 wViewVec = mul((float3x3)uboMatrices.inverseModelView, normalize(input.ViewVec)); + float3 normal = normalize(input.Normal); + float3 wNormal = mul((float3x3)uboMatrices.inverseModelView, normal); + + float NdotL = max(dot(normal, input.LightVec), 0.0); + + float3 eyeDir = normalize(input.ViewVec); + float3 halfVec = normalize(input.LightVec + eyeDir); + float NdotH = max(dot(normal, halfVec), 0.0); + float NdotV = max(dot(normal, eyeDir), 0.0); + float VdotH = max(dot(eyeDir, halfVec), 0.0); + + // Geometric attenuation + float NH2 = 2.0 * NdotH; + float g1 = (NH2 * NdotV) / VdotH; + float g2 = (NH2 * NdotL) / VdotH; + float geoAtt = min(1.0, min(g1, g2)); + + const float F0 = 0.6; + const float k = 0.2; + + // Fresnel (schlick approximation) + float fresnel = pow(1.0 - VdotH, 5.0); + fresnel *= (1.0 - F0); + fresnel += F0; + + // Note: clamp to zero to mitigate any divide by zero + float spec = max((fresnel * geoAtt) / (NdotV * NdotL * 3.14), 0.0); + + color = samplerEnvMap.Sample(reflect(-wViewVec, wNormal)); + + color = float4(color.rgb * NdotL * (k + spec * (1.0 - k)), 1.0); + } + break; + + case 2: // Refract + { + float3 wViewVec = mul((float3x3)uboMatrices.inverseModelView, normalize(input.ViewVec)); + float3 wNormal = mul((float3x3)uboMatrices.inverseModelView, input.Normal); + color = samplerEnvMap.Sample(refract(-wViewVec, wNormal, 1.0 / 1.6)); + } + break; + } + + // Color with manual exposure into attachment 0 + output.Color0.rgb = float3(1.0, 1.0, 1.0) - exp(-color.rgb * ubo.exposure); + + // Bright parts for bloom into attachment 1 + float l = dot(output.Color0.rgb, float3(0.2126, 0.7152, 0.0722)); + float threshold = 0.75; + output.Color1.rgb = (l > threshold) ? output.Color0.rgb : float3(0.0, 0.0, 0.0); + output.Color1.a = 1.0; + return output; +} \ No newline at end of file diff --git a/shaders/hdr/slang/gbuffer.frag.spv b/shaders/hdr/slang/gbuffer.frag.spv new file mode 100644 index 0000000000..6a0f2b79da Binary files /dev/null and b/shaders/hdr/slang/gbuffer.frag.spv differ diff --git a/shaders/hdr/slang/gbuffer.vert.slang b/shaders/hdr/slang/gbuffer.vert.slang new file mode 100644 index 0000000000..b72ba05338 --- /dev/null +++ b/shaders/hdr/slang/gbuffer.vert.slang @@ -0,0 +1,65 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO { + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float4x4 inverseModelView; + float modelscale; +}; +ConstantBuffer ubo; + +[[SpecializationConstant]] const int type = 0; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UVW = input.Pos; + float3 worldPos; + switch (type) { + case 0: // Skybox + worldPos = mul((float3x3)ubo.skyboxModelview, input.Pos); + output.Pos = mul(ubo.projection, float4(worldPos, 1.0)); + break; + case 1: // Object + worldPos = mul(ubo.modelview, float4(input.Pos * ubo.modelscale, 1.0)).xyz; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(input.Pos.xyz * ubo.modelscale, 1.0))); + break; + } + output.Normal = mul((float3x3)ubo.modelview, input.Normal); + float3 lightPos = float3(0.0f, -5.0f, 5.0f); + output.LightVec = lightPos.xyz - worldPos.xyz; + output.ViewVec = -worldPos.xyz; + return output; +} \ No newline at end of file diff --git a/shaders/hdr/slang/gbuffer.vert.spv b/shaders/hdr/slang/gbuffer.vert.spv new file mode 100644 index 0000000000..a580e3fbb4 Binary files /dev/null and b/shaders/hdr/slang/gbuffer.vert.spv differ diff --git a/shaders/hello_triangle/glsl/triangle.frag b/shaders/hello_triangle/glsl/triangle.frag new file mode 100644 index 0000000000..7765a4fdb6 --- /dev/null +++ b/shaders/hello_triangle/glsl/triangle.frag @@ -0,0 +1,26 @@ +#version 450 +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) in vec3 inColor; + +layout(location = 0) out vec4 outColor; + +void main() +{ + outColor = vec4(inColor, 1.0); +} \ No newline at end of file diff --git a/shaders/hello_triangle/glsl/triangle.frag.spv b/shaders/hello_triangle/glsl/triangle.frag.spv new file mode 100644 index 0000000000..b83092dd81 Binary files /dev/null and b/shaders/hello_triangle/glsl/triangle.frag.spv differ diff --git a/shaders/hello_triangle/glsl/triangle.vert b/shaders/hello_triangle/glsl/triangle.vert new file mode 100644 index 0000000000..c43045ed62 --- /dev/null +++ b/shaders/hello_triangle/glsl/triangle.vert @@ -0,0 +1,28 @@ +#version 450 +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec3 inColor; + +layout(location = 0) out vec3 outColor; + +void main() +{ + outColor = inColor; + gl_Position = vec4(inPosition, 1.0); +} \ No newline at end of file diff --git a/shaders/hello_triangle/glsl/triangle.vert.spv b/shaders/hello_triangle/glsl/triangle.vert.spv new file mode 100644 index 0000000000..58e3abf4aa Binary files /dev/null and b/shaders/hello_triangle/glsl/triangle.vert.spv differ diff --git a/shaders/hlsl_shaders/hlsl_shader.frag b/shaders/hello_triangle/hlsl/triangle.frag.hlsl similarity index 70% rename from shaders/hlsl_shaders/hlsl_shader.frag rename to shaders/hello_triangle/hlsl/triangle.frag.hlsl index a6b2616562..234f554f6b 100644 --- a/shaders/hlsl_shaders/hlsl_shader.frag +++ b/shaders/hello_triangle/hlsl/triangle.frag.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Sascha Willems +/* Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -15,17 +15,13 @@ * limitations under the License. */ -Texture2D textureColor : register(t1, space0); -SamplerState samplerColor : register(s1, space0); - struct VSOutput { - float4 Pos : SV_POSITION; -[[vk::location(0)]] float2 UV : TEXCOORD0; + float4 Position : SV_POSITION; + [[vk::location(0)]] float3 Color : COLOR0; }; float4 main(VSOutput input) : SV_TARGET { - float4 color = textureColor.Sample(samplerColor, input.UV); - return color; + return float4(input.Color, 1.0); } \ No newline at end of file diff --git a/shaders/hello_triangle/hlsl/triangle.frag.spv b/shaders/hello_triangle/hlsl/triangle.frag.spv new file mode 100644 index 0000000000..07a018a9e6 Binary files /dev/null and b/shaders/hello_triangle/hlsl/triangle.frag.spv differ diff --git a/shaders/hello_triangle/hlsl/triangle.vert.hlsl b/shaders/hello_triangle/hlsl/triangle.vert.hlsl new file mode 100644 index 0000000000..4abc6486f0 --- /dev/null +++ b/shaders/hello_triangle/hlsl/triangle.vert.hlsl @@ -0,0 +1,36 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + [[vk::location(0)]] float3 Position : POSITION0; + [[vk::location(1)]] float3 Color : COLOR0; +}; + +struct VSOutput +{ + float4 Position : SV_POSITION; + [[vk::location(0)]] float3 Color : COLOR0; +}; + +VSOutput main(VSInput input) +{ + VSOutput output; + output.Position = float4(input.Position, 1.0); + output.Color = input.Color; + return output; +} \ No newline at end of file diff --git a/shaders/hello_triangle/hlsl/triangle.vert.spv b/shaders/hello_triangle/hlsl/triangle.vert.spv new file mode 100644 index 0000000000..516eea7f46 Binary files /dev/null and b/shaders/hello_triangle/hlsl/triangle.vert.spv differ diff --git a/shaders/hello_triangle/slang/triangle.frag.slang b/shaders/hello_triangle/slang/triangle.frag.slang new file mode 100644 index 0000000000..78099c0aef --- /dev/null +++ b/shaders/hello_triangle/slang/triangle.frag.slang @@ -0,0 +1,28 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Position : SV_POSITION; + float3 Color; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/hello_triangle/slang/triangle.frag.spv b/shaders/hello_triangle/slang/triangle.frag.spv new file mode 100644 index 0000000000..57e6ef985c Binary files /dev/null and b/shaders/hello_triangle/slang/triangle.frag.spv differ diff --git a/shaders/hello_triangle/slang/triangle.vert.slang b/shaders/hello_triangle/slang/triangle.vert.slang new file mode 100644 index 0000000000..a7bccbf201 --- /dev/null +++ b/shaders/hello_triangle/slang/triangle.vert.slang @@ -0,0 +1,37 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Position : POSITION0; + float3 Color; +}; + +struct VSOutput +{ + float4 Position : SV_POSITION; + float3 Color; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Position = float4(input.Position, 1.0); + output.Color = input.Color; + return output; +} \ No newline at end of file diff --git a/shaders/hello_triangle/slang/triangle.vert.spv b/shaders/hello_triangle/slang/triangle.vert.spv new file mode 100644 index 0000000000..3977b8abb5 Binary files /dev/null and b/shaders/hello_triangle/slang/triangle.vert.spv differ diff --git a/shaders/hello_triangle_1_3/glsl/triangle.frag b/shaders/hello_triangle_1_3/glsl/triangle.frag new file mode 100644 index 0000000000..d454246ec8 --- /dev/null +++ b/shaders/hello_triangle_1_3/glsl/triangle.frag @@ -0,0 +1,26 @@ +#version 450 +/* Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout(location = 0) in vec3 in_color; + +layout(location = 0) out vec4 out_color; + +void main() +{ + out_color = vec4(in_color, 1.0); +} \ No newline at end of file diff --git a/shaders/hello_triangle_1_3/glsl/triangle.frag.spv b/shaders/hello_triangle_1_3/glsl/triangle.frag.spv new file mode 100644 index 0000000000..782c404c1b Binary files /dev/null and b/shaders/hello_triangle_1_3/glsl/triangle.frag.spv differ diff --git a/components/unix/tests/entrypoint.test.cpp b/shaders/hello_triangle_1_3/glsl/triangle.vert similarity index 68% rename from components/unix/tests/entrypoint.test.cpp rename to shaders/hello_triangle_1_3/glsl/triangle.vert index 44c2d03af7..ff9e1a5d69 100644 --- a/components/unix/tests/entrypoint.test.cpp +++ b/shaders/hello_triangle_1_3/glsl/triangle.vert @@ -1,4 +1,5 @@ -/* Copyright (c) 2023, Thomas Atkinson +#version 450 +/* Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 * @@ -15,17 +16,14 @@ * limitations under the License. */ -#define PLATFORM_LINUX -#include +layout(location = 0) in vec2 in_position; +layout(location = 1) in vec3 in_color; -#include +layout(location = 0) out vec3 out_color; -CUSTOM_MAIN(context) +void main() { - if (!dynamic_cast(&context)) - { - throw "context is not a UnixPlatformContext"; - } + gl_Position = vec4(in_position, 0.5, 1.0); - return 0; + out_color = in_color; } \ No newline at end of file diff --git a/shaders/hello_triangle_1_3/glsl/triangle.vert.spv b/shaders/hello_triangle_1_3/glsl/triangle.vert.spv new file mode 100644 index 0000000000..6eb96e47b2 Binary files /dev/null and b/shaders/hello_triangle_1_3/glsl/triangle.vert.spv differ diff --git a/shaders/hello_triangle_1_3/hlsl/triangle.frag.hlsl b/shaders/hello_triangle_1_3/hlsl/triangle.frag.hlsl new file mode 100644 index 0000000000..234f554f6b --- /dev/null +++ b/shaders/hello_triangle_1_3/hlsl/triangle.frag.hlsl @@ -0,0 +1,27 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Position : SV_POSITION; + [[vk::location(0)]] float3 Color : COLOR0; +}; + +float4 main(VSOutput input) : SV_TARGET +{ + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/hello_triangle_1_3/hlsl/triangle.frag.spv b/shaders/hello_triangle_1_3/hlsl/triangle.frag.spv new file mode 100644 index 0000000000..07a018a9e6 Binary files /dev/null and b/shaders/hello_triangle_1_3/hlsl/triangle.frag.spv differ diff --git a/shaders/hello_triangle_1_3/hlsl/triangle.vert.hlsl b/shaders/hello_triangle_1_3/hlsl/triangle.vert.hlsl new file mode 100644 index 0000000000..4abc6486f0 --- /dev/null +++ b/shaders/hello_triangle_1_3/hlsl/triangle.vert.hlsl @@ -0,0 +1,36 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + [[vk::location(0)]] float3 Position : POSITION0; + [[vk::location(1)]] float3 Color : COLOR0; +}; + +struct VSOutput +{ + float4 Position : SV_POSITION; + [[vk::location(0)]] float3 Color : COLOR0; +}; + +VSOutput main(VSInput input) +{ + VSOutput output; + output.Position = float4(input.Position, 1.0); + output.Color = input.Color; + return output; +} \ No newline at end of file diff --git a/shaders/hello_triangle_1_3/hlsl/triangle.vert.spv b/shaders/hello_triangle_1_3/hlsl/triangle.vert.spv new file mode 100644 index 0000000000..516eea7f46 Binary files /dev/null and b/shaders/hello_triangle_1_3/hlsl/triangle.vert.spv differ diff --git a/shaders/hello_triangle_1_3/slang/triangle.frag.slang b/shaders/hello_triangle_1_3/slang/triangle.frag.slang new file mode 100644 index 0000000000..78099c0aef --- /dev/null +++ b/shaders/hello_triangle_1_3/slang/triangle.frag.slang @@ -0,0 +1,28 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Position : SV_POSITION; + float3 Color; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/hello_triangle_1_3/slang/triangle.frag.spv b/shaders/hello_triangle_1_3/slang/triangle.frag.spv new file mode 100644 index 0000000000..57e6ef985c Binary files /dev/null and b/shaders/hello_triangle_1_3/slang/triangle.frag.spv differ diff --git a/shaders/hello_triangle_1_3/slang/triangle.vert.slang b/shaders/hello_triangle_1_3/slang/triangle.vert.slang new file mode 100644 index 0000000000..a7bccbf201 --- /dev/null +++ b/shaders/hello_triangle_1_3/slang/triangle.vert.slang @@ -0,0 +1,37 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Position : POSITION0; + float3 Color; +}; + +struct VSOutput +{ + float4 Position : SV_POSITION; + float3 Color; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Position = float4(input.Position, 1.0); + output.Color = input.Color; + return output; +} \ No newline at end of file diff --git a/shaders/hello_triangle_1_3/slang/triangle.vert.spv b/shaders/hello_triangle_1_3/slang/triangle.vert.spv new file mode 100644 index 0000000000..3977b8abb5 Binary files /dev/null and b/shaders/hello_triangle_1_3/slang/triangle.vert.spv differ diff --git a/shaders/imgui.frag.spv b/shaders/imgui.frag.spv new file mode 100644 index 0000000000..743cb8dfeb Binary files /dev/null and b/shaders/imgui.frag.spv differ diff --git a/shaders/imgui.vert.spv b/shaders/imgui.vert.spv new file mode 100644 index 0000000000..f6d0a23bd5 Binary files /dev/null and b/shaders/imgui.vert.spv differ diff --git a/shaders/lighting.h b/shaders/includes/glsl/lighting.h similarity index 97% rename from shaders/lighting.h rename to shaders/includes/glsl/lighting.h index fa3fd0df98..87b3429a96 100644 --- a/shaders/lighting.h +++ b/shaders/includes/glsl/lighting.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, Arm Limited and Contributors +/* Copyright (c) 2020-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/instancing/glsl/instancing.frag.spv b/shaders/instancing/glsl/instancing.frag.spv new file mode 100644 index 0000000000..25b5cc1b51 Binary files /dev/null and b/shaders/instancing/glsl/instancing.frag.spv differ diff --git a/shaders/instancing/glsl/instancing.vert.spv b/shaders/instancing/glsl/instancing.vert.spv new file mode 100644 index 0000000000..712ae8164e Binary files /dev/null and b/shaders/instancing/glsl/instancing.vert.spv differ diff --git a/shaders/instancing/glsl/planet.frag.spv b/shaders/instancing/glsl/planet.frag.spv new file mode 100644 index 0000000000..f46c59a809 Binary files /dev/null and b/shaders/instancing/glsl/planet.frag.spv differ diff --git a/shaders/instancing/glsl/planet.vert.spv b/shaders/instancing/glsl/planet.vert.spv new file mode 100644 index 0000000000..049e7d4db0 Binary files /dev/null and b/shaders/instancing/glsl/planet.vert.spv differ diff --git a/shaders/instancing/glsl/starfield.frag.spv b/shaders/instancing/glsl/starfield.frag.spv new file mode 100644 index 0000000000..e82b88c56c Binary files /dev/null and b/shaders/instancing/glsl/starfield.frag.spv differ diff --git a/shaders/instancing/glsl/starfield.vert.spv b/shaders/instancing/glsl/starfield.vert.spv new file mode 100644 index 0000000000..d5c1cd773a Binary files /dev/null and b/shaders/instancing/glsl/starfield.vert.spv differ diff --git a/shaders/instancing/hlsl/instancing.frag.spv b/shaders/instancing/hlsl/instancing.frag.spv index 6d7e5b3d4a..6695defca8 100644 Binary files a/shaders/instancing/hlsl/instancing.frag.spv and b/shaders/instancing/hlsl/instancing.frag.spv differ diff --git a/shaders/instancing/hlsl/planet.frag.spv b/shaders/instancing/hlsl/planet.frag.spv index 2ca69f745e..8e021f016b 100644 Binary files a/shaders/instancing/hlsl/planet.frag.spv and b/shaders/instancing/hlsl/planet.frag.spv differ diff --git a/shaders/instancing/hlsl/starfield.frag.spv b/shaders/instancing/hlsl/starfield.frag.spv index f4ed3f5da8..31edd668d6 100644 Binary files a/shaders/instancing/hlsl/starfield.frag.spv and b/shaders/instancing/hlsl/starfield.frag.spv differ diff --git a/shaders/instancing/slang/instancing.frag.slang b/shaders/instancing/slang/instancing.frag.slang new file mode 100644 index 0000000000..9b17ad0125 --- /dev/null +++ b/shaders/instancing/slang/instancing.frag.slang @@ -0,0 +1,41 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 UV; + float3 ViewVec; + float3 LightVec; +}; + +[[vk::binding(1,0)]] Sampler2DArray samplerArray; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float4 color = samplerArray.Sample(input.UV) * float4(input.Color, 1.0); + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = max(dot(N, L), 0.1) * input.Color; + float3 specular = (dot(N,L) > 0.0) ? pow(max(dot(R, V), 0.0), 16.0) * float3(0.75, 0.75, 0.75) * color.r : float3(0.0, 0.0, 0.0); + return float4(diffuse * color.rgb + specular, 1.0); +} \ No newline at end of file diff --git a/shaders/instancing/slang/instancing.frag.spv b/shaders/instancing/slang/instancing.frag.spv new file mode 100644 index 0000000000..2de9a2cfbe Binary files /dev/null and b/shaders/instancing/slang/instancing.frag.spv differ diff --git a/shaders/instancing/slang/instancing.vert.slang b/shaders/instancing/slang/instancing.vert.slang new file mode 100644 index 0000000000..383c6cc7bc --- /dev/null +++ b/shaders/instancing/slang/instancing.vert.slang @@ -0,0 +1,103 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +struct VSInput +{ + // Vertex attributes + float3 Pos : POSITION0; + float3 Normal : NORMAL0; + float2 UV : TEXCOORD0; + + // Instanced attributes + float3 instancePos : POSITION1; + float3 instanceRot : TEXCOORD1; + float instanceScale : TEXCOORD2; + int instanceTexIndex : TEXCOORD3; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 UV; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4 lightPos; + float locSpeed; + float globSpeed; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Color = float3(1.0); + output.UV = float3(input.UV, input.instanceTexIndex); + + // rotate around x + float s = sin(input.instanceRot.x + ubo.locSpeed); + float c = cos(input.instanceRot.x + ubo.locSpeed); + + float3x3 mx = { c, -s, 0.0, + s, c, 0.0, + 0.0, 0.0, 1.0 }; + + // rotate around y + s = sin(input.instanceRot.y + ubo.locSpeed); + c = cos(input.instanceRot.y + ubo.locSpeed); + + float3x3 my = { c, 0.0, -s, + 0.0, 1.0, 0.0, + s, 0.0, c }; + + // rot around z + s = sin(input.instanceRot.z + ubo.locSpeed); + c = cos(input.instanceRot.z + ubo.locSpeed); + + float3x3 mz = { 1.0, 0.0, 0.0, + 0.0, c, -s, + 0.0, s, c }; + + float3x3 rotMat = mul(mz, mul(my, mx)); + + float4x4 gRotMat; + s = sin(input.instanceRot.y + ubo.globSpeed); + c = cos(input.instanceRot.y + ubo.globSpeed); + gRotMat[0] = float4(c, 0.0, -s, 0.0); + gRotMat[1] = float4(0.0, 1.0, 0.0, 0.0); + gRotMat[2] = float4(s, 0.0, c, 0.0); + gRotMat[3] = float4(0.0, 0.0, 0.0, 1.0); + + float4 locPos = float4(mul(rotMat, input.Pos.xyz), 1.0); + float4 pos = float4((locPos.xyz * input.instanceScale) + input.instancePos, 1.0); + + output.Pos = mul(ubo.projection, mul(ubo.modelview, mul(gRotMat, pos))); + output.Normal = mul((float3x3)mul(ubo.modelview, gRotMat), mul(rotMat, input.Normal)); + + pos = mul(ubo.modelview, float4(input.Pos.xyz + input.instancePos, 1.0)); + float3 lPos = mul((float3x3)ubo.modelview, ubo.lightPos.xyz); + output.LightVec = lPos - pos.xyz; + output.ViewVec = -pos.xyz; + return output; +} \ No newline at end of file diff --git a/shaders/instancing/slang/instancing.vert.spv b/shaders/instancing/slang/instancing.vert.spv new file mode 100644 index 0000000000..1fa6f49172 Binary files /dev/null and b/shaders/instancing/slang/instancing.vert.spv differ diff --git a/shaders/instancing/slang/planet.frag.slang b/shaders/instancing/slang/planet.frag.slang new file mode 100644 index 0000000000..67209a5ada --- /dev/null +++ b/shaders/instancing/slang/planet.frag.slang @@ -0,0 +1,41 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float2 UV; + float3 ViewVec; + float3 LightVec; +}; + +[[vk::binding(1,0)]] Sampler2D samplerColorMap; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float4 color = samplerColorMap.Sample(input.UV) * float4(input.Color, 1.0) * 1.5; + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = max(dot(N, L), 0.0) * input.Color; + float3 specular = pow(max(dot(R, V), 0.0), 4.0) * float3(0.5, 0.5, 0.5) * color.r; + return float4(diffuse * color.rgb + specular, 1.0); +} \ No newline at end of file diff --git a/shaders/instancing/slang/planet.frag.spv b/shaders/instancing/slang/planet.frag.spv new file mode 100644 index 0000000000..1751e06ed9 Binary files /dev/null and b/shaders/instancing/slang/planet.frag.spv differ diff --git a/shaders/instancing/slang/planet.vert.slang b/shaders/instancing/slang/planet.vert.slang new file mode 100644 index 0000000000..6d8ba75e96 --- /dev/null +++ b/shaders/instancing/slang/planet.vert.slang @@ -0,0 +1,56 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float2 UV; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4 lightPos; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Color = float3(1.0); + output.UV = input.UV * float2(10.0, 6.0); + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(input.Pos.xyz, 1.0))); + float4 pos = mul(ubo.modelview, float4(input.Pos, 1.0)); + output.Normal = mul((float3x3)ubo.modelview, input.Normal); + float3 lPos = mul((float3x3)ubo.modelview, ubo.lightPos.xyz); + output.LightVec = lPos - pos.xyz; + output.ViewVec = -pos.xyz; + return output; +} \ No newline at end of file diff --git a/shaders/instancing/slang/planet.vert.spv b/shaders/instancing/slang/planet.vert.spv new file mode 100644 index 0000000000..983490f69c Binary files /dev/null and b/shaders/instancing/slang/planet.vert.spv differ diff --git a/shaders/instancing/slang/starfield.frag.slang b/shaders/instancing/slang/starfield.frag.slang new file mode 100644 index 0000000000..a56f89d841 --- /dev/null +++ b/shaders/instancing/slang/starfield.frag.slang @@ -0,0 +1,52 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define HASHSCALE3 float3(443.897, 441.423, 437.195) +#define STARFREQUENCY 0.01 + +// Hash function by Dave Hoskins (https://www.shadertoy.com/view/4djSRW) +float hash33(float3 p3) +{ + p3 = frac(p3 * HASHSCALE3); + p3 += dot(p3, p3.yxz+float3(19.19, 19.19, 19.19)); + return frac((p3.x + p3.y)*p3.z + (p3.x+p3.z)*p3.y + (p3.y+p3.z)*p3.x); +} + +float3 starField(float3 pos) +{ + float3 color = float3(0.0, 0.0, 0.0); + float threshhold = (1.0 - STARFREQUENCY); + float rnd = hash33(pos); + if (rnd >= threshhold) + { + float starCol = pow((rnd - threshhold) / (1.0 - threshhold), 16.0); + color += starCol.xxx; + } + return color; +} + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return float4(starField(input.UVW), 1.0); +} \ No newline at end of file diff --git a/shaders/instancing/slang/starfield.frag.spv b/shaders/instancing/slang/starfield.frag.spv new file mode 100644 index 0000000000..2e3b7d4110 Binary files /dev/null and b/shaders/instancing/slang/starfield.frag.spv differ diff --git a/framework/scene_graph/components/sampler.cpp b/shaders/instancing/slang/starfield.vert.slang similarity index 63% rename from framework/scene_graph/components/sampler.cpp rename to shaders/instancing/slang/starfield.vert.slang index 1ba1dd4ff5..24eecdbcf6 100644 --- a/framework/scene_graph/components/sampler.cpp +++ b/shaders/instancing/slang/starfield.vert.slang @@ -1,4 +1,4 @@ -/* Copyright (c) 2018-2019, Arm Limited and Contributors +/* Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -15,20 +15,17 @@ * limitations under the License. */ -#include "sampler.h" - -namespace vkb -{ -namespace sg +struct VSOutput { -Sampler::Sampler(const std::string &name, core::Sampler &&vk_sampler) : - Component{name}, - vk_sampler{std::move(vk_sampler)} -{} + float4 Pos : SV_POSITION; + float3 UVW; +}; -std::type_index Sampler::get_type() +[shader("vertex")] +VSOutput main(uint VertexIndex: SV_VertexID) { - return typeid(Sampler); -} -} // namespace sg -} // namespace vkb + VSOutput output; + output.UVW = float3((VertexIndex << 1) & 2, VertexIndex & 2, VertexIndex & 2); + output.Pos = float4(output.UVW.xy * 2.0f - 1.0f, 0.0f, 1.0f); + return output; +} \ No newline at end of file diff --git a/shaders/instancing/slang/starfield.vert.spv b/shaders/instancing/slang/starfield.vert.spv new file mode 100644 index 0000000000..35d8c6a8bc Binary files /dev/null and b/shaders/instancing/slang/starfield.vert.spv differ diff --git a/shaders/logic_op_dynamic_state/glsl/background.frag.spv b/shaders/logic_op_dynamic_state/glsl/background.frag.spv new file mode 100644 index 0000000000..b73641f230 Binary files /dev/null and b/shaders/logic_op_dynamic_state/glsl/background.frag.spv differ diff --git a/shaders/logic_op_dynamic_state/glsl/background.vert.spv b/shaders/logic_op_dynamic_state/glsl/background.vert.spv new file mode 100644 index 0000000000..5464765b4e Binary files /dev/null and b/shaders/logic_op_dynamic_state/glsl/background.vert.spv differ diff --git a/shaders/logic_op_dynamic_state/glsl/baseline.frag.spv b/shaders/logic_op_dynamic_state/glsl/baseline.frag.spv new file mode 100644 index 0000000000..7c258c1395 Binary files /dev/null and b/shaders/logic_op_dynamic_state/glsl/baseline.frag.spv differ diff --git a/shaders/logic_op_dynamic_state/glsl/baseline.vert.spv b/shaders/logic_op_dynamic_state/glsl/baseline.vert.spv new file mode 100644 index 0000000000..e519504b09 Binary files /dev/null and b/shaders/logic_op_dynamic_state/glsl/baseline.vert.spv differ diff --git a/shaders/logic_op_dynamic_state/hlsl/baseline.frag.spv b/shaders/logic_op_dynamic_state/hlsl/baseline.frag.spv index 294d7d40bc..01b19126e1 100644 Binary files a/shaders/logic_op_dynamic_state/hlsl/baseline.frag.spv and b/shaders/logic_op_dynamic_state/hlsl/baseline.frag.spv differ diff --git a/shaders/logic_op_dynamic_state/slang/background.frag.slang b/shaders/logic_op_dynamic_state/slang/background.frag.slang new file mode 100644 index 0000000000..06558eddfd --- /dev/null +++ b/shaders/logic_op_dynamic_state/slang/background.frag.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +[[vk::binding(1,0)]] SamplerCube samplerEnvMap; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float3 normal = normalize(input.UVW); + float4 color = samplerEnvMap.Sample(normal); + return float4(color.rgb, 1.0); +} \ No newline at end of file diff --git a/shaders/logic_op_dynamic_state/slang/background.frag.spv b/shaders/logic_op_dynamic_state/slang/background.frag.spv new file mode 100644 index 0000000000..99dfa9a720 Binary files /dev/null and b/shaders/logic_op_dynamic_state/slang/background.frag.spv differ diff --git a/shaders/logic_op_dynamic_state/slang/background.vert.slang b/shaders/logic_op_dynamic_state/slang/background.vert.slang new file mode 100644 index 0000000000..02353a18ea --- /dev/null +++ b/shaders/logic_op_dynamic_state/slang/background.vert.slang @@ -0,0 +1,44 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UVW = input.Pos; + output.Pos = mul(ubo.projection, mul(ubo.view, float4(input.Pos * 10.0, 1.0))); + return output; +} \ No newline at end of file diff --git a/shaders/logic_op_dynamic_state/slang/background.vert.spv b/shaders/logic_op_dynamic_state/slang/background.vert.spv new file mode 100644 index 0000000000..37a4e3df46 Binary files /dev/null and b/shaders/logic_op_dynamic_state/slang/background.vert.spv differ diff --git a/shaders/logic_op_dynamic_state/slang/baseline.frag.slang b/shaders/logic_op_dynamic_state/slang/baseline.frag.slang new file mode 100644 index 0000000000..6e6787ff68 --- /dev/null +++ b/shaders/logic_op_dynamic_state/slang/baseline.frag.slang @@ -0,0 +1,44 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float4 Color; + float3 LightVec; + float3 LightColor[2]; + float3 ViewVec; + float LightIntensity; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float attenuation = 1.0 / dot(input.LightVec, input.LightVec); + + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + + float3 diffuse = input.LightColor[0] * attenuation * max(dot(N, L), 0) * input.LightIntensity; + float3 ambient = input.LightColor[1]; + float3 specular = pow(max(dot(R, V), 0.0), 16.0) * float3(0.65); + + return float4((ambient + diffuse) * input.Color.rgb + (specular * input.LightIntensity / 50), input.Color.a); +} diff --git a/shaders/logic_op_dynamic_state/slang/baseline.frag.spv b/shaders/logic_op_dynamic_state/slang/baseline.frag.spv new file mode 100644 index 0000000000..d226fee113 Binary files /dev/null and b/shaders/logic_op_dynamic_state/slang/baseline.frag.spv differ diff --git a/shaders/logic_op_dynamic_state/slang/baseline.vert.slang b/shaders/logic_op_dynamic_state/slang/baseline.vert.slang new file mode 100644 index 0000000000..8270f15a4c --- /dev/null +++ b/shaders/logic_op_dynamic_state/slang/baseline.vert.slang @@ -0,0 +1,69 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct UBOBaseline +{ + float4 ambientLightColor; + float4 lightPosition; + float4 lightColor; + float lightIntensity; +}; +ConstantBuffer ubo_baseline; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float4 Color; + float3 LightVec; + float3 LightColor[2]; + float3 ViewVec; + float LightIntensity; +}; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4x4 model, uniform float4 color) +{ + VSOutput output; + + float4 localPos = mul(ubo.view, mul(model, float4(input.Pos, 1.0))); + float4 positionWorld = mul(model, float4(input.Pos, 1.0)); + + output.Color = color; + output.Pos = mul(ubo.projection, localPos); + output.Normal = mul((float3x3)(mul(ubo.view, model)), input.Normal); + output.LightVec = ubo_baseline.lightPosition.xyz - positionWorld.xyz; + output.LightColor[0] = ubo_baseline.lightColor.xyz * ubo_baseline.lightColor.w; + output.LightColor[1] = ubo_baseline.ambientLightColor.xyz * ubo_baseline.ambientLightColor.w; + output.ViewVec = -localPos.xyz; + output.LightIntensity = ubo_baseline.lightIntensity; + + return output; +} diff --git a/shaders/logic_op_dynamic_state/slang/baseline.vert.spv b/shaders/logic_op_dynamic_state/slang/baseline.vert.spv new file mode 100644 index 0000000000..fa1016e955 Binary files /dev/null and b/shaders/logic_op_dynamic_state/slang/baseline.vert.spv differ diff --git a/shaders/mesh_shader_culling/mesh_shader_culling.frag.spv b/shaders/mesh_shader_culling/mesh_shader_culling.frag.spv new file mode 100644 index 0000000000..6c1b0824ee Binary files /dev/null and b/shaders/mesh_shader_culling/mesh_shader_culling.frag.spv differ diff --git a/shaders/mesh_shader_culling/mesh_shader_culling.mesh b/shaders/mesh_shader_culling/mesh_shader_culling.mesh index 3f5fef4727..94cd089f73 100644 --- a/shaders/mesh_shader_culling/mesh_shader_culling.mesh +++ b/shaders/mesh_shader_culling/mesh_shader_culling.mesh @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -19,7 +19,7 @@ #extension GL_EXT_mesh_shader: require #extension GL_GOOGLE_include_directive: require -#include "mesh_shader_culling/mesh_shader_shared.h" +#include "mesh_shader_shared.h" layout(local_size_x = numMeshInvocationsX, local_size_y = numMeshInvocationsY, local_size_z = 1) in; // we'll emit 4 vertices on 2 primitives per mesh shader invocation diff --git a/shaders/mesh_shader_culling/mesh_shader_culling.mesh.spv b/shaders/mesh_shader_culling/mesh_shader_culling.mesh.spv new file mode 100644 index 0000000000..21fec77b85 Binary files /dev/null and b/shaders/mesh_shader_culling/mesh_shader_culling.mesh.spv differ diff --git a/shaders/mesh_shader_culling/mesh_shader_culling.task b/shaders/mesh_shader_culling/mesh_shader_culling.task index 8c10e2ec14..732beb69f1 100644 --- a/shaders/mesh_shader_culling/mesh_shader_culling.task +++ b/shaders/mesh_shader_culling/mesh_shader_culling.task @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2023, Holochip Corporation +/* Copyright (c) 2023-2025, Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -20,7 +20,7 @@ #extension GL_GOOGLE_include_directive: require #extension GL_KHR_shader_subgroup_ballot : require // subgroupBallot, subgroupBallotBitCount, subgroupBallotExclusiveBitCount -#include "mesh_shader_culling/mesh_shader_shared.h" +#include "mesh_shader_shared.h" // Use numTaskInvocationsX * numTaskInvocationsY task shader invocations per task shader workgroup, // resulting in N * N * numTaskInvocationsX * numTaskInvocationsY invocations diff --git a/shaders/mesh_shader_culling/mesh_shader_culling.task.spv b/shaders/mesh_shader_culling/mesh_shader_culling.task.spv new file mode 100644 index 0000000000..1d4811628d Binary files /dev/null and b/shaders/mesh_shader_culling/mesh_shader_culling.task.spv differ diff --git a/shaders/mesh_shading/glsl/ms.mesh.spv b/shaders/mesh_shading/glsl/ms.mesh.spv new file mode 100644 index 0000000000..5fceab89e0 Binary files /dev/null and b/shaders/mesh_shading/glsl/ms.mesh.spv differ diff --git a/shaders/mesh_shading/glsl/ps.frag.spv b/shaders/mesh_shading/glsl/ps.frag.spv new file mode 100644 index 0000000000..2c36477d30 Binary files /dev/null and b/shaders/mesh_shading/glsl/ps.frag.spv differ diff --git a/shaders/mesh_shading/hlsl/ms.mesh.spv b/shaders/mesh_shading/hlsl/ms.mesh.spv index 11e3818c40..56379574c6 100644 Binary files a/shaders/mesh_shading/hlsl/ms.mesh.spv and b/shaders/mesh_shading/hlsl/ms.mesh.spv differ diff --git a/shaders/mesh_shading/slang/ms.mesh.slang b/shaders/mesh_shading/slang/ms.mesh.slang new file mode 100644 index 0000000000..84dc914bd8 --- /dev/null +++ b/shaders/mesh_shading/slang/ms.mesh.slang @@ -0,0 +1,33 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VertexOutput +{ + float4 position : SV_Position; +}; + +[shader("mesh")] +[outputtopology("triangle")] +[numthreads(1, 1, 1)] +void main(out indices uint3 triangles[1], out vertices VertexOutput vertices[3], uint3 DispatchThreadID: SV_DispatchThreadID) +{ + SetMeshOutputCounts(3, 1); + vertices[0].position = float4(0.5, -0.5, 0, 1); + vertices[1].position = float4(0.5, 0.5, 0, 1); + vertices[2].position = float4(-0.5, 0.5, 0, 1); + triangles[0] = uint3(0, 1, 2); +} \ No newline at end of file diff --git a/shaders/mesh_shading/slang/ms.mesh.spv b/shaders/mesh_shading/slang/ms.mesh.spv new file mode 100644 index 0000000000..10a5b827f3 Binary files /dev/null and b/shaders/mesh_shading/slang/ms.mesh.spv differ diff --git a/shaders/mesh_shading/slang/ps.frag.slang b/shaders/mesh_shading/slang/ps.frag.slang new file mode 100644 index 0000000000..f9be0d8335 --- /dev/null +++ b/shaders/mesh_shading/slang/ps.frag.slang @@ -0,0 +1,22 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[shader("fragment")] +float4 main() +{ + return float4(1.0, 0.0, 0.0, 1.0); +} diff --git a/shaders/mesh_shading/slang/ps.frag.spv b/shaders/mesh_shading/slang/ps.frag.spv new file mode 100644 index 0000000000..f9fb85491a Binary files /dev/null and b/shaders/mesh_shading/slang/ps.frag.spv differ diff --git a/shaders/mobile_nerf/merged.frag.spv b/shaders/mobile_nerf/merged.frag.spv new file mode 100644 index 0000000000..771c875e62 Binary files /dev/null and b/shaders/mobile_nerf/merged.frag.spv differ diff --git a/shaders/mobile_nerf/merged_morpheus.frag.spv b/shaders/mobile_nerf/merged_morpheus.frag.spv new file mode 100644 index 0000000000..e4d8858377 Binary files /dev/null and b/shaders/mobile_nerf/merged_morpheus.frag.spv differ diff --git a/shaders/mobile_nerf/mlp.frag.spv b/shaders/mobile_nerf/mlp.frag.spv new file mode 100644 index 0000000000..62d5e9f87b Binary files /dev/null and b/shaders/mobile_nerf/mlp.frag.spv differ diff --git a/shaders/mobile_nerf/mlp_combo.frag.spv b/shaders/mobile_nerf/mlp_combo.frag.spv new file mode 100644 index 0000000000..0e7a7c9028 Binary files /dev/null and b/shaders/mobile_nerf/mlp_combo.frag.spv differ diff --git a/shaders/mobile_nerf/mlp_morpheus.frag.spv b/shaders/mobile_nerf/mlp_morpheus.frag.spv new file mode 100644 index 0000000000..2e33b68aa4 Binary files /dev/null and b/shaders/mobile_nerf/mlp_morpheus.frag.spv differ diff --git a/shaders/mobile_nerf/mlp_morpheus_combo.frag.spv b/shaders/mobile_nerf/mlp_morpheus_combo.frag.spv new file mode 100644 index 0000000000..b07136ff58 Binary files /dev/null and b/shaders/mobile_nerf/mlp_morpheus_combo.frag.spv differ diff --git a/shaders/mobile_nerf/quad.vert.spv b/shaders/mobile_nerf/quad.vert.spv new file mode 100644 index 0000000000..222117a3e5 Binary files /dev/null and b/shaders/mobile_nerf/quad.vert.spv differ diff --git a/shaders/mobile_nerf/raster.frag.spv b/shaders/mobile_nerf/raster.frag.spv new file mode 100644 index 0000000000..b0a7b37470 Binary files /dev/null and b/shaders/mobile_nerf/raster.frag.spv differ diff --git a/shaders/mobile_nerf/raster.vert.spv b/shaders/mobile_nerf/raster.vert.spv new file mode 100644 index 0000000000..2c634617ff Binary files /dev/null and b/shaders/mobile_nerf/raster.vert.spv differ diff --git a/shaders/mobile_nerf/raster_combo.frag.spv b/shaders/mobile_nerf/raster_combo.frag.spv new file mode 100644 index 0000000000..f4ff298b21 Binary files /dev/null and b/shaders/mobile_nerf/raster_combo.frag.spv differ diff --git a/shaders/mobile_nerf/raster_morpheus.frag.spv b/shaders/mobile_nerf/raster_morpheus.frag.spv new file mode 100644 index 0000000000..868d71d84a Binary files /dev/null and b/shaders/mobile_nerf/raster_morpheus.frag.spv differ diff --git a/shaders/mobile_nerf/raster_morpheus_combo.frag.spv b/shaders/mobile_nerf/raster_morpheus_combo.frag.spv new file mode 100644 index 0000000000..22b6a5993f Binary files /dev/null and b/shaders/mobile_nerf/raster_morpheus_combo.frag.spv differ diff --git a/shaders/mobile_nerf_rayquery/quad.vert.spv b/shaders/mobile_nerf_rayquery/quad.vert.spv new file mode 100644 index 0000000000..222117a3e5 Binary files /dev/null and b/shaders/mobile_nerf_rayquery/quad.vert.spv differ diff --git a/shaders/mobile_nerf_rayquery/rayquery_morpheus.frag.spv b/shaders/mobile_nerf_rayquery/rayquery_morpheus.frag.spv new file mode 100644 index 0000000000..89e84aa0e0 Binary files /dev/null and b/shaders/mobile_nerf_rayquery/rayquery_morpheus.frag.spv differ diff --git a/shaders/mobile_nerf_rayquery/rayquery_morpheus_combo.frag.spv b/shaders/mobile_nerf_rayquery/rayquery_morpheus_combo.frag.spv new file mode 100644 index 0000000000..6ab3ef532f Binary files /dev/null and b/shaders/mobile_nerf_rayquery/rayquery_morpheus_combo.frag.spv differ diff --git a/shaders/multi_draw_indirect/cull.comp.spv b/shaders/multi_draw_indirect/cull.comp.spv new file mode 100644 index 0000000000..1912273217 Binary files /dev/null and b/shaders/multi_draw_indirect/cull.comp.spv differ diff --git a/shaders/multi_draw_indirect/cull_address.comp.spv b/shaders/multi_draw_indirect/cull_address.comp.spv new file mode 100644 index 0000000000..65f7cd9206 Binary files /dev/null and b/shaders/multi_draw_indirect/cull_address.comp.spv differ diff --git a/shaders/multi_draw_indirect/multi_draw_indirect.frag b/shaders/multi_draw_indirect/multi_draw_indirect.frag index d00a49ad76..0d0e0709d9 100644 --- a/shaders/multi_draw_indirect/multi_draw_indirect.frag +++ b/shaders/multi_draw_indirect/multi_draw_indirect.frag @@ -1,6 +1,6 @@ #version 460 -/* Copyright (c) 2021 Holochip Corporation +/* Copyright (c) 2021-2025 Holochip Corporation * * SPDX-License-Identifier: Apache-2.0 * @@ -26,6 +26,6 @@ layout(binding = 1, set = 0) uniform sampler2D textures[225]; void main(void) { - o_color = vec4(texture(textures[uint(round(in_texture_index))], in_uv)); + o_color = vec4(texture(textures[in_texture_index], in_uv)); o_color.rgb *= 1.5; -} \ No newline at end of file +} diff --git a/shaders/multi_draw_indirect/multi_draw_indirect.frag.spv b/shaders/multi_draw_indirect/multi_draw_indirect.frag.spv new file mode 100644 index 0000000000..3bcf650621 Binary files /dev/null and b/shaders/multi_draw_indirect/multi_draw_indirect.frag.spv differ diff --git a/shaders/multi_draw_indirect/multi_draw_indirect.vert.spv b/shaders/multi_draw_indirect/multi_draw_indirect.vert.spv new file mode 100644 index 0000000000..de6955f1e2 Binary files /dev/null and b/shaders/multi_draw_indirect/multi_draw_indirect.vert.spv differ diff --git a/shaders/oit_depth_peeling/background.frag.spv b/shaders/oit_depth_peeling/background.frag.spv new file mode 100644 index 0000000000..78091d547f Binary files /dev/null and b/shaders/oit_depth_peeling/background.frag.spv differ diff --git a/shaders/oit_depth_peeling/combine.frag.spv b/shaders/oit_depth_peeling/combine.frag.spv new file mode 100644 index 0000000000..be9100cfba Binary files /dev/null and b/shaders/oit_depth_peeling/combine.frag.spv differ diff --git a/shaders/oit_depth_peeling/fullscreen.vert.spv b/shaders/oit_depth_peeling/fullscreen.vert.spv new file mode 100644 index 0000000000..17b232326d Binary files /dev/null and b/shaders/oit_depth_peeling/fullscreen.vert.spv differ diff --git a/shaders/oit_depth_peeling/gather.frag.spv b/shaders/oit_depth_peeling/gather.frag.spv new file mode 100644 index 0000000000..8bfde0a3cf Binary files /dev/null and b/shaders/oit_depth_peeling/gather.frag.spv differ diff --git a/shaders/oit_depth_peeling/gather.vert.spv b/shaders/oit_depth_peeling/gather.vert.spv new file mode 100644 index 0000000000..68e88eb4cb Binary files /dev/null and b/shaders/oit_depth_peeling/gather.vert.spv differ diff --git a/shaders/oit_depth_peeling/gather_first.frag.spv b/shaders/oit_depth_peeling/gather_first.frag.spv new file mode 100644 index 0000000000..a1a14e51e7 Binary files /dev/null and b/shaders/oit_depth_peeling/gather_first.frag.spv differ diff --git a/shaders/oit_linked_lists/background.frag.spv b/shaders/oit_linked_lists/background.frag.spv new file mode 100644 index 0000000000..813d6dc714 Binary files /dev/null and b/shaders/oit_linked_lists/background.frag.spv differ diff --git a/shaders/oit_linked_lists/combine.frag.spv b/shaders/oit_linked_lists/combine.frag.spv new file mode 100644 index 0000000000..62abda399e Binary files /dev/null and b/shaders/oit_linked_lists/combine.frag.spv differ diff --git a/shaders/oit_linked_lists/combine.vert.spv b/shaders/oit_linked_lists/combine.vert.spv new file mode 100644 index 0000000000..1cc79dca11 Binary files /dev/null and b/shaders/oit_linked_lists/combine.vert.spv differ diff --git a/shaders/oit_linked_lists/fullscreen.vert.spv b/shaders/oit_linked_lists/fullscreen.vert.spv new file mode 100644 index 0000000000..17b232326d Binary files /dev/null and b/shaders/oit_linked_lists/fullscreen.vert.spv differ diff --git a/shaders/oit_linked_lists/gather.frag.spv b/shaders/oit_linked_lists/gather.frag.spv new file mode 100644 index 0000000000..4e615bfd99 Binary files /dev/null and b/shaders/oit_linked_lists/gather.frag.spv differ diff --git a/shaders/oit_linked_lists/gather.vert.spv b/shaders/oit_linked_lists/gather.vert.spv new file mode 100644 index 0000000000..3061cc2d56 Binary files /dev/null and b/shaders/oit_linked_lists/gather.vert.spv differ diff --git a/shaders/open_cl_interop/glsl/texture_display.frag.spv b/shaders/open_cl_interop/glsl/texture_display.frag.spv new file mode 100644 index 0000000000..db50761444 Binary files /dev/null and b/shaders/open_cl_interop/glsl/texture_display.frag.spv differ diff --git a/shaders/open_cl_interop/glsl/texture_display.vert.spv b/shaders/open_cl_interop/glsl/texture_display.vert.spv new file mode 100644 index 0000000000..b4c01129f4 Binary files /dev/null and b/shaders/open_cl_interop/glsl/texture_display.vert.spv differ diff --git a/shaders/open_cl_interop/slang/texture_display.frag.slang b/shaders/open_cl_interop/slang/texture_display.frag.slang new file mode 100644 index 0000000000..f346ba0e8f --- /dev/null +++ b/shaders/open_cl_interop/slang/texture_display.frag.slang @@ -0,0 +1,31 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] +Sampler2D samplerColor; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerColor.Sample(input.UV); +} \ No newline at end of file diff --git a/shaders/open_cl_interop/slang/texture_display.frag.spv b/shaders/open_cl_interop/slang/texture_display.frag.spv new file mode 100644 index 0000000000..7a3e003c10 Binary files /dev/null and b/shaders/open_cl_interop/slang/texture_display.frag.spv differ diff --git a/shaders/open_cl_interop/slang/texture_display.vert.slang b/shaders/open_cl_interop/slang/texture_display.vert.slang new file mode 100644 index 0000000000..6721698bd4 --- /dev/null +++ b/shaders/open_cl_interop/slang/texture_display.vert.slang @@ -0,0 +1,46 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float2 UV; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 viewPos; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + return output; +}; diff --git a/shaders/open_cl_interop/slang/texture_display.vert.spv b/shaders/open_cl_interop/slang/texture_display.vert.spv new file mode 100644 index 0000000000..57f4e47837 Binary files /dev/null and b/shaders/open_cl_interop/slang/texture_display.vert.spv differ diff --git a/shaders/patch_control_points/glsl/tess.frag.spv b/shaders/patch_control_points/glsl/tess.frag.spv new file mode 100644 index 0000000000..a1a14e51e7 Binary files /dev/null and b/shaders/patch_control_points/glsl/tess.frag.spv differ diff --git a/shaders/patch_control_points/glsl/tess.tesc.spv b/shaders/patch_control_points/glsl/tess.tesc.spv new file mode 100644 index 0000000000..4bed0cb810 Binary files /dev/null and b/shaders/patch_control_points/glsl/tess.tesc.spv differ diff --git a/shaders/patch_control_points/glsl/tess.tese.spv b/shaders/patch_control_points/glsl/tess.tese.spv new file mode 100644 index 0000000000..d9a6f0fc92 Binary files /dev/null and b/shaders/patch_control_points/glsl/tess.tese.spv differ diff --git a/shaders/patch_control_points/glsl/tess.vert.spv b/shaders/patch_control_points/glsl/tess.vert.spv new file mode 100644 index 0000000000..2b683f086e Binary files /dev/null and b/shaders/patch_control_points/glsl/tess.vert.spv differ diff --git a/shaders/patch_control_points/hlsl/tess.tesc.spv b/shaders/patch_control_points/hlsl/tess.tesc.spv index c30dbac47a..29ec996746 100644 Binary files a/shaders/patch_control_points/hlsl/tess.tesc.spv and b/shaders/patch_control_points/hlsl/tess.tesc.spv differ diff --git a/shaders/patch_control_points/slang/tess.frag.slang b/shaders/patch_control_points/slang/tess.frag.slang new file mode 100644 index 0000000000..7d07812901 --- /dev/null +++ b/shaders/patch_control_points/slang/tess.frag.slang @@ -0,0 +1,28 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct DSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +[shader("fragment")] +float4 main(DSOutput input) +{ + return float4(input.Color, 1.0); +} \ No newline at end of file diff --git a/shaders/patch_control_points/slang/tess.frag.spv b/shaders/patch_control_points/slang/tess.frag.spv new file mode 100644 index 0000000000..57e6ef985c Binary files /dev/null and b/shaders/patch_control_points/slang/tess.frag.spv differ diff --git a/shaders/patch_control_points/slang/tess.tesc.slang b/shaders/patch_control_points/slang/tess.tesc.slang new file mode 100644 index 0000000000..b46afac291 --- /dev/null +++ b/shaders/patch_control_points/slang/tess.tesc.slang @@ -0,0 +1,136 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct UBOTessellation +{ + float tessellationFactor; +}; +ConstantBuffer ubo_tessellation; + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +struct HSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +struct ConstantsHSOutput +{ + float TessLevelOuter[4] : SV_TessFactor; + float TessLevelInner[2] : SV_InsideTessFactor; +}; + +float getTessLevel(float4 p0, float4 p1) +{ + float tessellationLevel = 0.0f; + const float midDistance = 1.6f; + const float shortDistance = 1.0f; + + // Calculate edge mid point + float4 centerPoint = 0.5f * (p0 + p1); + + // Calculate vector from camera to mid point + float4 vCam = mul(ubo.view, centerPoint); + + // Calculate vector for camera projection + float4 vCamView = mul(ubo.projection, vCam); + + // Calculate the vector length + float centerDistance = length(vCamView); + + // Adjusting the size of the tessellation depending on the length of the vector + if (centerDistance >= midDistance) + { + tessellationLevel = 1.0f; + } + else if (centerDistance >= shortDistance && centerDistance < midDistance) + { + tessellationLevel = ubo_tessellation.tessellationFactor * 0.4f; + } + else + { + tessellationLevel = ubo_tessellation.tessellationFactor; + } + + return tessellationLevel; +} + +float3 getColor(float tessellationLevel) +{ + float3 outColor; + if (tessellationLevel == 1.0f) + { + outColor = float3(1.0f, 0.0f, 0.0f); // red color + } + else if (tessellationLevel == ubo_tessellation.tessellationFactor * 0.4f) + { + outColor = float3(0.0f, 0.0f, 1.0f); // blue color + } + else if (tessellationLevel == ubo_tessellation.tessellationFactor) + { + outColor = float3(0.0f, 1.0f, 0.0f); // green color + } + + return outColor; +} + +ConstantsHSOutput ConstantsHS(InputPatch patch) +{ + ConstantsHSOutput output; + + if (ubo_tessellation.tessellationFactor > 1.0) + { + output.TessLevelOuter[0] = getTessLevel(patch[2].Pos, patch[0].Pos); + output.TessLevelOuter[1] = getTessLevel(patch[0].Pos, patch[1].Pos); + output.TessLevelOuter[2] = getTessLevel(patch[1].Pos, patch[2].Pos); + output.TessLevelInner[0] = lerp(output.TessLevelOuter[0], output.TessLevelOuter[2], 0.5); + } + else + { + output.TessLevelOuter[0] = 1; + output.TessLevelOuter[1] = 1; + output.TessLevelOuter[2] = 1; + output.TessLevelInner[0] = 1; + } + + return output; +} + +[domain("tri")] +[partitioning("integer")] +[outputtopology("triangle_cw")] +[outputcontrolpoints(3)] +[patchconstantfunc("ConstantsHS")] +[maxtessfactor(20.0)] +[shader("hull")] +HSOutput main(InputPatch patch, uint InvocationID : SV_OutputControlPointID) +{ + HSOutput output; + output.Pos = patch[InvocationID].Pos; + output.Color = getColor(getTessLevel(patch[2].Pos, patch[0].Pos)); + return output; +} diff --git a/shaders/patch_control_points/slang/tess.tesc.spv b/shaders/patch_control_points/slang/tess.tesc.spv new file mode 100644 index 0000000000..13ab6a18fa Binary files /dev/null and b/shaders/patch_control_points/slang/tess.tesc.spv differ diff --git a/shaders/patch_control_points/slang/tess.tese.slang b/shaders/patch_control_points/slang/tess.tese.slang new file mode 100644 index 0000000000..21399a34dd --- /dev/null +++ b/shaders/patch_control_points/slang/tess.tese.slang @@ -0,0 +1,60 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct HSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +struct ConstantsHSOutput +{ + float TessLevelOuter[4] : SV_TessFactor; + float TessLevelInner[2] : SV_InsideTessFactor; +}; + +struct DSOutput +{ + float4 Pos : SV_POSITION; + float3 Color; +}; + +float4 interpolate3D(float4 v0, float4 v1, float4 v2, float3 TessCoord) +{ + return TessCoord.x * v0 + TessCoord.y * v1 + TessCoord.z * v2; +} + +[domain("tri")] +[shader("domain")] +DSOutput main(ConstantsHSOutput input, float3 TessCoord : SV_DomainLocation, const OutputPatch patch) +{ + DSOutput output; + + float4 pos = interpolate3D(patch[0].Pos, patch[1].Pos, patch[2].Pos, TessCoord); + + output.Pos = mul(ubo.projection, mul(ubo.view, pos)); + output.Color = patch[0].Color; + + return output; +} \ No newline at end of file diff --git a/shaders/patch_control_points/slang/tess.tese.spv b/shaders/patch_control_points/slang/tess.tese.spv new file mode 100644 index 0000000000..827dfbf21b Binary files /dev/null and b/shaders/patch_control_points/slang/tess.tese.spv differ diff --git a/shaders/patch_control_points/slang/tess.vert.slang b/shaders/patch_control_points/slang/tess.vert.slang new file mode 100644 index 0000000000..88e6e01fbb --- /dev/null +++ b/shaders/patch_control_points/slang/tess.vert.slang @@ -0,0 +1,51 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; +}; + +#define PI 3.14159 + +[shader("vertex")] +VSOutput main(VSInput input, uniform float3 direction) +{ + VSOutput output; + + float4x4 rotX = float4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + rotX[1][1] = cos(PI); + rotX[1][2] = sin(PI); + rotX[2][1] = -sin(PI); + rotX[2][2] = cos(PI); + + output.Pos = mul(rotX, float4(input.Pos + direction, 1.0f)); + + return output; +} \ No newline at end of file diff --git a/shaders/patch_control_points/slang/tess.vert.spv b/shaders/patch_control_points/slang/tess.vert.spv new file mode 100644 index 0000000000..77babe7be6 Binary files /dev/null and b/shaders/patch_control_points/slang/tess.vert.spv differ diff --git a/shaders/pbr.frag b/shaders/pbr.frag deleted file mode 100644 index 3c5bcb6be2..0000000000 --- a/shaders/pbr.frag +++ /dev/null @@ -1,269 +0,0 @@ -#version 320 es -/* Copyright (c) 2019-2023 Arm Limited and Contributors - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* References will be formatted by: [source] explination - * - * Sources: - * [0] https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf (Frostbites transition to PBR) - * [1] https://learnopengl.com/PBR/Theory (Theory, Lighting and IBL sections) - * - * Extra: - * glTF sample viewer PBR: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/main/source/Renderer/shaders/pbr.frag - * Google Filament Engine: https://google.github.io/filament/Filament.html - */ - -precision highp float; - -#ifdef HAS_BASE_COLOR_TEXTURE -layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif - -#ifdef HAS_NORMAL_TEXTURE -layout(set = 0, binding = 2) uniform sampler2D normal_texture; -#endif - -#ifdef HAS_METALLIC_ROUGHNESS_TEXTURE -layout(set = 0, binding = 3) uniform sampler2D metallic_roughness_texture; -#endif - -layout(location = 0) in vec3 in_pos; -layout(location = 1) in vec2 in_uv; -layout(location = 2) in vec3 in_normal; - -layout(location = 0) out vec4 o_color; - -layout(set = 0, binding = 1) uniform GlobalUniform -{ - mat4 model; - mat4 view_proj; - vec3 camera_position; -} -global_uniform; - -struct Light -{ - vec4 position; // position.w represents type of light - vec4 color; // color.w represents light intensity - vec4 direction; // direction.w represents range - vec2 info; // (only used for spot lights) info.x represents light inner cone angle, info.y represents light outer cone angle -}; - -layout(set = 0, binding = 4) uniform LightsInfo -{ - uint count; - Light lights[MAX_FORWARD_LIGHT_COUNT]; -} -lights; - -layout(push_constant, std430) uniform PBRMaterialUniform -{ - vec4 base_color_factor; - float metallic_factor; - float roughness_factor; -} -pbr_material_uniform; - -const float PI = 3.14159265359; - -vec3 F0 = vec3(0.04); - -// [0] Frensel Schlick -vec3 F_Schlick(vec3 f0, float f90, float u) -{ - return f0 + (f90 - f0) * pow(1.0 - u, 5.0); -} - -// [1] IBL Defuse Irradiance -vec3 F_Schlick_Roughness(vec3 F0, float cos_theta, float roughness) -{ - return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cos_theta, 5.0); -} - -// [0] Diffuse Term -float Fr_DisneyDiffuse(float NdotV, float NdotL, float LdotH, float roughness) -{ - float E_bias = 0.0 * (1.0 - roughness) + 0.5 * roughness; - float E_factor = 1.0 * (1.0 - roughness) + (1.0 / 1.51) * roughness; - float fd90 = E_bias + 2.0 * LdotH * LdotH * roughness; - vec3 f0 = vec3(1.0); - float light_scatter = F_Schlick(f0, fd90, NdotL).r; - float view_scatter = F_Schlick(f0, fd90, NdotV).r; - return light_scatter * view_scatter * E_factor; -} - -// [0] Specular Microfacet Model -float V_SmithGGXCorrelated(float NdotV, float NdotL, float roughness) -{ - float alphaRoughnessSq = roughness * roughness; - - float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); - float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); - - float GGX = GGXV + GGXL; - if (GGX > 0.0) - { - return 0.5 / GGX; - } - return 0.0; -} - -// [0] GGX Normal Distribution Function -float D_GGX(float NdotH, float roughness) -{ - float alphaRoughnessSq = roughness * roughness; - float f = (NdotH * alphaRoughnessSq - NdotH) * NdotH + 1.0; - return alphaRoughnessSq / (PI * f * f); -} - -vec3 normal() -{ - vec3 pos_dx = dFdx(in_pos); - vec3 pos_dy = dFdy(in_pos); - vec3 st1 = dFdx(vec3(in_uv, 0.0)); - vec3 st2 = dFdy(vec3(in_uv, 0.0)); - vec3 T = (st2.t * pos_dx - st1.t * pos_dy) / (st1.s * st2.t - st2.s * st1.t); - vec3 N = normalize(in_normal); - T = normalize(T - N * dot(N, T)); - vec3 B = normalize(cross(N, T)); - mat3 TBN = mat3(T, B, N); - -#ifdef HAS_NORMAL_TEXTURE - vec3 n = texture(normal_texture, in_uv).rgb; - return normalize(TBN * (2.0 * n - 1.0)); -#else - return normalize(TBN[2].xyz); -#endif -} - -vec3 diffuse(vec3 albedo, float metallic) -{ - return albedo * (1.0 - metallic) + ((1.0 - metallic) * albedo) * metallic; -} - -float saturate(float t) -{ - return clamp(t, 0.0, 1.0); -} - -vec3 saturate(vec3 t) -{ - return clamp(t, 0.0, 1.0); -} - -vec3 apply_directional_light(uint index, vec3 normal) -{ - vec3 world_to_light = -lights.lights[index].direction.xyz; - - world_to_light = normalize(world_to_light); - - float ndotl = clamp(dot(normal, world_to_light), 0.0, 1.0); - - return ndotl * lights.lights[index].color.w * lights.lights[index].color.rgb; -} - -vec3 apply_point_light(uint index, vec3 normal) -{ - vec3 world_to_light = lights.lights[index].position.xyz - in_pos.xyz; - - float dist = length(world_to_light); - - float atten = 1.0 / (dist * dist); - - world_to_light = normalize(world_to_light); - - float ndotl = clamp(dot(normal, world_to_light), 0.0, 1.0); - - return ndotl * lights.lights[index].color.w * atten * lights.lights[index].color.rgb; -} - -vec3 get_light_direction(uint index) -{ - if (lights.lights[index].position.w == DIRECTIONAL_LIGHT) - { - return -lights.lights[index].direction.xyz; - } - if (lights.lights[index].position.w == POINT_LIGHT) - { - return lights.lights[index].position.xyz - in_pos.xyz; - } -} - -void main(void) -{ - // vec3 position = vec3(0, 0, 0); - - float F90 = saturate(50.0 * F0.r); - vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); - -#ifdef HAS_BASE_COLOR_TEXTURE - base_color = texture(base_color_texture, in_uv); -#else - base_color = pbr_material_uniform.base_color_factor; -#endif - -#ifdef HAS_METALLIC_ROUGHNESS_TEXTURE - float roughness = saturate(texture(metallic_roughness_texture, in_uv).g); - float metallic = saturate(texture(metallic_roughness_texture, in_uv).b); -#else - float roughness = pbr_material_uniform.roughness_factor; - float metallic = pbr_material_uniform.metallic_factor; -#endif - - vec3 N = normal(); - vec3 V = normalize(global_uniform.camera_position - in_pos); - float NdotV = saturate(dot(N, V)); - - vec3 LightContribution = vec3(0.0); - vec3 diffuse_color = base_color.rgb * (1.0 - metallic); - - for (uint i = 0U; i < lights.count; ++i) - { - vec3 L = get_light_direction(i); - vec3 H = normalize(V + L); - - float LdotH = saturate(dot(L, H)); - float NdotH = saturate(dot(N, H)); - float NdotL = saturate(dot(N, L)); - - vec3 F = F_Schlick(F0, F90, LdotH); - float Vis = V_SmithGGXCorrelated(NdotV, NdotL, roughness); - float D = D_GGX(NdotH, roughness); - vec3 Fr = F * D * Vis; - - float Fd = Fr_DisneyDiffuse(NdotV, NdotL, LdotH, roughness); - - if (lights.lights[i].position.w == DIRECTIONAL_LIGHT) - { - LightContribution += apply_directional_light(i, N) * (diffuse_color * (vec3(1.0) - F) * Fd + Fr); - } - if (lights.lights[i].position.w == POINT_LIGHT) - { - LightContribution += apply_point_light(i, N) * (diffuse_color * (vec3(1.0) - F) * Fd + Fr); - } - } - - // [1] Tempory irradiance to fix dark metals - // TODO: add specular irradiance for realistic metals - vec3 irradiance = vec3(0.5); - vec3 F = F_Schlick_Roughness(F0, max(dot(N, V), 0.0), roughness * roughness * roughness * roughness); - vec3 ibl_diffuse = irradiance * base_color.rgb; - - vec3 ambient_color = ibl_diffuse; - - o_color = vec4(0.3 * ambient_color + LightContribution, base_color.a); -} diff --git a/shaders/postprocessing/chromatic_aberration.frag.spv b/shaders/postprocessing/chromatic_aberration.frag.spv new file mode 100644 index 0000000000..a48fdd8fcb Binary files /dev/null and b/shaders/postprocessing/chromatic_aberration.frag.spv differ diff --git a/shaders/postprocessing/outline.frag b/shaders/postprocessing/outline.frag index b4cf8b0bf6..344de6fbfd 100644 --- a/shaders/postprocessing/outline.frag +++ b/shaders/postprocessing/outline.frag @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2020, Arm Limited and Contributors +/* Copyright (c) 2020-2024, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,11 +18,7 @@ precision highp float; -#ifdef MS_DEPTH -layout(set = 0, binding = 1) uniform sampler2DMS ms_depth_sampler; -#else layout(set = 0, binding = 1) uniform sampler2D depth_sampler; -#endif layout(set = 0, binding = 2) uniform sampler2D color_sampler; layout(location = 0) in vec2 in_uv; @@ -42,11 +38,7 @@ float linearizeDepth(float depth, float near, float far) float getDepth(ivec2 offset) { float depth; -#ifdef MS_DEPTH - depth = texelFetch(ms_depth_sampler, ivec2(gl_FragCoord.xy) + offset, 0).r; -#else depth = texelFetch(depth_sampler, ivec2(gl_FragCoord.xy) + offset, 0).r; -#endif return linearizeDepth(depth, postprocessing_uniform.near_far.x, postprocessing_uniform.near_far.y); } @@ -62,9 +54,5 @@ void main(void) outline += depth - getDepth(ivec2(thickness, 0)); outline += depth - getDepth(ivec2(0, -thickness)); -#ifdef OUTLINE_ONLY - o_color.rgb = vec3(outline); -#else o_color.rgb = mix(color.rgb, outline_color, clamp(outline, 0.0, 1.0)); -#endif } diff --git a/shaders/postprocessing/outline.frag.spv b/shaders/postprocessing/outline.frag.spv new file mode 100644 index 0000000000..48976fedc4 Binary files /dev/null and b/shaders/postprocessing/outline.frag.spv differ diff --git a/shaders/postprocessing/outline_ms_depth.frag b/shaders/postprocessing/outline_ms_depth.frag new file mode 100644 index 0000000000..1697918270 --- /dev/null +++ b/shaders/postprocessing/outline_ms_depth.frag @@ -0,0 +1,58 @@ +#version 450 +/* Copyright (c) 2020-2024, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +precision highp float; + +layout(set = 0, binding = 1) uniform sampler2DMS ms_depth_sampler; +layout(set = 0, binding = 2) uniform sampler2D color_sampler; + +layout(location = 0) in vec2 in_uv; + +layout(location = 0) out vec4 o_color; + +layout(set = 0, binding = 0) uniform PostprocessingUniform +{ + vec2 near_far; +} postprocessing_uniform; + +float linearizeDepth(float depth, float near, float far) +{ + return near * far / (far + depth * (near - far)); +} + +float getDepth(ivec2 offset) +{ + float depth; + depth = texelFetch(ms_depth_sampler, ivec2(gl_FragCoord.xy) + offset, 0).r; + return linearizeDepth(depth, postprocessing_uniform.near_far.x, postprocessing_uniform.near_far.y); +} + +void main(void) +{ + vec4 color = texture(color_sampler, in_uv); + float depth = getDepth(ivec2(0, 0)); + + vec3 outline_color = vec3(0.0, 0.0, 0.0); + int thickness = 2; + float outline = depth - getDepth(ivec2(-thickness, 0)); + outline += depth - getDepth(ivec2(0, thickness)); + outline += depth - getDepth(ivec2(thickness, 0)); + outline += depth - getDepth(ivec2(0, -thickness)); + + o_color.rgb = mix(color.rgb, outline_color, clamp(outline, 0.0, 1.0)); +} diff --git a/shaders/postprocessing/outline_ms_depth.frag.spv b/shaders/postprocessing/outline_ms_depth.frag.spv new file mode 100644 index 0000000000..e7b0b0e233 Binary files /dev/null and b/shaders/postprocessing/outline_ms_depth.frag.spv differ diff --git a/shaders/postprocessing/postprocessing.vert.spv b/shaders/postprocessing/postprocessing.vert.spv new file mode 100644 index 0000000000..cf04ec75b5 Binary files /dev/null and b/shaders/postprocessing/postprocessing.vert.spv differ diff --git a/shaders/profiles/glsl/profiles.frag.spv b/shaders/profiles/glsl/profiles.frag.spv new file mode 100644 index 0000000000..88231fdc65 Binary files /dev/null and b/shaders/profiles/glsl/profiles.frag.spv differ diff --git a/shaders/profiles/glsl/profiles.vert.spv b/shaders/profiles/glsl/profiles.vert.spv new file mode 100644 index 0000000000..20b1735fd4 Binary files /dev/null and b/shaders/profiles/glsl/profiles.vert.spv differ diff --git a/shaders/profiles/slang/profiles.frag.slang b/shaders/profiles/slang/profiles.frag.slang new file mode 100644 index 0000000000..5beb6d2901 --- /dev/null +++ b/shaders/profiles/slang/profiles.frag.slang @@ -0,0 +1,32 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] +Sampler2D textures[]; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + nointerpolation int TexIndex; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return textures[NonUniformResourceIndex(input.TexIndex)].Sample(input.UV); +} \ No newline at end of file diff --git a/shaders/profiles/slang/profiles.frag.spv b/shaders/profiles/slang/profiles.frag.spv new file mode 100644 index 0000000000..b0c2dd78e1 Binary files /dev/null and b/shaders/profiles/slang/profiles.frag.spv differ diff --git a/shaders/profiles/slang/profiles.vert.slang b/shaders/profiles/slang/profiles.vert.slang new file mode 100644 index 0000000000..ebff20ce2a --- /dev/null +++ b/shaders/profiles/slang/profiles.vert.slang @@ -0,0 +1,48 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +struct VSInput +{ + [[vk::location(0)]] float3 Pos : POSITION0; + [[vk::location(1)]] float2 UV; + [[vk::location(2)]] int TexIndex; +}; + +struct UBO +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + [[vk::location(0)]] float2 UV; + [[vk::location(1)]] nointerpolation int TexIndex; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.TexIndex = input.TexIndex; + output.Pos = mul(ubo.projection, mul(ubo.view, float4(input.Pos.xyz, 1.0))); + return output; +} \ No newline at end of file diff --git a/shaders/profiles/slang/profiles.vert.spv b/shaders/profiles/slang/profiles.vert.spv new file mode 100644 index 0000000000..cda2e0efaa Binary files /dev/null and b/shaders/profiles/slang/profiles.vert.spv differ diff --git a/shaders/push_descriptors/glsl/cube.frag.spv b/shaders/push_descriptors/glsl/cube.frag.spv new file mode 100644 index 0000000000..8e7b675b1c Binary files /dev/null and b/shaders/push_descriptors/glsl/cube.frag.spv differ diff --git a/shaders/push_descriptors/glsl/cube.vert.spv b/shaders/push_descriptors/glsl/cube.vert.spv new file mode 100644 index 0000000000..3bea4ed406 Binary files /dev/null and b/shaders/push_descriptors/glsl/cube.vert.spv differ diff --git a/shaders/push_descriptors/slang/cube.frag.slang b/shaders/push_descriptors/slang/cube.frag.slang new file mode 100644 index 0000000000..99d03c74c4 --- /dev/null +++ b/shaders/push_descriptors/slang/cube.frag.slang @@ -0,0 +1,29 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(2, 0)]] Sampler2D samplerColorMap; + +struct VSOutput +{ + float2 UV; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerColorMap.Sample(input.UV); +} \ No newline at end of file diff --git a/shaders/push_descriptors/slang/cube.frag.spv b/shaders/push_descriptors/slang/cube.frag.spv new file mode 100644 index 0000000000..97942b5e29 Binary files /dev/null and b/shaders/push_descriptors/slang/cube.frag.spv differ diff --git a/shaders/push_descriptors/slang/cube.vert.slang b/shaders/push_descriptors/slang/cube.vert.slang new file mode 100644 index 0000000000..11adefd56f --- /dev/null +++ b/shaders/push_descriptors/slang/cube.vert.slang @@ -0,0 +1,51 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; + float2 UV; +}; + +struct UBOCamera +{ + float4x4 projection; + float4x4 view; +}; +ConstantBuffer uboCamera; + +struct UBOModel +{ + float4x4 local; +}; +ConstantBuffer uboModel; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(uboCamera.projection, mul(uboCamera.view, mul(uboModel.local, float4(input.Pos.xyz, 1.0)))); + return output; +} \ No newline at end of file diff --git a/shaders/push_descriptors/slang/cube.vert.spv b/shaders/push_descriptors/slang/cube.vert.spv new file mode 100644 index 0000000000..2248b16322 Binary files /dev/null and b/shaders/push_descriptors/slang/cube.vert.spv differ diff --git a/shaders/ray_queries/glsl/ray_shadow.frag.spv b/shaders/ray_queries/glsl/ray_shadow.frag.spv new file mode 100644 index 0000000000..8d110d670d Binary files /dev/null and b/shaders/ray_queries/glsl/ray_shadow.frag.spv differ diff --git a/shaders/ray_queries/glsl/ray_shadow.vert.spv b/shaders/ray_queries/glsl/ray_shadow.vert.spv new file mode 100644 index 0000000000..9b0103f6b4 Binary files /dev/null and b/shaders/ray_queries/glsl/ray_shadow.vert.spv differ diff --git a/shaders/ray_queries/hlsl/ray_shadow.frag.spv b/shaders/ray_queries/hlsl/ray_shadow.frag.spv index c1900970b9..bf466d596d 100644 Binary files a/shaders/ray_queries/hlsl/ray_shadow.frag.spv and b/shaders/ray_queries/hlsl/ray_shadow.frag.spv differ diff --git a/shaders/ray_queries/hlsl/ray_shadow.vert.spv b/shaders/ray_queries/hlsl/ray_shadow.vert.spv index f5a3e21ed8..01bb516d82 100644 Binary files a/shaders/ray_queries/hlsl/ray_shadow.vert.spv and b/shaders/ray_queries/hlsl/ray_shadow.vert.spv differ diff --git a/shaders/ray_queries/slang/ray_shadow.frag.slang b/shaders/ray_queries/slang/ray_shadow.frag.slang new file mode 100644 index 0000000000..164e3c77eb --- /dev/null +++ b/shaders/ray_queries/slang/ray_shadow.frag.slang @@ -0,0 +1,132 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +RaytracingAccelerationStructure topLevelAS; + +struct GlobalUniform +{ + float4x4 view; + float4x4 proj; + float4 camera_position; + float4 light_position; +}; +ConstantBuffer global_uniform; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float4 O_Pos; + float3 O_Normal; + float4 Scene_pos; // scene with respect to BVH coordinates +}; + +/** +Calculate ambient occlusion +*/ +float calculate_ambient_occlusion(float3 object_point, float3 object_normal) +{ + const float PI = float.getPi(); + const float ao_mult = 1; + uint max_ao_each = 3; + uint max_ao = max_ao_each * max_ao_each; + const float max_dist = 2; + const float tmin = 0.01, tmax = max_dist; + float accumulated_ao = 0.f; + float3 u = abs(dot(object_normal, float3(0, 0, 1))) > 0.9 ? cross(object_normal, float3(1, 0, 0)) : cross(object_normal, float3(0, 0, 1)); + float3 v = cross(object_normal, u); + float accumulated_factor = 0; + for (uint j = 0; j < max_ao_each; ++j) + { + float phi = 0.5*(-PI + 2 * PI * (float(j + 1) / float(max_ao_each + 2))); + for (uint k = 0; k < max_ao_each; ++k){ + float theta = 0.5*(-PI + 2 * PI * (float(k + 1) / float(max_ao_each + 2))); + float x = cos(phi) * sin(theta); + float y = sin(phi) * sin(theta); + float z = cos(theta); + float3 direction = x * u + y * v + z * object_normal; + + RayDesc ray; + ray.TMin = tmin; + ray.TMax = tmax; + ray.Origin = object_point; + ray.Direction = direction.xyz; + + RayQuery query; + query.TraceRayInline(topLevelAS, 0, 0xFF, ray); + query.Proceed(); + float dist = max_dist; + if (query.CommittedStatus() == COMMITTED_TRIANGLE_HIT) + { + dist = query.CommittedRayT(); + } + float ao = min(dist, max_dist); + float factor = 0.2 + 0.8 * z * z; + accumulated_factor += factor; + accumulated_ao += ao * factor; + } + } + accumulated_ao /= (max_dist * accumulated_factor); + accumulated_ao *= accumulated_ao; + accumulated_ao = max(min((accumulated_ao) * ao_mult, 1), 0); + return accumulated_ao; +} + +/** +Apply ray tracing to determine whether the point intersects light +*/ +bool intersects_light(float3 light_origin, float3 pos) +{ + const float tmin = 0.01, tmax = 1.0; + const float3 direction = light_origin - pos; + + RayQuery query; + + RayDesc ray; + ray.TMin = tmin; + ray.TMax = tmax; + ray.Origin = pos; + ray.Direction = direction.xyz; + + // The following runs the actual ray query + // For performance, use gl_RayFlagsTerminateOnFirstHitEXT, since we only need to know + // whether an intersection exists, and not necessarily any particular intersection + query.TraceRayInline(topLevelAS, 0, 0xFF, ray); + + // The following is the canonical way of using ray Queries from the fragment shader when + // there's more than one bounce or hit to traverse: + // while (rayQueryProceedEXT(query)) { } + // This sample has set flags to gl_RayFlagsTerminateOnFirstHitEXT which means that there + // will never be a bounce and no need for an expensive while loop. (i.e. we only need to call it once). + query.Proceed(); + if (query.CommittedStatus() == COMMITTED_TRIANGLE_HIT) + { + // e.g. to get distance: + // const float dist = rayQueryGetIntersectionTEXT(query, false); + return true; + } + + return false; +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + // this is where we apply the shadow + const float ao = calculate_ambient_occlusion(input.Scene_pos.xyz, input.O_Normal); + const float4 lighting = intersects_light(global_uniform.light_position.xyz, input.Scene_pos.xyz) ? float4(0.2, 0.2, 0.2, 1.0) : float4(1.0); + return lighting * float4(ao * float3(1), 1); +} diff --git a/shaders/ray_queries/slang/ray_shadow.frag.spv b/shaders/ray_queries/slang/ray_shadow.frag.spv new file mode 100644 index 0000000000..727d4d4c81 Binary files /dev/null and b/shaders/ray_queries/slang/ray_shadow.frag.spv differ diff --git a/shaders/ray_queries/slang/ray_shadow.vert.slang b/shaders/ray_queries/slang/ray_shadow.vert.slang new file mode 100644 index 0000000000..7195bbf9f0 --- /dev/null +++ b/shaders/ray_queries/slang/ray_shadow.vert.slang @@ -0,0 +1,53 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + struct VSInput +{ + float3 Position : POSITION0; + float3 Normal; +}; + +RaytracingAccelerationStructure topLevelAS; + +struct GlobalUniform +{ + float4x4 view; + float4x4 proj; + float4 camera_position; + float4 light_position; +}; +ConstantBuffer global_uniform; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float4 O_Pos; + float3 O_Normal; + float4 Scene_pos; // scene with respect to BVH coordinates +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + // We want to be able to perform ray tracing, so don't apply any matrix to scene_pos + output.Scene_pos = float4(input.Position, 1.0); + output.O_Pos = mul(global_uniform.view, float4(input.Position, 1.0)); + output.O_Normal = input.Normal; + output.Pos = mul(global_uniform.proj, mul(global_uniform.view, float4(input.Position, 1.0))); + return output; +} diff --git a/shaders/ray_queries/slang/ray_shadow.vert.spv b/shaders/ray_queries/slang/ray_shadow.vert.spv new file mode 100644 index 0000000000..af2d5ca6c5 Binary files /dev/null and b/shaders/ray_queries/slang/ray_shadow.vert.spv differ diff --git a/shaders/ray_tracing_basic/glsl/closesthit.rchit.spv b/shaders/ray_tracing_basic/glsl/closesthit.rchit.spv new file mode 100644 index 0000000000..ddc2f4ea2f Binary files /dev/null and b/shaders/ray_tracing_basic/glsl/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_basic/glsl/miss.rmiss.spv b/shaders/ray_tracing_basic/glsl/miss.rmiss.spv new file mode 100644 index 0000000000..9ed60d3467 Binary files /dev/null and b/shaders/ray_tracing_basic/glsl/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_basic/glsl/raygen.rgen.spv b/shaders/ray_tracing_basic/glsl/raygen.rgen.spv new file mode 100644 index 0000000000..cec392359b Binary files /dev/null and b/shaders/ray_tracing_basic/glsl/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_basic/hlsl/raygen.rgen.spv b/shaders/ray_tracing_basic/hlsl/raygen.rgen.spv index b7ec765edf..23f7b86d40 100644 Binary files a/shaders/ray_tracing_basic/hlsl/raygen.rgen.spv and b/shaders/ray_tracing_basic/hlsl/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_basic/slang/closesthit.rchit.slang b/shaders/ray_tracing_basic/slang/closesthit.rchit.slang new file mode 100644 index 0000000000..f720fe6f50 --- /dev/null +++ b/shaders/ray_tracing_basic/slang/closesthit.rchit.slang @@ -0,0 +1,33 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Attributes +{ + float2 bary; +}; + +struct Payload +{ + float3 hitValue; +}; + +[shader("closesthit")] +void main(inout Payload p, in Attributes attribs) +{ + const float3 barycentricCoords = float3(1.0f - attribs.bary.x - attribs.bary.y, attribs.bary.x, attribs.bary.y); + p.hitValue = barycentricCoords; +} diff --git a/shaders/ray_tracing_basic/slang/closesthit.rchit.spv b/shaders/ray_tracing_basic/slang/closesthit.rchit.spv new file mode 100644 index 0000000000..345241992a Binary files /dev/null and b/shaders/ray_tracing_basic/slang/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_basic/slang/miss.rmiss.slang b/shaders/ray_tracing_basic/slang/miss.rmiss.slang new file mode 100644 index 0000000000..b5c5e3b871 --- /dev/null +++ b/shaders/ray_tracing_basic/slang/miss.rmiss.slang @@ -0,0 +1,27 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Payload +{ + float3 hitValue; +}; + +[shader("miss")] +void main(inout Payload p) +{ + p.hitValue = float3(0.0, 0.0, 0.2); +} \ No newline at end of file diff --git a/shaders/ray_tracing_basic/slang/miss.rmiss.spv b/shaders/ray_tracing_basic/slang/miss.rmiss.spv new file mode 100644 index 0000000000..3f89fc305a Binary files /dev/null and b/shaders/ray_tracing_basic/slang/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_basic/slang/raygen.rgen.slang b/shaders/ray_tracing_basic/slang/raygen.rgen.slang new file mode 100644 index 0000000000..973ef77f87 --- /dev/null +++ b/shaders/ray_tracing_basic/slang/raygen.rgen.slang @@ -0,0 +1,54 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +RaytracingAccelerationStructure accelStruct; +RWTexture2D image; + +struct CameraProperties +{ + float4x4 viewInverse; + float4x4 projInverse; +}; +ConstantBuffer camera; + +struct Payload +{ + float3 hitValue; +}; + +[shader("raygeneration")] +void main() +{ + uint3 LaunchID = DispatchRaysIndex(); + uint3 LaunchSize = DispatchRaysDimensions(); + + const float2 pixelCenter = float2(LaunchID.xy) + float2(0.5); + const float2 inUV = pixelCenter / float2(LaunchSize.xy); + float2 d = inUV * 2.0 - 1.0; + float4 target = mul(camera.projInverse, float4(d.x, d.y, 1, 1)); + + RayDesc rayDesc; + rayDesc.Origin = mul(camera.viewInverse, float4(0, 0, 0, 1)).xyz; + rayDesc.Direction = mul(camera.viewInverse, float4(normalize(target.xyz), 0)).xyz; + rayDesc.TMin = 0.001; + rayDesc.TMax = 10000.0; + + Payload payload; + TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); + + image[int2(LaunchID.xy)] = float4(payload.hitValue, 0.0); +} \ No newline at end of file diff --git a/shaders/ray_tracing_basic/slang/raygen.rgen.spv b/shaders/ray_tracing_basic/slang/raygen.rgen.spv new file mode 100644 index 0000000000..9b8d490ae7 Binary files /dev/null and b/shaders/ray_tracing_basic/slang/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_extended/glsl/closesthit.rchit.spv b/shaders/ray_tracing_extended/glsl/closesthit.rchit.spv new file mode 100644 index 0000000000..8e75b7d004 Binary files /dev/null and b/shaders/ray_tracing_extended/glsl/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_extended/glsl/miss.rmiss.spv b/shaders/ray_tracing_extended/glsl/miss.rmiss.spv new file mode 100644 index 0000000000..70a76242bc Binary files /dev/null and b/shaders/ray_tracing_extended/glsl/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_extended/glsl/raygen.rgen.spv b/shaders/ray_tracing_extended/glsl/raygen.rgen.spv new file mode 100644 index 0000000000..2c3e35b897 Binary files /dev/null and b/shaders/ray_tracing_extended/glsl/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_extended/hlsl/closesthit.rchit.spv b/shaders/ray_tracing_extended/hlsl/closesthit.rchit.spv index 047ab79cb4..cff86b3f78 100644 Binary files a/shaders/ray_tracing_extended/hlsl/closesthit.rchit.spv and b/shaders/ray_tracing_extended/hlsl/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_extended/hlsl/raygen.rgen.spv b/shaders/ray_tracing_extended/hlsl/raygen.rgen.spv index adb2561d99..b5891f0404 100644 Binary files a/shaders/ray_tracing_extended/hlsl/raygen.rgen.spv and b/shaders/ray_tracing_extended/hlsl/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_extended/slang/closesthit.rchit.slang b/shaders/ray_tracing_extended/slang/closesthit.rchit.slang new file mode 100644 index 0000000000..5139fdad59 --- /dev/null +++ b/shaders/ray_tracing_extended/slang/closesthit.rchit.slang @@ -0,0 +1,148 @@ +/* Copyright (c) 2025, Sascha Willems +* +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 the "License"; +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +#define RENDER_DEFAULT 0 +#define RENDER_BARYCENTRIC 1 +#define RENDER_INSTANCE_ID 2 +#define RENDER_DISTANCE 3 +#define RENDER_GLOBAL_XYZ 4 +#define RENDER_SHADOW_MAP 5 +#define RENDER_AO 6 + +struct Payload +{ + float4 color; + float4 intersection; // {x, y, z, intersectionType} + float4 normal; // {nx, ny, nz, distance} +}; + +struct Attributes +{ + float2 bary; +}; + +[[vk::binding(4, 0)]] StructuredBuffer vertex_buffer; +[[vk::binding(5, 0)]] StructuredBuffer index_buffer; +[[vk::binding(6, 0)]] StructuredBuffer data_map; +[[vk::binding(7, 0)]] Sampler2D samplers[26]; +[[vk::binding(8, 0)]] StructuredBuffer dynamic_vertex_buffer; +[[vk::binding(9, 0)]] StructuredBuffer dynamic_index_buffer; + +[[SpecializationConstant]] const int render_mode = RENDER_DEFAULT; + +float3 heatmap(float value, float minValue, float maxValue) +{ + float scaled = (min(max(value, minValue), maxValue) - minValue) / (maxValue - minValue); + float r = scaled * (3.14159265359 / 2.); + return float3(sin(r), sin(2 * r), cos(r)); +} + +struct Vertex +{ + float3 pt; + float3 normal; + float2 coordinate; +}; + +Vertex getVertex(uint vertexOffset, uint index, bool is_static) +{ + uint base_index = 2 * (vertexOffset + index); + float4 A = is_static ? vertex_buffer[base_index] : dynamic_vertex_buffer[base_index]; + float4 B = is_static ? vertex_buffer[base_index + 1] : dynamic_vertex_buffer[base_index + 1]; + + Vertex v; + v.pt = A.xyz; + v.normal = float3(A.w, B.x, B.y); + v.coordinate = float2(B.z, B.w); + return v; +} + +uint3 getIndices(uint triangle_offset, uint primitive_id, bool is_static) +{ + uint base_index = 3 * (triangle_offset + primitive_id); + uint index0 = is_static ? index_buffer[base_index] : dynamic_index_buffer[base_index]; + uint index1 = is_static ? index_buffer[base_index + 1] : dynamic_index_buffer[base_index + 1]; + uint index2 = is_static ? index_buffer[base_index + 2] : dynamic_index_buffer[base_index + 2]; + + return uint3(index0, index1, index2); +} + +void handleDraw(inout Payload hitValue, float2 attribs) +{ + uint index = InstanceID(); + + uint vertexOffset = data_map[4 * index]; + uint triangleOffset = data_map[4*index + 1]; + uint imageOffset = data_map[4 * index + 2]; + uint objectType = data_map[4 * index + 3]; + bool is_static = objectType != 1; + + uint3 indices = getIndices(triangleOffset, PrimitiveIndex(), is_static); + Vertex A = getVertex(vertexOffset, indices.x, is_static), B = getVertex(vertexOffset, indices.y, is_static), C = getVertex(vertexOffset, indices.z, is_static); + + // interpolate and obtain world point + const float3 barycentricCoords = float3(1.0f - attribs.x - attribs.y, attribs.x, attribs.y); + float alpha = barycentricCoords.x, beta = barycentricCoords.y, gamma = barycentricCoords.z; + float3 pt = alpha * A.pt + beta * B.pt + gamma * C.pt; + float4x3 transform = WorldToObject4x3(); + float3 worldPt = WorldRayOrigin() + RayTCurrent() * WorldRayDirection();//transform * float4(pt, 0) + float3(transform[3][0], transform[3][1], transform[3][2]); + float3 normal = normalize(alpha * A.normal + beta * B.normal + gamma * C.normal); + float3 worldNormal = normalize(cross(B.pt - A.pt, C.pt - A.pt)); + + float2 texcoord = alpha * A.coordinate + beta * B.coordinate + gamma * C.coordinate; + + hitValue.intersection = float4(worldPt.xyz, objectType); + hitValue.normal = float4(worldNormal.xyz, RayTCurrent()); + if (render_mode == RENDER_GLOBAL_XYZ) { // global xyz + hitValue.color = float4(heatmap(worldPt.x, -10, 10), 1); + return; + } + if ((objectType == 0 || objectType == 2)){ + if (imageOffset >= 26){ + return; // this shouldn't happen + } + // obtain texture coordinate + // NB: texture() is valid here as well as mipmaps are not used in this demo. + float4 tex_value = samplers[NonUniformResourceIndex(imageOffset)].SampleLevel(texcoord, 0); + hitValue.color = tex_value; + } else { + // the refraction itself is colorless, so + // encode the index of refraction in the color + const float base_IOR = 1.01; + const float x = texcoord.x, y = texcoord.y; + const float t = min(min(min(min(x, 1-x), y), 1-y), 0.5) / 0.5; + const float IOR = t * base_IOR + (1 - t) * 1; + hitValue.color = float4(IOR, 0, 0, 0); + hitValue.normal = float4(normal.x, normal.y, normal.z, RayTCurrent()); + } +} + +[shader("closesthit")] +void main(inout Payload hitValue, in Attributes attribs) +{ + const float3 barycentricCoords = float3(1.0f - attribs.bary.x - attribs.bary.y, attribs.bary.x, attribs.bary.y); + if (render_mode == RENDER_BARYCENTRIC ){ + hitValue.color = float4(barycentricCoords, 1); + } else if (render_mode == RENDER_INSTANCE_ID){ + hitValue.color = float4(heatmap(InstanceID(), 0, 25), 1); + } else if (render_mode == RENDER_DISTANCE){ + hitValue.color = float4(heatmap(log(1 + RayTCurrent()), 0, log(1 + 25)), 1); + } else { + handleDraw(hitValue, attribs.bary); + } +} diff --git a/shaders/ray_tracing_extended/slang/closesthit.rchit.spv b/shaders/ray_tracing_extended/slang/closesthit.rchit.spv new file mode 100644 index 0000000000..db3e2ad290 Binary files /dev/null and b/shaders/ray_tracing_extended/slang/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_extended/slang/miss.rmiss.slang b/shaders/ray_tracing_extended/slang/miss.rmiss.slang new file mode 100644 index 0000000000..026c3fcf95 --- /dev/null +++ b/shaders/ray_tracing_extended/slang/miss.rmiss.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Payload +{ + float4 color; + float4 intersection; // {x, y, z, intersectionType} + float4 normal; // {nx, ny, nz, distance} +}; + +[shader("miss")] +void main(inout Payload hitValue) +{ + hitValue.intersection.w = 100.0; + hitValue.normal.w = 10000.0; +} \ No newline at end of file diff --git a/shaders/ray_tracing_extended/slang/miss.rmiss.spv b/shaders/ray_tracing_extended/slang/miss.rmiss.spv new file mode 100644 index 0000000000..e4bfe75356 Binary files /dev/null and b/shaders/ray_tracing_extended/slang/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_extended/slang/raygen.rgen.slang b/shaders/ray_tracing_extended/slang/raygen.rgen.slang new file mode 100644 index 0000000000..4cfac503eb --- /dev/null +++ b/shaders/ray_tracing_extended/slang/raygen.rgen.slang @@ -0,0 +1,185 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define RENDER_DEFAULT 0 +#define RENDER_BARYCENTRIC 1 +#define RENDER_INSTANCE_ID 2 +#define RENDER_DISTANCE 3 +#define RENDER_GLOBAL_XYZ 4 +#define RENDER_SHADOW_MAP 5 +#define RENDER_AO 6 + +RaytracingAccelerationStructure accelStruct; +RWTexture2D image; + +struct CameraProperties +{ + float4x4 viewInverse; + float4x4 projInverse; +}; +ConstantBuffer cam; + +struct Payload +{ + float4 color; + float4 intersection; // {x, y, z, intersectionType} + float4 normal; // {nx, ny, nz, distance} +}; + +[[SpecializationConstant]] const int render_mode = 0; +[[SpecializationConstant]] const int maxRays = 12; + +[shader("raygeneration")] +void main() +{ + uint3 LaunchID = DispatchRaysIndex(); + uint3 LaunchSize = DispatchRaysDimensions(); + + const float2 pixelCenter = float2(LaunchID.xy) + float2(0.5); + const float2 inUV = pixelCenter/float2(LaunchSize.xy); + float2 d = inUV * 2.0 - 1.0; + + float4 origin = mul(cam.viewInverse, float4(0,0,0,1)); + float4 target = mul(cam.projInverse, float4(d.x, d.y, 1, 1)); + float4 direction = mul(cam.viewInverse, float4(normalize(target.xyz), 0)); + + float tmin = 0.001; + float tmax = 10000.0; + + uint max_rays = maxRays; + if (render_mode != RENDER_DEFAULT) + { + max_rays = 1; + } + + uint object_type = 100; + float4 color = float4(0, 0, 0, 0); + // 0 = normal, 1 = shadow, 2 = AO + uint current_mode = 0; + float expectedDistance = -1; + + RayDesc rayDesc; + rayDesc.TMin = tmin; + rayDesc.TMax = tmax; + + Payload hitValue; + + for (uint i = 0; i < max_rays && current_mode < 100 && color.a < 0.95 && (color.r < 0.99 || color.b < 0.99 || color.g < 0.99); ++i) + { + rayDesc.Origin = origin.xyz; + rayDesc.Direction = direction.xyz; + TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, hitValue); + object_type = uint(hitValue.intersection.w); + const float3 object_intersection_pt = hitValue.intersection.xyz; + const float3 object_normal = hitValue.normal.xyz; + if (render_mode != RENDER_DEFAULT) + { + color = hitValue.color; + break; + } + if (object_type == 0) + { + float4 newColor = hitValue.color; + + //shadow + { + const float shadow_mult = 2; + const float shadow_scale = 0.25; + float3 lightPt = float3(0, -20, 0); + float3 currentDirection = lightPt - hitValue.intersection.xyz; + expectedDistance = sqrt(dot(currentDirection, currentDirection)); + currentDirection = normalize(currentDirection); + rayDesc.Origin = object_intersection_pt; + rayDesc.Direction = currentDirection; + TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, hitValue); + float r = expectedDistance; + float actDistance = hitValue.normal.w; + float scale = actDistance < expectedDistance ? shadow_scale : 1; + scale = min(scale * shadow_mult, 1); + newColor.xyz *= scale; + current_mode = 101; + if (render_mode == RENDER_SHADOW_MAP) + { + color = float4(scale, scale, scale, 1); + break; + } + } + + // ambient occlusion + { + const float ao_mult = 1; + uint max_ao_each = 2; + uint max_ao = max_ao_each * max_ao_each; + const float max_dist = 2; + float accumulated_ao = 0.f; + float3 u = abs(dot(object_normal, float3(0, 0, 1))) > 0.9 ? cross(object_normal, float3(1, 0, 0)) : cross(object_normal, float3(0, 0, 1)); + float3 v = cross(object_normal, u); + float accumulated_factor = 0; + for (uint j = 0; j < max_ao_each; ++j) + { + float phi = 0.5*(-3.14159 + 2 * 3.14159 * (float(j + 1) / float(max_ao_each + 2))); + for (uint k = 0; k < max_ao_each; ++k){ + float theta = 0.5*(-3.14159 + 2 * 3.14159 * (float(k + 1) / float(max_ao_each + 2))); + float x = cos(phi) * sin(theta); + float y = sin(phi) * sin(theta); + float z = cos(theta); + float3 direction = x * u + y * v + z * object_normal; + rayDesc.Origin = object_intersection_pt; + rayDesc.Direction = direction; + TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, hitValue); + float ao = min(hitValue.normal.w, max_dist); + float factor = 0.2 + 0.8 * z * z; + accumulated_factor += factor; + accumulated_ao += ao * factor; + } + } + accumulated_ao /= (max_dist * accumulated_factor); + accumulated_ao *= accumulated_ao; + accumulated_ao = max(min((accumulated_ao) * ao_mult, 1), 0); + if (render_mode == RENDER_AO) + { + color = float4(accumulated_ao, accumulated_ao, accumulated_ao, 1); + break; + } + + newColor.xyz *= accumulated_ao; + + const float r = max(0, 1 - color.a); + color += r * float4(newColor.rgb, 1); + } + + } else if (object_type == 1) + { + origin = float4(hitValue.intersection.xyz, 0); + const float IOR = hitValue.color.x; + const float max_IOR = 1.01; + float eta = 1 / IOR; + float c = abs(dot(object_normal, direction.xyz)); + float t = (IOR - 1) / (max_IOR - 1); + direction = normalize((1 - t) * direction + t * (eta * direction + (eta * c - (1 - eta*eta*(1 - c*c))))); + } else if (object_type == 2) + { + float4 newColor = hitValue.color; + float r = 1 - color.a; + color.rgb += r * newColor.rgb * newColor.a; + color.a += 0.1 * r * newColor.a; + origin = float4(hitValue.intersection.xyz, 0); + } + } + + image[int2(LaunchID.xy)] = color; +} \ No newline at end of file diff --git a/shaders/ray_tracing_extended/slang/raygen.rgen.spv b/shaders/ray_tracing_extended/slang/raygen.rgen.spv new file mode 100644 index 0000000000..16a44a134f Binary files /dev/null and b/shaders/ray_tracing_extended/slang/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_position_fetch/glsl/closesthit.rchit.spv b/shaders/ray_tracing_position_fetch/glsl/closesthit.rchit.spv new file mode 100644 index 0000000000..ba7e98aa48 Binary files /dev/null and b/shaders/ray_tracing_position_fetch/glsl/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_position_fetch/glsl/miss.rmiss.spv b/shaders/ray_tracing_position_fetch/glsl/miss.rmiss.spv new file mode 100644 index 0000000000..9ed60d3467 Binary files /dev/null and b/shaders/ray_tracing_position_fetch/glsl/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_position_fetch/glsl/raygen.rgen.spv b/shaders/ray_tracing_position_fetch/glsl/raygen.rgen.spv new file mode 100644 index 0000000000..6b1708343d Binary files /dev/null and b/shaders/ray_tracing_position_fetch/glsl/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_position_fetch/hlsl/raygen.rgen.spv b/shaders/ray_tracing_position_fetch/hlsl/raygen.rgen.spv index 0aa044f603..5535f2ed86 100644 Binary files a/shaders/ray_tracing_position_fetch/hlsl/raygen.rgen.spv and b/shaders/ray_tracing_position_fetch/hlsl/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_position_fetch/slang/closesthit.rchit.slang b/shaders/ray_tracing_position_fetch/slang/closesthit.rchit.slang new file mode 100644 index 0000000000..11ddf7f984 --- /dev/null +++ b/shaders/ray_tracing_position_fetch/slang/closesthit.rchit.slang @@ -0,0 +1,65 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Attributes +{ + float2 bary; +}; + +struct Payload +{ + float3 hitValue; +}; + +struct UBO +{ + float4x4 viewInverse; + float4x4 projInverse; + int displayMode; +}; +[[vk::binding(2,0)]] ConstantBuffer ubo; + +[shader("closesthit")] +void main(inout Payload p, in Attributes attribs) +{ + // We need the barycentric coordinates to calculate data for the current position + const float3 barycentricCoords = float3(1.0f - attribs.bary.x - attribs.bary.y, attribs.bary.x, attribs.bary.y); + + // With VK_KHR_ray_tracing_position_fetch we can access the vertices for the hit triangle in the shader + float3 pos0 = HitTriangleVertexPosition(0); + float3 pos1 = HitTriangleVertexPosition(1); + float3 pos2 = HitTriangleVertexPosition(2); + float3 currentPos = pos0 * barycentricCoords.x + pos1 * barycentricCoords.y + pos2 * barycentricCoords.z; + + p.hitValue = float3(0.0, 0.0, 0.0); + + switch (ubo.displayMode) + { + case (0):{ + // Visualize the geometric normal + float3 normal = normalize(cross(pos1 - pos0, pos2 - pos0)); + normal = normalize(mul(float4(normal, 1.0), WorldToObject4x3())); + p.hitValue = normal; + break; + } + case (1):{ + // Visualize the vertex position + p.hitValue = currentPos; + break; + } + } +} \ No newline at end of file diff --git a/shaders/ray_tracing_position_fetch/slang/closesthit.rchit.spv b/shaders/ray_tracing_position_fetch/slang/closesthit.rchit.spv new file mode 100644 index 0000000000..1604e06fea Binary files /dev/null and b/shaders/ray_tracing_position_fetch/slang/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_position_fetch/slang/miss.rmiss.slang b/shaders/ray_tracing_position_fetch/slang/miss.rmiss.slang new file mode 100644 index 0000000000..b5c5e3b871 --- /dev/null +++ b/shaders/ray_tracing_position_fetch/slang/miss.rmiss.slang @@ -0,0 +1,27 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Payload +{ + float3 hitValue; +}; + +[shader("miss")] +void main(inout Payload p) +{ + p.hitValue = float3(0.0, 0.0, 0.2); +} \ No newline at end of file diff --git a/shaders/ray_tracing_position_fetch/slang/miss.rmiss.spv b/shaders/ray_tracing_position_fetch/slang/miss.rmiss.spv new file mode 100644 index 0000000000..3f89fc305a Binary files /dev/null and b/shaders/ray_tracing_position_fetch/slang/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_position_fetch/slang/raygen.rgen.slang b/shaders/ray_tracing_position_fetch/slang/raygen.rgen.slang new file mode 100644 index 0000000000..f0718e9c32 --- /dev/null +++ b/shaders/ray_tracing_position_fetch/slang/raygen.rgen.slang @@ -0,0 +1,54 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +RaytracingAccelerationStructure accelStruct; +RWTexture2D image; + +struct CameraProperties +{ + float4x4 viewInverse; + float4x4 projInverse; +}; +ConstantBuffer cam; + +struct Payload +{ + float3 hitValue; +}; + +[shader("raygeneration")] +void main() +{ + uint3 LaunchID = DispatchRaysIndex(); + uint3 LaunchSize = DispatchRaysDimensions(); + + const float2 pixelCenter = float2(LaunchID.xy) + float2(0.5, 0.5); + const float2 inUV = pixelCenter/float2(LaunchSize.xy); + float2 d = inUV * 2.0 - 1.0; + float4 target = mul(cam.projInverse, float4(d.x, d.y, 1, 1)); + + RayDesc rayDesc; + rayDesc.Origin = mul(cam.viewInverse, float4(0,0,0,1)).xyz; + rayDesc.Direction = mul(cam.viewInverse, float4(normalize(target.xyz), 0)).xyz; + rayDesc.TMin = 0.001; + rayDesc.TMax = 10000.0; + + Payload payload = {}; + TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); + + image[int2(LaunchID.xy)] = float4(payload.hitValue, 0.0); +} diff --git a/shaders/ray_tracing_position_fetch/slang/raygen.rgen.spv b/shaders/ray_tracing_position_fetch/slang/raygen.rgen.spv new file mode 100644 index 0000000000..477ae44ffe Binary files /dev/null and b/shaders/ray_tracing_position_fetch/slang/raygen.rgen.spv differ diff --git a/shaders/ray_tracing_reflection/closesthit.rchit.spv b/shaders/ray_tracing_reflection/closesthit.rchit.spv new file mode 100644 index 0000000000..cc04f12c29 Binary files /dev/null and b/shaders/ray_tracing_reflection/closesthit.rchit.spv differ diff --git a/shaders/ray_tracing_reflection/miss.rmiss.spv b/shaders/ray_tracing_reflection/miss.rmiss.spv new file mode 100644 index 0000000000..2722221264 Binary files /dev/null and b/shaders/ray_tracing_reflection/miss.rmiss.spv differ diff --git a/shaders/ray_tracing_reflection/missShadow.rmiss.spv b/shaders/ray_tracing_reflection/missShadow.rmiss.spv new file mode 100644 index 0000000000..9d62334872 Binary files /dev/null and b/shaders/ray_tracing_reflection/missShadow.rmiss.spv differ diff --git a/shaders/ray_tracing_reflection/raygen.rgen.spv b/shaders/ray_tracing_reflection/raygen.rgen.spv new file mode 100644 index 0000000000..31b0285003 Binary files /dev/null and b/shaders/ray_tracing_reflection/raygen.rgen.spv differ diff --git a/shaders/separate_image_sampler/glsl/separate_image_sampler.frag.spv b/shaders/separate_image_sampler/glsl/separate_image_sampler.frag.spv new file mode 100644 index 0000000000..0125f1800f Binary files /dev/null and b/shaders/separate_image_sampler/glsl/separate_image_sampler.frag.spv differ diff --git a/shaders/separate_image_sampler/glsl/separate_image_sampler.vert.spv b/shaders/separate_image_sampler/glsl/separate_image_sampler.vert.spv new file mode 100644 index 0000000000..b4c01129f4 Binary files /dev/null and b/shaders/separate_image_sampler/glsl/separate_image_sampler.vert.spv differ diff --git a/shaders/separate_image_sampler/slang/separate_image_sampler.frag.slang b/shaders/separate_image_sampler/slang/separate_image_sampler.frag.slang new file mode 100644 index 0000000000..0d93156c0a --- /dev/null +++ b/shaders/separate_image_sampler/slang/separate_image_sampler.frag.slang @@ -0,0 +1,32 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] Texture2D _texture; +[[vk::binding(0, 1)]] SamplerState _sampler; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + // Sample the texture by combining the sampled image and selected sampler + return _texture.Sample(_sampler, input.UV); +} \ No newline at end of file diff --git a/shaders/separate_image_sampler/slang/separate_image_sampler.frag.spv b/shaders/separate_image_sampler/slang/separate_image_sampler.frag.spv new file mode 100644 index 0000000000..460a065a20 Binary files /dev/null and b/shaders/separate_image_sampler/slang/separate_image_sampler.frag.spv differ diff --git a/shaders/separate_image_sampler/slang/separate_image_sampler.vert.slang b/shaders/separate_image_sampler/slang/separate_image_sampler.vert.slang new file mode 100644 index 0000000000..61dbe40744 --- /dev/null +++ b/shaders/separate_image_sampler/slang/separate_image_sampler.vert.slang @@ -0,0 +1,46 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float2 UV; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 viewPos; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + return output; +} diff --git a/shaders/separate_image_sampler/slang/separate_image_sampler.vert.spv b/shaders/separate_image_sampler/slang/separate_image_sampler.vert.spv new file mode 100644 index 0000000000..57f4e47837 Binary files /dev/null and b/shaders/separate_image_sampler/slang/separate_image_sampler.vert.spv differ diff --git a/shaders/shader_debugprintf/glsl/scene.frag.spv b/shaders/shader_debugprintf/glsl/scene.frag.spv new file mode 100644 index 0000000000..4776124c97 Binary files /dev/null and b/shaders/shader_debugprintf/glsl/scene.frag.spv differ diff --git a/shaders/shader_debugprintf/glsl/scene.vert b/shaders/shader_debugprintf/glsl/scene.vert index 74bae84be5..fb629ed1a0 100644 --- a/shaders/shader_debugprintf/glsl/scene.vert +++ b/shaders/shader_debugprintf/glsl/scene.vert @@ -1,5 +1,5 @@ #version 450 -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -63,6 +63,6 @@ void main() // Output the vertex position using debug printf if (gl_VertexIndex == 0) { - debugPrintfEXT("Position = %v4f", outPos); + debugPrintfEXT("Position = %v3f", outPos); } } diff --git a/shaders/shader_debugprintf/glsl/scene.vert.spv b/shaders/shader_debugprintf/glsl/scene.vert.spv new file mode 100644 index 0000000000..616e97d617 Binary files /dev/null and b/shaders/shader_debugprintf/glsl/scene.vert.spv differ diff --git a/shaders/shader_debugprintf/hlsl/scene.frag.spv b/shaders/shader_debugprintf/hlsl/scene.frag.spv index 6d10d31468..3a700acab9 100644 Binary files a/shaders/shader_debugprintf/hlsl/scene.frag.spv and b/shaders/shader_debugprintf/hlsl/scene.frag.spv differ diff --git a/shaders/shader_debugprintf/hlsl/scene.vert.hlsl b/shaders/shader_debugprintf/hlsl/scene.vert.hlsl index 5e3dbcbd05..70f06cd7e1 100644 --- a/shaders/shader_debugprintf/hlsl/scene.vert.hlsl +++ b/shaders/shader_debugprintf/hlsl/scene.vert.hlsl @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Sascha Willems +/* Copyright (c) 2024-2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -75,7 +75,7 @@ VSOutput main(VSInput input) // Output the vertex position using debug printf if (input.VertexIndex == 0) { - printf("Position = %v4f", output.Pos); + printf("Position = %v3f", output.Pos); } return output; diff --git a/shaders/shader_debugprintf/hlsl/scene.vert.spv b/shaders/shader_debugprintf/hlsl/scene.vert.spv index 7cc718b623..a3ce72d4f9 100644 Binary files a/shaders/shader_debugprintf/hlsl/scene.vert.spv and b/shaders/shader_debugprintf/hlsl/scene.vert.spv differ diff --git a/shaders/shader_debugprintf/slang/scene.frag.slang b/shaders/shader_debugprintf/slang/scene.frag.slang new file mode 100644 index 0000000000..510978acbf --- /dev/null +++ b/shaders/shader_debugprintf/slang/scene.frag.slang @@ -0,0 +1,56 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[[vk::binding(1, 0)]] Sampler2D samplerEnvMap; + +[shader("fragment")] +float4 main(VSOutput input, uniform float4 offset, uniform float4 color, uniform int object_type) +{ + float4 out_color; + + switch (object_type) { + case 0: // Skysphere + { + out_color = samplerEnvMap.Sample(float2(input.UV.x, 1.0 - input.UV.y)); + } + break; + + case 1: // Phong shaded objects + { + float3 ambient = color.rgb * (0.5).xxx; + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = max(dot(N, L), 0.0) * color.rgb; + float3 specular = (pow(max(dot(R, V), 0.0), 8.0)).xxx; + out_color = float4(ambient + diffuse + specular, 1.0); + } + break; + } + + return float4(out_color.rgb, 1.0); +} \ No newline at end of file diff --git a/shaders/shader_debugprintf/slang/scene.frag.spv b/shaders/shader_debugprintf/slang/scene.frag.spv new file mode 100644 index 0000000000..a5c82f6695 Binary files /dev/null and b/shaders/shader_debugprintf/slang/scene.frag.spv differ diff --git a/shaders/shader_debugprintf/slang/scene.vert.slang b/shaders/shader_debugprintf/slang/scene.vert.slang new file mode 100644 index 0000000000..d3b3d8aaef --- /dev/null +++ b/shaders/shader_debugprintf/slang/scene.vert.slang @@ -0,0 +1,73 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; + float2 UV; + uint VertexIndex : SV_VertexID; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4x4 skybox_modelview; + float modelscale; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[shader("vertex")] +VSOutput main(VSInput input, uniform float4 offset, uniform float4 color, uniform int object_type) +{ + VSOutput output; + float3 tmpPos; + + switch(object_type) { + case 0: // Skysphere + tmpPos = mul((float3x3) ubo.skybox_modelview, input.Pos); + output.Pos = mul(ubo.projection, float4(tmpPos, 1.0)); + break; + case 1: // Object + float3 localPos = input.Pos * ubo.modelscale + offset.xyz; + tmpPos = mul(ubo.modelview, float4(localPos, 1.0)).xyz; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(localPos, 1.0))); + break; + } + output.UV = input.UV; + output.Normal = mul((float3x3) ubo.modelview, input.Normal); + float3 lightPos = mul((float3x3) ubo.modelview, float3(0.0, -10.0, -10.0)); + output.LightVec = lightPos - tmpPos; + output.ViewVec = -tmpPos; + + // Output the vertex position using debug printf + if (input.VertexIndex == 0) { + printf("Position = %v3f", output.Pos.xyz); + } + + return output; +} diff --git a/shaders/shader_debugprintf/slang/scene.vert.spv b/shaders/shader_debugprintf/slang/scene.vert.spv new file mode 100644 index 0000000000..2013524459 Binary files /dev/null and b/shaders/shader_debugprintf/slang/scene.vert.spv differ diff --git a/shaders/shader_object/basic_n_dot_l.frag.spv b/shaders/shader_object/basic_n_dot_l.frag.spv new file mode 100644 index 0000000000..ba3a112870 Binary files /dev/null and b/shaders/shader_object/basic_n_dot_l.frag.spv differ diff --git a/shaders/shader_object/basic_n_dot_l.vert.spv b/shaders/shader_object/basic_n_dot_l.vert.spv new file mode 100644 index 0000000000..82a11272e2 Binary files /dev/null and b/shaders/shader_object/basic_n_dot_l.vert.spv differ diff --git a/shaders/shader_object/basic_normals.frag.spv b/shaders/shader_object/basic_normals.frag.spv new file mode 100644 index 0000000000..b83092dd81 Binary files /dev/null and b/shaders/shader_object/basic_normals.frag.spv differ diff --git a/shaders/shader_object/basic_normals.vert.spv b/shaders/shader_object/basic_normals.vert.spv new file mode 100644 index 0000000000..fe96fa2a70 Binary files /dev/null and b/shaders/shader_object/basic_normals.vert.spv differ diff --git a/shaders/shader_object/basic_pos.frag.spv b/shaders/shader_object/basic_pos.frag.spv new file mode 100644 index 0000000000..b83092dd81 Binary files /dev/null and b/shaders/shader_object/basic_pos.frag.spv differ diff --git a/shaders/shader_object/basic_pos.vert.spv b/shaders/shader_object/basic_pos.vert.spv new file mode 100644 index 0000000000..4dbf44f871 Binary files /dev/null and b/shaders/shader_object/basic_pos.vert.spv differ diff --git a/shaders/shader_object/basic_uv.frag.spv b/shaders/shader_object/basic_uv.frag.spv new file mode 100644 index 0000000000..b83092dd81 Binary files /dev/null and b/shaders/shader_object/basic_uv.frag.spv differ diff --git a/shaders/shader_object/basic_uv.vert.spv b/shaders/shader_object/basic_uv.vert.spv new file mode 100644 index 0000000000..cf7f813336 Binary files /dev/null and b/shaders/shader_object/basic_uv.vert.spv differ diff --git a/shaders/shader_object/material_gen_normals.geo b/shaders/shader_object/material_gen_normals.geom similarity index 98% rename from shaders/shader_object/material_gen_normals.geo rename to shaders/shader_object/material_gen_normals.geom index 63d25c6604..9b8786e3bb 100644 --- a/shaders/shader_object/material_gen_normals.geo +++ b/shaders/shader_object/material_gen_normals.geom @@ -1,6 +1,6 @@ #version 460 /* - * Copyright 2023 Nintendo + * Copyright 2023-2025 Nintendo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/shaders/shader_object/material_gen_normals.geom.spv b/shaders/shader_object/material_gen_normals.geom.spv new file mode 100644 index 0000000000..dc99f7ea48 Binary files /dev/null and b/shaders/shader_object/material_gen_normals.geom.spv differ diff --git a/shaders/shader_object/material_n_dot_l.frag.spv b/shaders/shader_object/material_n_dot_l.frag.spv new file mode 100644 index 0000000000..655bb5f7bd Binary files /dev/null and b/shaders/shader_object/material_n_dot_l.frag.spv differ diff --git a/shaders/shader_object/material_normals.frag.spv b/shaders/shader_object/material_normals.frag.spv new file mode 100644 index 0000000000..8cd062cf24 Binary files /dev/null and b/shaders/shader_object/material_normals.frag.spv differ diff --git a/shaders/shader_object/material_pass_sin_offset.geo b/shaders/shader_object/material_pass_sin_offset.geom similarity index 98% rename from shaders/shader_object/material_pass_sin_offset.geo rename to shaders/shader_object/material_pass_sin_offset.geom index d8f25a9972..bc185e2218 100644 --- a/shaders/shader_object/material_pass_sin_offset.geo +++ b/shaders/shader_object/material_pass_sin_offset.geom @@ -1,6 +1,6 @@ #version 460 /* - * Copyright 2023 Nintendo + * Copyright 2023-2025 Nintendo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/shaders/shader_object/material_pass_sin_offset.geom.spv b/shaders/shader_object/material_pass_sin_offset.geom.spv new file mode 100644 index 0000000000..eba847482c Binary files /dev/null and b/shaders/shader_object/material_pass_sin_offset.geom.spv differ diff --git a/shaders/shader_object/material_pass_through.geo b/shaders/shader_object/material_pass_through.geom similarity index 97% rename from shaders/shader_object/material_pass_through.geo rename to shaders/shader_object/material_pass_through.geom index dfac19c23b..51d244b280 100644 --- a/shaders/shader_object/material_pass_through.geo +++ b/shaders/shader_object/material_pass_through.geom @@ -1,6 +1,6 @@ #version 460 /* - * Copyright 2023 Nintendo + * Copyright 2023-2025 Nintendo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/shaders/shader_object/material_pass_through.geom.spv b/shaders/shader_object/material_pass_through.geom.spv new file mode 100644 index 0000000000..023c1dd673 Binary files /dev/null and b/shaders/shader_object/material_pass_through.geom.spv differ diff --git a/shaders/shader_object/material_reflective.frag.spv b/shaders/shader_object/material_reflective.frag.spv new file mode 100644 index 0000000000..afcb6924a2 Binary files /dev/null and b/shaders/shader_object/material_reflective.frag.spv differ diff --git a/shaders/shader_object/material_rotates.vert.spv b/shaders/shader_object/material_rotates.vert.spv new file mode 100644 index 0000000000..c32f61bdc9 Binary files /dev/null and b/shaders/shader_object/material_rotates.vert.spv differ diff --git a/shaders/shader_object/material_scene.frag.spv b/shaders/shader_object/material_scene.frag.spv new file mode 100644 index 0000000000..1d42191dd8 Binary files /dev/null and b/shaders/shader_object/material_scene.frag.spv differ diff --git a/shaders/shader_object/material_scene.vert.spv b/shaders/shader_object/material_scene.vert.spv new file mode 100644 index 0000000000..14f03c258d Binary files /dev/null and b/shaders/shader_object/material_scene.vert.spv differ diff --git a/shaders/shader_object/material_texture.frag.spv b/shaders/shader_object/material_texture.frag.spv new file mode 100644 index 0000000000..1d42191dd8 Binary files /dev/null and b/shaders/shader_object/material_texture.frag.spv differ diff --git a/shaders/shader_object/material_wave_x.vert.spv b/shaders/shader_object/material_wave_x.vert.spv new file mode 100644 index 0000000000..d0a0c4cd24 Binary files /dev/null and b/shaders/shader_object/material_wave_x.vert.spv differ diff --git a/shaders/shader_object/material_wave_y.vert.spv b/shaders/shader_object/material_wave_y.vert.spv new file mode 100644 index 0000000000..60987fee02 Binary files /dev/null and b/shaders/shader_object/material_wave_y.vert.spv differ diff --git a/shaders/shader_object/material_wave_z.vert.spv b/shaders/shader_object/material_wave_z.vert.spv new file mode 100644 index 0000000000..b0ced61a58 Binary files /dev/null and b/shaders/shader_object/material_wave_z.vert.spv differ diff --git a/shaders/shader_object/post_process_FSQ.vert.spv b/shaders/shader_object/post_process_FSQ.vert.spv new file mode 100644 index 0000000000..bfd5dbf3a6 Binary files /dev/null and b/shaders/shader_object/post_process_FSQ.vert.spv differ diff --git a/shaders/shader_object/post_process_brighten.frag.spv b/shaders/shader_object/post_process_brighten.frag.spv new file mode 100644 index 0000000000..58f3a3478b Binary files /dev/null and b/shaders/shader_object/post_process_brighten.frag.spv differ diff --git a/shaders/shader_object/post_process_color_cycle.frag.spv b/shaders/shader_object/post_process_color_cycle.frag.spv new file mode 100644 index 0000000000..dc6b5b0407 Binary files /dev/null and b/shaders/shader_object/post_process_color_cycle.frag.spv differ diff --git a/shaders/shader_object/post_process_edge_detection.frag.spv b/shaders/shader_object/post_process_edge_detection.frag.spv new file mode 100644 index 0000000000..d9e05f8e21 Binary files /dev/null and b/shaders/shader_object/post_process_edge_detection.frag.spv differ diff --git a/shaders/shader_object/post_process_grayscale.frag.spv b/shaders/shader_object/post_process_grayscale.frag.spv new file mode 100644 index 0000000000..42291c8c2e Binary files /dev/null and b/shaders/shader_object/post_process_grayscale.frag.spv differ diff --git a/shaders/shader_object/post_process_invert.frag.spv b/shaders/shader_object/post_process_invert.frag.spv new file mode 100644 index 0000000000..133a42a08c Binary files /dev/null and b/shaders/shader_object/post_process_invert.frag.spv differ diff --git a/shaders/shader_object/post_process_quantize.frag.spv b/shaders/shader_object/post_process_quantize.frag.spv new file mode 100644 index 0000000000..fab2c4e11a Binary files /dev/null and b/shaders/shader_object/post_process_quantize.frag.spv differ diff --git a/shaders/shader_object/shaders.json b/shaders/shader_object/shaders.json index a50684eed5..2ab97bff5b 100644 --- a/shaders/shader_object/shaders.json +++ b/shaders/shader_object/shaders.json @@ -1,72 +1,72 @@ { "skybox": { - "vert":"skybox.vert", - "frag":"skybox.frag" + "vert":"skybox.vert.spv", + "frag":"skybox.frag.spv" }, "terrain": { - "vert":"terrain.vert", - "frag":"terrain.frag" + "vert":"terrain.vert.spv", + "frag":"terrain.frag.spv" }, "basic": { "normals": { - "vert":"basic_normals.vert", - "frag":"basic_normals.frag" + "vert":"basic_normals.vert.spv", + "frag":"basic_normals.frag.spv" }, "positions": { - "vert":"basic_pos.vert", - "frag":"basic_pos.frag" + "vert":"basic_pos.vert.spv", + "frag":"basic_pos.frag.spv" }, "tex coords": { - "vert":"basic_uv.vert", - "frag":"basic_uv.frag" + "vert":"basic_uv.vert.spv", + "frag":"basic_uv.frag.spv" }, "simple n dot l": { - "vert":"basic_n_dot_l.vert", - "frag":"basic_n_dot_l.frag" + "vert":"basic_n_dot_l.vert.spv", + "frag":"basic_n_dot_l.frag.spv" } }, "post_process": { - "vert":"post_process_FSQ.vert", + "vert":"post_process_FSQ.vert.spv", "frag": [ - "post_process_brighten.frag", - "post_process_invert.frag", - "post_process_grayscale.frag", - "post_process_quantize.frag", - "post_process_edge_detection.frag", - "post_process_color_cycle.frag" + "post_process_brighten.frag.spv", + "post_process_invert.frag.spv", + "post_process_grayscale.frag.spv", + "post_process_quantize.frag.spv", + "post_process_edge_detection.frag.spv", + "post_process_color_cycle.frag.spv" ] }, "material": { "vert": [ - "material_scene.vert", - "material_rotates.vert", - "material_wave_x.vert", - "material_wave_y.vert", - "material_wave_z.vert" + "material_scene.vert.spv", + "material_rotates.vert.spv", + "material_wave_x.vert.spv", + "material_wave_y.vert.spv", + "material_wave_z.vert.spv" ], "geo": [ - "material_pass_through.geo", - "material_pass_sin_offset.geo", - "material_gen_normals.geo" + "material_pass_through.geom.spv", + "material_pass_sin_offset.geom.spv", + "material_gen_normals.geom.spv" ], "frag": [ - "material_normals.frag", - "material_texture.frag", - "material_reflective.frag", - "material_n_dot_l.frag" + "material_normals.frag.spv", + "material_texture.frag.spv", + "material_reflective.frag.spv", + "material_n_dot_l.frag.spv" ] } } \ No newline at end of file diff --git a/shaders/shader_object/skybox.frag.spv b/shaders/shader_object/skybox.frag.spv new file mode 100644 index 0000000000..4469f1fef7 Binary files /dev/null and b/shaders/shader_object/skybox.frag.spv differ diff --git a/shaders/shader_object/skybox.vert.spv b/shaders/shader_object/skybox.vert.spv new file mode 100644 index 0000000000..87110ab231 Binary files /dev/null and b/shaders/shader_object/skybox.vert.spv differ diff --git a/shaders/shader_object/terrain.frag.spv b/shaders/shader_object/terrain.frag.spv new file mode 100644 index 0000000000..941aebee74 Binary files /dev/null and b/shaders/shader_object/terrain.frag.spv differ diff --git a/shaders/shader_object/terrain.vert.spv b/shaders/shader_object/terrain.vert.spv new file mode 100644 index 0000000000..8b7014ba62 Binary files /dev/null and b/shaders/shader_object/terrain.vert.spv differ diff --git a/shaders/shadows/main.frag b/shaders/shadows/main.frag index a3fd58a08c..1fe2bafe19 100644 --- a/shaders/shadows/main.frag +++ b/shaders/shadows/main.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2020, Arm Limited and Contributors +/* Copyright (c) 2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -16,12 +16,12 @@ * limitations under the License. */ +#define MAX_LIGHT_COUNT 48 + precision highp float; precision highp sampler2DShadow; -#ifdef HAS_BASE_COLOR_TEXTURE layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -109,11 +109,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = pbr_material_uniform.base_color_factor; -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/shadows/main.frag.spv b/shaders/shadows/main.frag.spv new file mode 100644 index 0000000000..a2062a0493 Binary files /dev/null and b/shaders/shadows/main.frag.spv differ diff --git a/shaders/shadows/main.vert.spv b/shaders/shadows/main.vert.spv new file mode 100644 index 0000000000..77397e5f12 Binary files /dev/null and b/shaders/shadows/main.vert.spv differ diff --git a/shaders/shadows/shadowmap.frag.spv b/shaders/shadows/shadowmap.frag.spv new file mode 100644 index 0000000000..c206d2f10f Binary files /dev/null and b/shaders/shadows/shadowmap.frag.spv differ diff --git a/shaders/shadows/shadowmap.vert.spv b/shaders/shadows/shadowmap.vert.spv new file mode 100644 index 0000000000..86a178f0e0 Binary files /dev/null and b/shaders/shadows/shadowmap.vert.spv differ diff --git a/shaders/sparse_image/glsl/sparse.frag.spv b/shaders/sparse_image/glsl/sparse.frag.spv new file mode 100644 index 0000000000..948db6bd50 Binary files /dev/null and b/shaders/sparse_image/glsl/sparse.frag.spv differ diff --git a/shaders/sparse_image/glsl/sparse.vert.spv b/shaders/sparse_image/glsl/sparse.vert.spv new file mode 100644 index 0000000000..5faa3669fe Binary files /dev/null and b/shaders/sparse_image/glsl/sparse.vert.spv differ diff --git a/shaders/sparse_image/slang/sparse.frag.slang b/shaders/sparse_image/slang/sparse.frag.slang new file mode 100644 index 0000000000..9c481e0e10 --- /dev/null +++ b/shaders/sparse_image/slang/sparse.frag.slang @@ -0,0 +1,65 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + struct VSOutput + { + float4 Pos : SV_POSITION; + float2 UV; +}; + +[[vk::binding(1, 0)]] Sampler2D samplerColor; + +struct SettingsData +{ + bool color_highlight; + int minLOD; + int maxLOD; +}; +[[vk::binding(2, 0)]] ConstantBuffer settings; + +static float3 color_blend_table[5] = +{ + {1.00, 1.00, 1.00}, + {0.80, 0.60, 0.40}, + {0.60, 0.80, 0.60}, + {0.40, 0.60, 0.80}, + {0.20, 0.20, 0.20}, +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float4 color = float4(0.0, 0.0, 0.0, 1.0); + + int lod = settings.minLOD; + uint residencyCode; + + do + { + color = samplerColor.SampleLevel(input.UV, lod, 0, residencyCode); + lod += 1; + } while (!CheckAccessFullyMapped(residencyCode)); + + if (settings.color_highlight) + { + lod -= 1; + color.xyz = (color.xyz * color_blend_table[lod]); + } + + return color; +} \ No newline at end of file diff --git a/shaders/sparse_image/slang/sparse.frag.spv b/shaders/sparse_image/slang/sparse.frag.spv new file mode 100644 index 0000000000..d36c1ce1e9 Binary files /dev/null and b/shaders/sparse_image/slang/sparse.frag.spv differ diff --git a/shaders/sparse_image/slang/sparse.vert.slang b/shaders/sparse_image/slang/sparse.vert.slang new file mode 100644 index 0000000000..2b56155dd9 --- /dev/null +++ b/shaders/sparse_image/slang/sparse.vert.slang @@ -0,0 +1,45 @@ +/* Copyright (c) 2023-2025, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float2 Pos : POSITION0; + float2 UV; +}; + +struct MvpTransform +{ + float4x4 model; + float4x4 view; + float4x4 proj; +}; +ConstantBuffer mvp; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(mvp.proj, mul(mvp.view, mul(mvp.model, float4(input.Pos, 0.0, 1.0)))); + return output; +} \ No newline at end of file diff --git a/shaders/sparse_image/slang/sparse.vert.spv b/shaders/sparse_image/slang/sparse.vert.spv new file mode 100644 index 0000000000..333d64a5b6 Binary files /dev/null and b/shaders/sparse_image/slang/sparse.vert.spv differ diff --git a/shaders/specialization_constants/UBOs.frag b/shaders/specialization_constants/UBOs.frag index 3135ce001b..af5bce08fc 100644 --- a/shaders/specialization_constants/UBOs.frag +++ b/shaders/specialization_constants/UBOs.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,9 @@ precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE +#define MAX_LIGHT_COUNT 1 + layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -80,11 +80,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = pbr_material_uniform.base_color_factor; -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/specialization_constants/UBOs.frag.spv b/shaders/specialization_constants/UBOs.frag.spv new file mode 100644 index 0000000000..5734b5a5b0 Binary files /dev/null and b/shaders/specialization_constants/UBOs.frag.spv differ diff --git a/shaders/specialization_constants/specialization_constants.frag b/shaders/specialization_constants/specialization_constants.frag index 04d55f0c27..7fb53360eb 100644 --- a/shaders/specialization_constants/specialization_constants.frag +++ b/shaders/specialization_constants/specialization_constants.frag @@ -1,5 +1,5 @@ #version 320 es -/* Copyright (c) 2019-2020, Arm Limited and Contributors +/* Copyright (c) 2019-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * @@ -18,9 +18,9 @@ precision highp float; -#ifdef HAS_BASE_COLOR_TEXTURE +#define MAX_LIGHT_COUNT 1 + layout(set = 0, binding = 0) uniform sampler2D base_color_texture; -#endif layout(location = 0) in vec4 in_pos; layout(location = 1) in vec2 in_uv; @@ -82,11 +82,7 @@ void main(void) vec4 base_color = vec4(1.0, 0.0, 0.0, 1.0); -#ifdef HAS_BASE_COLOR_TEXTURE base_color = texture(base_color_texture, in_uv); -#else - base_color = pbr_material_uniform.base_color_factor; -#endif vec3 ambient_color = vec3(0.2) * base_color.xyz; diff --git a/shaders/specialization_constants/specialization_constants.frag.spv b/shaders/specialization_constants/specialization_constants.frag.spv new file mode 100644 index 0000000000..baa20cb802 Binary files /dev/null and b/shaders/specialization_constants/specialization_constants.frag.spv differ diff --git a/shaders/subgroups_operations/butterfly_precomp.comp b/shaders/subgroups_operations/butterfly_precomp.comp new file mode 100644 index 0000000000..9ecc1d1385 --- /dev/null +++ b/shaders/subgroups_operations/butterfly_precomp.comp @@ -0,0 +1,88 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PI_32F 3.14159265358979f + +layout (local_size_x = 8, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D u_butterfly_precomp; + +layout (std430, binding = 1) buffer indices +{ + int data[]; +} bit_reversed_indices; + +layout (binding = 2) uniform FFTParametersUbo +{ + float amplitude; + float len; + uint grid_size; + vec2 wind; +} fftUbo; + +void main() +{ + vec2 pos = gl_GlobalInvocationID.xy; + uint N = fftUbo.grid_size; + + // Twiddle factor exponent, Thesis, Section 4.2.6, Eq 4.6 + float k = mod(pos.y * (float(N) / pow(2, pos.x + 1)), N); + + // Thesis, Section 4.2.6, Eq 4.7 + int butterfly_span = int(pow(2, pos.x)); + int butterfly_wing = 0; + + if ((mod(pos.y, pow(2, pos.x + 1))) < butterfly_span) butterfly_wing = 1; + + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + vec4 result = vec4(0.0f); + result.x = cos(2.f * PI_32F * k / float(N)); // Twiddle factor real part + result.y = sin(2.f * PI_32F * k / float(N)); // Twiddle factor imaginary part + + // Store the sample indices for the next stage + if (pos.x == 0) + { + if (butterfly_wing == 1) + { + result.z = bit_reversed_indices.data[int(pos.y)]; + result.w = bit_reversed_indices.data[int(pos.y + 1)]; + } + else + { + result.z = bit_reversed_indices.data[int(pos.y - 1)]; + result.w = bit_reversed_indices.data[int(pos.y)]; + } + } + else + { + if (butterfly_wing == 1) + { + result.z = pos.y; + result.w = pos.y + butterfly_span; + } + else + { + result.z = pos.y - butterfly_span; + result.w = pos.y; + } + } + + imageStore(u_butterfly_precomp, pixel_pos, result); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/butterfly_precomp_subgroups_off.comp b/shaders/subgroups_operations/butterfly_precomp_subgroups_off.comp new file mode 100644 index 0000000000..df2016a867 --- /dev/null +++ b/shaders/subgroups_operations/butterfly_precomp_subgroups_off.comp @@ -0,0 +1,87 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PI_32F 3.14159265358979f + +layout (local_size_x = 8, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D u_butterfly_precomp; + +layout (std430, binding = 1) buffer indices +{ + int data[]; +} bit_reversed_indices; + +layout (binding = 2) uniform FFTParametersUbo +{ + float amplitude; + float len; + uint grid_size; + vec2 wind; +} fftUbo; + +void main() +{ + vec2 pos = gl_GlobalInvocationID.xy; + uint N = fftUbo.grid_size; + + // Twiddle factor exponent, Thesis, Section 4.2.6, Eq 4.6 + float k = mod(pos.y * (float(N) / pow(2, pos.x + 1)), N); + + // Thesis, Section 4.2.6, Eq 4.7 + int butterfly_span = int(pow(2, pos.x)); + int butterfly_wing = 0; + + if ((mod(pos.y, pow(2, pos.x + 1))) < butterfly_span) butterfly_wing = 1; + + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + vec4 result = vec4(0.0f); + result.x = cos(2.f * PI_32F * k / float(N)); // Twiddle factor real part + result.y = sin(2.f * PI_32F * k / float(N)); // Twiddle factor imaginary part + + // Store the sample indices for the next stage + if (pos.x == 0) + { + if (butterfly_wing == 1) + { + result.z = bit_reversed_indices.data[int(pos.y)]; + result.w = bit_reversed_indices.data[int(pos.y + 1)]; + } + else + { + result.z = bit_reversed_indices.data[int(pos.y - 1)]; + result.w = bit_reversed_indices.data[int(pos.y)]; + } + } + else + { + if (butterfly_wing == 1) + { + result.z = pos.y; + result.w = pos.y + butterfly_span; + } + else + { + result.z = pos.y - butterfly_span; + result.w = pos.y; + } + } + + imageStore(u_butterfly_precomp, pixel_pos, result); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft.comp b/shaders/subgroups_operations/fft.comp new file mode 100644 index 0000000000..381d84ca11 --- /dev/null +++ b/shaders/subgroups_operations/fft.comp @@ -0,0 +1,121 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (constant_id = 0) const int direction = 0; + +layout (binding = 0, rgba32f) readonly uniform image2D u_butterfly_precomp; +layout (binding = 1, rgba32f) uniform image2D u_pingpong0; +layout (binding = 2, rgba32f) uniform image2D u_pingpong1; + +layout( push_constant ) uniform Push_Constants{ + uint i; +} step; + +struct Complex +{ + float real; + float imag; +}; + +Complex complex_add(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real + c2.real; + res.imag = c1.imag + c2.imag; + return res; +} + +Complex complex_multiply(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real * c2.real - c1.imag * c2.imag; + res.imag = c1.real * c2.imag + c1.imag * c2.real; + return res; +} + +void HorizontalButterflies(in ivec2 pixel_pos) +{ + vec4 butterfly_precomp = imageLoad(u_butterfly_precomp, ivec2(step.i, pixel_pos.x)); + if ((step.i % 2) == 0) + { + subgroupMemoryBarrierImage(); + vec2 a_ = imageLoad(u_pingpong0, ivec2(butterfly_precomp.z, pixel_pos.y)).rg; + vec2 b_ = imageLoad(u_pingpong0, ivec2(butterfly_precomp.w, pixel_pos.y)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong1, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } + else + { + subgroupMemoryBarrierImage(); + vec2 a_ = imageLoad(u_pingpong1, ivec2(butterfly_precomp.z, pixel_pos.y)).rg; + vec2 b_ = imageLoad(u_pingpong1, ivec2(butterfly_precomp.w, pixel_pos.y)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong0, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } +} + +void VerticalButterfiles(in ivec2 pixel_pos) +{ + vec4 butterfly_precomp = imageLoad(u_butterfly_precomp, ivec2(step.i, pixel_pos.y)); + if ((step.i % 2) == 0) + { + subgroupMemoryBarrierImage(); + vec2 a_ = imageLoad(u_pingpong0, ivec2(pixel_pos.x, butterfly_precomp.z)).rg; + vec2 b_ = imageLoad(u_pingpong0, ivec2(pixel_pos.x, butterfly_precomp.w)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong1, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } + else + { + subgroupMemoryBarrierImage(); + vec2 a_ = imageLoad(u_pingpong1, ivec2(pixel_pos.x, butterfly_precomp.z)).rg; + vec2 b_ = imageLoad(u_pingpong1, ivec2(pixel_pos.x, butterfly_precomp.w)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong0, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } +} + +void main() +{ + ivec2 uv = ivec2(gl_GlobalInvocationID.xy); + if (direction == 0) HorizontalButterflies(uv); + else if (direction == 1) VerticalButterfiles(uv); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_invert.comp b/shaders/subgroups_operations/fft_invert.comp new file mode 100644 index 0000000000..54996e0d91 --- /dev/null +++ b/shaders/subgroups_operations/fft_invert.comp @@ -0,0 +1,62 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D u_displacement; + +layout (binding = 1, rgba32f) readonly uniform image2D u_pingpong0_y; +layout (binding = 2, rgba32f) readonly uniform image2D u_pingpong1_y; + +layout (binding = 3, rgba32f) readonly uniform image2D u_pingpong0_x; +layout (binding = 4, rgba32f) readonly uniform image2D u_pingpong1_x; + +layout (binding = 5, rgba32f) readonly uniform image2D u_pingpong0_z; +layout (binding = 6, rgba32f) readonly uniform image2D u_pingpong1_z; + +layout (binding = 7) uniform InvertFft +{ + int pong_idx; + uint grid_size; +} fftUbo; + +void main() +{ + uint N = fftUbo.grid_size; + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + float perms[2] = { 1.0f, -1.0f }; + int index = int(mod(pixel_pos.x + pixel_pos.y, 2)); + float perm = perms[index]; + uint pingpong_index = fftUbo.pong_idx; + if (pingpong_index == 0) + { + float h_y = imageLoad(u_pingpong0_y, pixel_pos).r; + float h_x = imageLoad(u_pingpong0_x, pixel_pos).r; + float h_z = imageLoad(u_pingpong0_z, pixel_pos).r; + imageStore(u_displacement, pixel_pos, vec4(perm * (h_x / float(N * N)), perm * (h_y / float(N * N)), perm * (h_z / float(N * N)), 1.0f)); + } + else if (pingpong_index == 1) + { + float h_y = imageLoad(u_pingpong1_y, pixel_pos).r; + float h_x = imageLoad(u_pingpong1_x, pixel_pos).r; + float h_z = imageLoad(u_pingpong1_z, pixel_pos).r; + imageStore(u_displacement, pixel_pos, vec4(perm * (h_x / float(N * N)), perm * (h_y / float(N * N)), perm * (h_z / float(N * N)), 1.0f)); + } +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_invert_subgroups_off.comp b/shaders/subgroups_operations/fft_invert_subgroups_off.comp new file mode 100644 index 0000000000..736994c814 --- /dev/null +++ b/shaders/subgroups_operations/fft_invert_subgroups_off.comp @@ -0,0 +1,61 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D u_displacement; + +layout (binding = 1, rgba32f) readonly uniform image2D u_pingpong0_y; +layout (binding = 2, rgba32f) readonly uniform image2D u_pingpong1_y; + +layout (binding = 3, rgba32f) readonly uniform image2D u_pingpong0_x; +layout (binding = 4, rgba32f) readonly uniform image2D u_pingpong1_x; + +layout (binding = 5, rgba32f) readonly uniform image2D u_pingpong0_z; +layout (binding = 6, rgba32f) readonly uniform image2D u_pingpong1_z; + +layout (binding = 7) uniform InvertFft +{ + int pong_idx; + uint grid_size; +} fftUbo; + +void main() +{ + uint N = fftUbo.grid_size; + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + float perms[2] = { 1.0f, -1.0f }; + int index = int(mod(pixel_pos.x + pixel_pos.y, 2)); + float perm = perms[index]; + uint pingpong_index = fftUbo.pong_idx; + if (pingpong_index == 0) + { + float h_y = imageLoad(u_pingpong0_y, pixel_pos).r; + float h_x = imageLoad(u_pingpong0_x, pixel_pos).r; + float h_z = imageLoad(u_pingpong0_z, pixel_pos).r; + imageStore(u_displacement, pixel_pos, vec4(perm * (h_x / float(N * N)), perm * (h_y / float(N * N)), perm * (h_z / float(N * N)), 1.0f)); + } + else if (pingpong_index == 1) + { + float h_y = imageLoad(u_pingpong1_y, pixel_pos).r; + float h_x = imageLoad(u_pingpong1_x, pixel_pos).r; + float h_z = imageLoad(u_pingpong1_z, pixel_pos).r; + imageStore(u_displacement, pixel_pos, vec4(perm * (h_x / float(N * N)), perm * (h_y / float(N * N)), perm * (h_z / float(N * N)), 1.0f)); + } +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_normal_map.comp b/shaders/subgroups_operations/fft_normal_map.comp new file mode 100644 index 0000000000..24b9cf08bf --- /dev/null +++ b/shaders/subgroups_operations/fft_normal_map.comp @@ -0,0 +1,50 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D fft_normal_map; + +layout (binding = 1, rgba32f) readonly uniform image2D fft_displacement_map; + +layout (binding = 2) uniform InvertFft +{ + int pong_idx; + uint grid_size; +} fftUbo; + +void main() +{ + uint N = fftUbo.grid_size; + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + const float offset = 1.0f; + + vec3 v0 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(0.0f, -offset))).rgb; + vec3 v1 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(0.0f, offset))).rgb; + float v01_length = length(v1 - v0); + + vec3 v2 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(-offset, 0.0f))).rgb; + vec3 v3 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(offset, 0.0f))).rgb; + float v23_length = length(v3 - v2); + + vec3 c0 = (v1 - v0) / ( 2.0f * v01_length); + vec3 c1 = (v3 - v2) / ( 2.0f * v23_length); + + vec3 result = (cross(c0, c1) * 0.5f) + 0.5f; + imageStore(fft_normal_map, pixel_pos, vec4(normalize(result), 1.0f)); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_normal_map_subgroups_off.comp b/shaders/subgroups_operations/fft_normal_map_subgroups_off.comp new file mode 100644 index 0000000000..24b9cf08bf --- /dev/null +++ b/shaders/subgroups_operations/fft_normal_map_subgroups_off.comp @@ -0,0 +1,50 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D fft_normal_map; + +layout (binding = 1, rgba32f) readonly uniform image2D fft_displacement_map; + +layout (binding = 2) uniform InvertFft +{ + int pong_idx; + uint grid_size; +} fftUbo; + +void main() +{ + uint N = fftUbo.grid_size; + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + const float offset = 1.0f; + + vec3 v0 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(0.0f, -offset))).rgb; + vec3 v1 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(0.0f, offset))).rgb; + float v01_length = length(v1 - v0); + + vec3 v2 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(-offset, 0.0f))).rgb; + vec3 v3 = imageLoad(fft_displacement_map, ivec2(pixel_pos + vec2(offset, 0.0f))).rgb; + float v23_length = length(v3 - v2); + + vec3 c0 = (v1 - v0) / ( 2.0f * v01_length); + vec3 c1 = (v3 - v2) / ( 2.0f * v23_length); + + vec3 result = (cross(c0, c1) * 0.5f) + 0.5f; + imageStore(fft_normal_map, pixel_pos, vec4(normalize(result), 1.0f)); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_subgroups_off.comp b/shaders/subgroups_operations/fft_subgroups_off.comp new file mode 100644 index 0000000000..0f4d9ab585 --- /dev/null +++ b/shaders/subgroups_operations/fft_subgroups_off.comp @@ -0,0 +1,120 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (constant_id = 0) const int direction = 0; + +layout (binding = 0, rgba32f) readonly uniform image2D u_butterfly_precomp; +layout (binding = 1, rgba32f) uniform image2D u_pingpong0; +layout (binding = 2, rgba32f) uniform image2D u_pingpong1; + +layout( push_constant ) uniform Push_Constants{ + uint i; +} step; + +struct Complex +{ + float real; + float imag; +}; + +Complex complex_add(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real + c2.real; + res.imag = c1.imag + c2.imag; + return res; +} + +Complex complex_multiply(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real * c2.real - c1.imag * c2.imag; + res.imag = c1.real * c2.imag + c1.imag * c2.real; + return res; +} + +void HorizontalButterflies(in ivec2 pixel_pos) +{ + vec4 butterfly_precomp = imageLoad(u_butterfly_precomp, ivec2(step.i, pixel_pos.x)); + if ((step.i % 2) == 0) + { + memoryBarrier(); + vec2 a_ = imageLoad(u_pingpong0, ivec2(butterfly_precomp.z, pixel_pos.y)).rg; + vec2 b_ = imageLoad(u_pingpong0, ivec2(butterfly_precomp.w, pixel_pos.y)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong1, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } + else + { + memoryBarrier(); + vec2 a_ = imageLoad(u_pingpong1, ivec2(butterfly_precomp.z, pixel_pos.y)).rg; + vec2 b_ = imageLoad(u_pingpong1, ivec2(butterfly_precomp.w, pixel_pos.y)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong0, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } +} + +void VerticalButterfiles(in ivec2 pixel_pos) +{ + vec4 butterfly_precomp = imageLoad(u_butterfly_precomp, ivec2(step.i, pixel_pos.y)); + if ((step.i % 2) == 0) + { + memoryBarrier(); + vec2 a_ = imageLoad(u_pingpong0, ivec2(pixel_pos.x, butterfly_precomp.z)).rg; + vec2 b_ = imageLoad(u_pingpong0, ivec2(pixel_pos.x, butterfly_precomp.w)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong1, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } + else + { + memoryBarrier(); + vec2 a_ = imageLoad(u_pingpong1, ivec2(pixel_pos.x, butterfly_precomp.z)).rg; + vec2 b_ = imageLoad(u_pingpong1, ivec2(pixel_pos.x, butterfly_precomp.w)).rg; + + Complex a = Complex(a_.x, a_.y); + Complex b = Complex(b_.x, b_.y); + Complex twiddle_factor = Complex(butterfly_precomp.x, butterfly_precomp.y); + + Complex result = complex_add(a, complex_multiply(twiddle_factor, b)); + imageStore(u_pingpong0, pixel_pos, vec4(result.real, result.imag, 0.f, 1.f)); + } +} + +void main() +{ + ivec2 uv = ivec2(gl_GlobalInvocationID.xy); + if (direction == 0) HorizontalButterflies(uv); + else if (direction == 1) VerticalButterfiles(uv); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_tilde_h.comp b/shaders/subgroups_operations/fft_tilde_h.comp new file mode 100644 index 0000000000..0ae7626c58 --- /dev/null +++ b/shaders/subgroups_operations/fft_tilde_h.comp @@ -0,0 +1,109 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PI 3.14159265358979f +#define GRAVITY 9.81f + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) readonly uniform image2D u_tilde_h0_k; +layout (binding = 1, rgba32f) readonly uniform image2D u_tilde_h0_minus_k; + +layout (binding = 2, rgba32f) writeonly uniform image2D tilde_h_kt_dx; +layout (binding = 3, rgba32f) writeonly uniform image2D tilde_h_kt_dy; +layout (binding = 4, rgba32f) writeonly uniform image2D tilde_h_kt_dz; + +layout (binding = 5) uniform FFTParametersUbo +{ + float amplitude; + float len; + uint grid_size; + vec2 wind; +} fftUbo; + +layout (binding = 6) uniform Time +{ + float time; +} t; + +struct Complex +{ + float real; + float imag; +}; + +Complex complex_add(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real + c2.real; + res.imag = c1.imag + c2.imag; + return res; +} + +Complex complex_multiply(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real * c2.real - c1.imag * c2.imag; + res.imag = c1.real * c2.imag + c1.imag * c2.real; + return res; +} + +Complex complex_conj(Complex c) +{ + Complex res; + res.real = c.real; + res.imag = -c.imag; + return res; +} + +void main() +{ + uint N = fftUbo.grid_size; + float L = fftUbo.len; + + vec2 pos = vec2(gl_GlobalInvocationID.xy) - (N / 2.0); + + vec2 k = vec2((2.0 * PI * pos.x) / L, (2.0 * PI * pos.y) / L); + + float k_magnitude = length(k); + if (k_magnitude < 0.00001f) k_magnitude = 0.00001f; + + float w = sqrt(GRAVITY * k_magnitude); + + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + vec2 h0_k = imageLoad(u_tilde_h0_k, pixel_pos).xy; + Complex amp = Complex(h0_k.x, h0_k.y); + Complex exp_iwt = Complex(cos(w * t.time), sin(w * t.time)); + + vec2 h0_minus_k = imageLoad(u_tilde_h0_minus_k, pixel_pos).xy; + Complex amp_conj = complex_conj(Complex(h0_minus_k.x, h0_minus_k.y)); + Complex exp_minus_iwt = Complex(cos(w * t.time), -sin(w * t.time)); + + Complex h_k_t_dy = complex_add(complex_multiply(amp, exp_iwt), complex_multiply(amp_conj, exp_minus_iwt)); + imageStore(tilde_h_kt_dy, pixel_pos, vec4(h_k_t_dy.real, h_k_t_dy.imag, 0.0, 1.0)); + + Complex dx = Complex(0.0, -k.x / k_magnitude); + Complex h_k_t_dx = complex_multiply(dx, h_k_t_dy); + imageStore(tilde_h_kt_dx, pixel_pos, vec4(h_k_t_dx.real, h_k_t_dx.imag, 0.0, 1.0)); + + Complex dz = Complex(0.0, -k.y / k_magnitude); + Complex h_k_t_dz = complex_multiply(dz, h_k_t_dy); + imageStore(tilde_h_kt_dz, pixel_pos, vec4(h_k_t_dz.real, h_k_t_dz.imag, 0.0, 1.0)); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_tilde_h0.comp b/shaders/subgroups_operations/fft_tilde_h0.comp new file mode 100644 index 0000000000..a6edb69ead --- /dev/null +++ b/shaders/subgroups_operations/fft_tilde_h0.comp @@ -0,0 +1,80 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : enable +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PI 3.14159265358979f +#define GRAVITY 9.81f + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D tilde_h0_k; +layout (binding = 1, rgba32f) writeonly uniform image2D tilde_h0_minus_k; + +layout (std140, binding = 2) readonly buffer InputRandom +{ + vec4 data[]; +} input_random; + +layout (std140, binding = 3) uniform FFTParametersUbo +{ + float amplitude; + float len; + uint grid_size; + vec2 wind; +} input_params; + +float SuppressionFactor(float k_magnitude_sq) +{ + float suppress_length = 0.1; + return exp(-k_magnitude_sq * suppress_length * suppress_length); +} + +float PhillipsSpectrum(vec2 k, float k_magnitude_sq, float l_phillips, vec2 wind_direction) +{ + return input_params.amplitude + * ((exp(-1.0 / (k_magnitude_sq * l_phillips * l_phillips)) + * pow(dot(normalize(k), wind_direction), 2)) + * SuppressionFactor(k_magnitude_sq)) + / (k_magnitude_sq * k_magnitude_sq); +} + +void main() +{ + vec2 wind_direction = normalize(input_params.wind); + float wind_speed = length(input_params.wind); + + vec2 pos = vec2(gl_GlobalInvocationID.xy) - (input_params.grid_size / 2.0); + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + vec2 k = vec2((2.0 * PI * pos.x) / input_params.len, (2.0 * PI * pos.y) / input_params.len); + + float k_magnitude = length(k); + if (k_magnitude < 0.00001) + k_magnitude = 0.00001; + + float l_phillips = (wind_speed * wind_speed) / GRAVITY; + + uint idx = pixel_pos.x + pixel_pos.y * input_params.grid_size; + vec4 rnd = input_random.data[idx]; + + float h0_k = clamp(sqrt(PhillipsSpectrum(k, k_magnitude * k_magnitude, l_phillips, wind_direction) / 2.0), -4000.0, 4000.0); + float h0_minus_k = clamp(sqrt(PhillipsSpectrum(-k, k_magnitude * k_magnitude, l_phillips, wind_direction) / 2.0), -4000.0, 4000.0); + + imageStore(tilde_h0_k, pixel_pos, vec4(rnd.xy * h0_k, 0.0, 1.0)); + imageStore(tilde_h0_minus_k, pixel_pos, vec4(rnd.zw * h0_minus_k, 0.0, 1.0)); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_tilde_h0_subgroups_off.comp b/shaders/subgroups_operations/fft_tilde_h0_subgroups_off.comp new file mode 100644 index 0000000000..fc8e72fc12 --- /dev/null +++ b/shaders/subgroups_operations/fft_tilde_h0_subgroups_off.comp @@ -0,0 +1,79 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PI 3.14159265358979f +#define GRAVITY 9.81f + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) writeonly uniform image2D tilde_h0_k; +layout (binding = 1, rgba32f) writeonly uniform image2D tilde_h0_minus_k; + +layout (std140, binding = 2) readonly buffer InputRandom +{ + vec4 data[]; +} input_random; + +layout (std140, binding = 3) uniform FFTParametersUbo +{ + float amplitude; + float len; + uint grid_size; + vec2 wind; +} input_params; + +float SuppressionFactor(float k_magnitude_sq) +{ + float suppress_length = 0.1; + return exp(-k_magnitude_sq * suppress_length * suppress_length); +} + +float PhillipsSpectrum(vec2 k, float k_magnitude_sq, float l_phillips, vec2 wind_direction) +{ + return input_params.amplitude + * ((exp(-1.0 / (k_magnitude_sq * l_phillips * l_phillips)) + * pow(dot(normalize(k), wind_direction), 2)) + * SuppressionFactor(k_magnitude_sq)) + / (k_magnitude_sq * k_magnitude_sq); +} + +void main() +{ + vec2 wind_direction = normalize(input_params.wind); + float wind_speed = length(input_params.wind); + + vec2 pos = vec2(gl_GlobalInvocationID.xy) - (input_params.grid_size / 2.0); + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + vec2 k = vec2((2.0 * PI * pos.x) / input_params.len, (2.0 * PI * pos.y) / input_params.len); + + float k_magnitude = length(k); + if (k_magnitude < 0.00001) + k_magnitude = 0.00001; + + float l_phillips = (wind_speed * wind_speed) / GRAVITY; + + uint idx = pixel_pos.x + pixel_pos.y * input_params.grid_size; + vec4 rnd = input_random.data[idx]; + + float h0_k = clamp(sqrt(PhillipsSpectrum(k, k_magnitude * k_magnitude, l_phillips, wind_direction) / 2.0), -4000.0, 4000.0); + float h0_minus_k = clamp(sqrt(PhillipsSpectrum(-k, k_magnitude * k_magnitude, l_phillips, wind_direction) / 2.0), -4000.0, 4000.0); + + imageStore(tilde_h0_k, pixel_pos, vec4(rnd.xy * h0_k, 0.0, 1.0)); + imageStore(tilde_h0_minus_k, pixel_pos, vec4(rnd.zw * h0_minus_k, 0.0, 1.0)); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/fft_tilde_h_subgroups_off.comp b/shaders/subgroups_operations/fft_tilde_h_subgroups_off.comp new file mode 100644 index 0000000000..421e817ade --- /dev/null +++ b/shaders/subgroups_operations/fft_tilde_h_subgroups_off.comp @@ -0,0 +1,108 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define PI 3.14159265358979f +#define GRAVITY 9.81f + +layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in; + +layout (binding = 0, rgba32f) readonly uniform image2D u_tilde_h0_k; +layout (binding = 1, rgba32f) readonly uniform image2D u_tilde_h0_minus_k; + +layout (binding = 2, rgba32f) writeonly uniform image2D tilde_h_kt_dx; +layout (binding = 3, rgba32f) writeonly uniform image2D tilde_h_kt_dy; +layout (binding = 4, rgba32f) writeonly uniform image2D tilde_h_kt_dz; + +layout (binding = 5) uniform FFTParametersUbo +{ + float amplitude; + float len; + uint grid_size; + vec2 wind; +} fftUbo; + +layout (binding = 6) uniform Time +{ + float time; +} t; + +struct Complex +{ + float real; + float imag; +}; + +Complex complex_add(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real + c2.real; + res.imag = c1.imag + c2.imag; + return res; +} + +Complex complex_multiply(Complex c1, Complex c2) +{ + Complex res; + res.real = c1.real * c2.real - c1.imag * c2.imag; + res.imag = c1.real * c2.imag + c1.imag * c2.real; + return res; +} + +Complex complex_conj(Complex c) +{ + Complex res; + res.real = c.real; + res.imag = -c.imag; + return res; +} + +void main() +{ + uint N = fftUbo.grid_size; + float L = fftUbo.len; + + vec2 pos = vec2(gl_GlobalInvocationID.xy) - (N / 2.0); + + vec2 k = vec2((2.0 * PI * pos.x) / L, (2.0 * PI * pos.y) / L); + + float k_magnitude = length(k); + if (k_magnitude < 0.00001f) k_magnitude = 0.00001f; + + float w = sqrt(GRAVITY * k_magnitude); + + ivec2 pixel_pos = ivec2(gl_GlobalInvocationID.xy); + + vec2 h0_k = imageLoad(u_tilde_h0_k, pixel_pos).xy; + Complex amp = Complex(h0_k.x, h0_k.y); + Complex exp_iwt = Complex(cos(w * t.time), sin(w * t.time)); + + vec2 h0_minus_k = imageLoad(u_tilde_h0_minus_k, pixel_pos).xy; + Complex amp_conj = complex_conj(Complex(h0_minus_k.x, h0_minus_k.y)); + Complex exp_minus_iwt = Complex(cos(w * t.time), -sin(w * t.time)); + + Complex h_k_t_dy = complex_add(complex_multiply(amp, exp_iwt), complex_multiply(amp_conj, exp_minus_iwt)); + imageStore(tilde_h_kt_dy, pixel_pos, vec4(h_k_t_dy.real, h_k_t_dy.imag, 0.0, 1.0)); + + Complex dx = Complex(0.0, -k.x / k_magnitude); + Complex h_k_t_dx = complex_multiply(dx, h_k_t_dy); + imageStore(tilde_h_kt_dx, pixel_pos, vec4(h_k_t_dx.real, h_k_t_dx.imag, 0.0, 1.0)); + + Complex dz = Complex(0.0, -k.y / k_magnitude); + Complex h_k_t_dz = complex_multiply(dz, h_k_t_dy); + imageStore(tilde_h_kt_dz, pixel_pos, vec4(h_k_t_dz.real, h_k_t_dz.imag, 0.0, 1.0)); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/ocean.frag b/shaders/subgroups_operations/ocean.frag new file mode 100644 index 0000000000..85e69ef2a8 --- /dev/null +++ b/shaders/subgroups_operations/ocean.frag @@ -0,0 +1,105 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (location = 0) in vec4 in_pos; +layout (location = 1) in vec2 in_uv; + +layout (location = 0) out vec4 outFragColor; + +layout (binding = 0) uniform Ubo +{ + mat4 projection; + mat4 view; + mat4 model; +} ubo; + +layout (binding = 1, rgba32f) uniform image2D fft_displacement_map; + +layout (binding = 3) uniform CameraPos +{ + vec4 position; +} cam; + +layout (binding = 4) uniform sampler2D fft_normal_map; + +layout (binding = 5) uniform OceanParamsUbo +{ + vec3 light_color; + vec3 light_position; + vec3 ocean_color; +} ocean_ubo; + +const float fresnel_approx_pow_factor = 2.0; +const float specular_power = 16.0; +const float specular_scale = 0.75; +const float dyna_range = 0.8f; +const vec3 ocean_dark = vec3(0.03, 0.06, 0.135); + +void main() +{ + vec3 result = vec3(0.0f); + ivec2 normal_texture_size = textureSize(fft_normal_map, 0); + vec2 offset_scale = vec2(4.0f / normal_texture_size.x, 4.0f / normal_texture_size.y); + + vec3 n0 = texture(fft_normal_map, in_uv + offset_scale).xyz; + vec3 n1 = texture(fft_normal_map, in_uv + vec2(-offset_scale.x, offset_scale.y)).xyz; + vec3 n2 = texture(fft_normal_map, in_uv - offset_scale).xyz; + vec3 n3 = texture(fft_normal_map, in_uv - vec2(-offset_scale.x, offset_scale.y)).xyz; + + float f0 = clamp(abs(dot(n0, n2) * (-0.5f) + 0.5f), 0.0f, 1.0f); + float f1 = clamp(abs(dot(n1, n3) * (-0.5f) + 0.5f), 0.0f, 1.0f); + + f0 = pow(f0 * 5.0f, 2.0f); + f1 = pow(f1 * 5.0f, 2.0f); + + vec4 normal_map_data = texture(fft_normal_map, in_uv); + + float fac = (normal_map_data.z / 125.0f) * clamp(max(f0, f1), 0.0f, 1.0f); + + mat3 normal_matrix = mat3(ubo.model); + vec3 normal = normal_matrix * normal_map_data.xyz; + + vec3 light_dir = normalize(normal_matrix * ocean_ubo.light_position); + vec3 view_dir = normalize(in_pos.xyz); + + vec3 specular = vec3(0.0f); + float n_dot_vp = max(0.0f, dot(normal, light_dir)); + float n_dot_d = dot(normal, -view_dir); + float diffuse = clamp(dot(normal, light_dir), 0.0, 1.0); + + if (n_dot_vp > 0.0f) + { + vec3 D = -view_dir; + vec3 R = normalize(reflect(-light_dir, normal)); + + float dir_scale = mix(pow(abs(n_dot_d), 8.0f), 1.0f - pow(abs(1.0f - n_dot_d), 4.0f), n_dot_d); + specular = vec3(0.8f) * vec3(pow(max(dot(R, D), 0.0f), specular_power) * specular_scale * dir_scale) * ocean_ubo.light_color; + } + + float fresnel = clamp(pow(1.0f + n_dot_d, -fresnel_approx_pow_factor) * dyna_range, 0.0f, 1.0f); + vec3 ambient = fresnel * ocean_ubo.ocean_color; + vec3 water_color = (1.0f - fresnel) * ocean_ubo.ocean_color * ocean_dark * diffuse; + result = ambient + water_color + specular; + + // gamma correction + result.r = pow(result.r, 1.0f / 2.2f); + result.g = pow(result.g, 1.0f / 2.2f); + result.b = pow(result.b, 1.0f / 2.2f); + + outFragColor = vec4(result, 1.0f); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/ocean.tesc b/shaders/subgroups_operations/ocean.tesc new file mode 100644 index 0000000000..8b2dbeb69c --- /dev/null +++ b/shaders/subgroups_operations/ocean.tesc @@ -0,0 +1,36 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (vertices = 3) out; + +layout(location = 0) in vec2 inUv[]; + +layout(location = 0) out vec2 outUv[]; + +void main() +{ + gl_TessLevelOuter[0] = 2.0f; + gl_TessLevelOuter[1] = 2.0f; + gl_TessLevelOuter[2] = 2.0f; + gl_TessLevelOuter[3] = 2.0f; + + gl_TessLevelInner[0] = gl_TessLevelOuter[3]; + + gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; + outUv[gl_InvocationID] = inUv[gl_InvocationID]; +} \ No newline at end of file diff --git a/shaders/subgroups_operations/ocean.tese b/shaders/subgroups_operations/ocean.tese new file mode 100644 index 0000000000..52a1ef7085 --- /dev/null +++ b/shaders/subgroups_operations/ocean.tese @@ -0,0 +1,74 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (triangles, equal_spacing, ccw) in; + +layout (location = 0) in vec2 inUv[]; + +layout (location = 0) out vec4 outPos; +layout (location = 1) out vec2 outUV; + +layout (binding = 0) uniform Ubo +{ + mat4 projection; + mat4 view; + mat4 model; +} ubo; + +layout (binding = 1, rgba32f) uniform image2D fft_displacement_map; + +layout (binding = 2) uniform TessellationParams +{ + float choppines; + float displacement_scale; +} tessParams; + +vec2 interpolate_2d(vec2 v0, vec2 v1, vec2 v2) +{ + return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2; +} + +vec3 interpolate_3d(vec3 v0, vec3 v1, vec3 v2) +{ + return vec3(gl_TessCoord.x) * v0 + vec3(gl_TessCoord.y) * v1 + vec3(gl_TessCoord.z) * v2; +} + +vec4 interpolate_4d(vec4 v0, vec4 v1, vec4 v2) +{ + return vec4(gl_TessCoord.x) * v0 + vec4(gl_TessCoord.y) * v1 + vec4(gl_TessCoord.z) * v2; +} + +void main() +{ + vec3 world_pos = interpolate_3d(gl_in[0].gl_Position.xyz, gl_in[1].gl_Position.xyz, gl_in[2].gl_Position.xyz); + + vec4 fft_texel_at_vertex[3]; + fft_texel_at_vertex[0] = imageLoad(fft_displacement_map, ivec2(inUv[0])); + fft_texel_at_vertex[1] = imageLoad(fft_displacement_map, ivec2(inUv[1])); + fft_texel_at_vertex[2] = imageLoad(fft_displacement_map, ivec2(inUv[2])); + + vec4 fft_texel = interpolate_4d(fft_texel_at_vertex[0], fft_texel_at_vertex[1], fft_texel_at_vertex[2]); + + world_pos.y += fft_texel.y * tessParams.displacement_scale; + world_pos.x -= fft_texel.x * tessParams.choppines; + world_pos.z -= fft_texel.z * tessParams.choppines; + + outUV = interpolate_2d(inUv[0], inUv[1], inUv[2]) / 256; + outPos = ubo.view * vec4(world_pos, 1.0f); + gl_Position = ubo.projection * ubo.view * ubo.model * vec4(world_pos, 1.0f); +} \ No newline at end of file diff --git a/shaders/subgroups_operations/ocean.vert b/shaders/subgroups_operations/ocean.vert new file mode 100644 index 0000000000..253b125e5d --- /dev/null +++ b/shaders/subgroups_operations/ocean.vert @@ -0,0 +1,28 @@ +#version 450 +/* Copyright (c) 2024, Mobica Limited + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +layout (location = 0) in vec3 inPos; +layout (location = 1) in vec2 inUv; + +layout (location = 0) out vec2 outUv; + +void main() +{ + gl_Position = vec4(inPos, 1.0f); + outUv = inUv; +} \ No newline at end of file diff --git a/shaders/synchronization_2/glsl/particle.frag.spv b/shaders/synchronization_2/glsl/particle.frag.spv new file mode 100644 index 0000000000..69ff9f056f Binary files /dev/null and b/shaders/synchronization_2/glsl/particle.frag.spv differ diff --git a/shaders/synchronization_2/glsl/particle.vert.spv b/shaders/synchronization_2/glsl/particle.vert.spv new file mode 100644 index 0000000000..3303124a1b Binary files /dev/null and b/shaders/synchronization_2/glsl/particle.vert.spv differ diff --git a/shaders/synchronization_2/glsl/particle_calculate.comp.spv b/shaders/synchronization_2/glsl/particle_calculate.comp.spv new file mode 100644 index 0000000000..32a6f39974 Binary files /dev/null and b/shaders/synchronization_2/glsl/particle_calculate.comp.spv differ diff --git a/shaders/synchronization_2/glsl/particle_integrate.comp.spv b/shaders/synchronization_2/glsl/particle_integrate.comp.spv new file mode 100644 index 0000000000..f65866148e Binary files /dev/null and b/shaders/synchronization_2/glsl/particle_integrate.comp.spv differ diff --git a/shaders/synchronization_2/hlsl/particle_calculate.comp.spv b/shaders/synchronization_2/hlsl/particle_calculate.comp.spv index 1084304941..833354d9f9 100644 Binary files a/shaders/synchronization_2/hlsl/particle_calculate.comp.spv and b/shaders/synchronization_2/hlsl/particle_calculate.comp.spv differ diff --git a/shaders/synchronization_2/slang/particle.frag.slang b/shaders/synchronization_2/slang/particle.frag.slang new file mode 100644 index 0000000000..1069c0624c --- /dev/null +++ b/shaders/synchronization_2/slang/particle.frag.slang @@ -0,0 +1,33 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Sampler2D samplerColorMap; +Sampler2D samplerGradientRamp; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 PointCoord : SV_PointCoord; + float GradientPos; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float3 color = samplerGradientRamp.Sample(float2(input.GradientPos, 0.0)).rgb; + return float4(samplerColorMap.Sample(input.PointCoord).rgb * color, 1.0); +} \ No newline at end of file diff --git a/shaders/synchronization_2/slang/particle.frag.spv b/shaders/synchronization_2/slang/particle.frag.spv new file mode 100644 index 0000000000..de6ec18895 Binary files /dev/null and b/shaders/synchronization_2/slang/particle.frag.spv differ diff --git a/shaders/synchronization_2/slang/particle.vert.slang b/shaders/synchronization_2/slang/particle.vert.slang new file mode 100644 index 0000000000..50b324b25b --- /dev/null +++ b/shaders/synchronization_2/slang/particle.vert.slang @@ -0,0 +1,51 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float4 Pos : POSITION0; + float4 Vel; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float PointSize : SV_PointSize; + float GradientPos; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float2 screendim; +}; +[[vk::binding(2, 0)]] ConstantBuffer ubo; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + const float spriteSize = 0.005 * input.Pos.w; // Point size influenced by mass (stored in input.Pos.w); + float4 eyePos = mul(ubo.modelview, float4(input.Pos.x, input.Pos.y, input.Pos.z, 1.0)); + // Use projection to make sure point sizes uniformly scale independent of current projection + float4 projectedCorner = mul(ubo.projection, float4(0.5 * spriteSize, 0.5 * spriteSize, eyePos.z, eyePos.w)); + output.PointSize = clamp(ubo.screendim.x * projectedCorner.x / projectedCorner.w, 1.0, 128.0); + output.Pos = mul(ubo.projection, eyePos); + output.GradientPos = input.Vel.w; + return output; +} \ No newline at end of file diff --git a/shaders/synchronization_2/slang/particle.vert.spv b/shaders/synchronization_2/slang/particle.vert.spv new file mode 100644 index 0000000000..b6ce6c3d8d Binary files /dev/null and b/shaders/synchronization_2/slang/particle.vert.spv differ diff --git a/shaders/synchronization_2/slang/particle_calculate.comp.slang b/shaders/synchronization_2/slang/particle_calculate.comp.slang new file mode 100644 index 0000000000..db54d7e39d --- /dev/null +++ b/shaders/synchronization_2/slang/particle_calculate.comp.slang @@ -0,0 +1,87 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Particle +{ + float4 pos; + float4 vel; +}; +RWStructuredBuffer particles; + +struct UBO +{ + float deltaT; + int particleCount; +}; +ConstantBuffer ubo; + +[[vk::constant_id(1)]] const int SHARED_DATA_SIZE = 1024; +[[vk::constant_id(2)]] const float GRAVITY = 0.002; +[[vk::constant_id(3)]] const float POWER = 0.75; +[[vk::constant_id(4)]] const float SOFTEN = 0.05; + +// Share data between computer shader invocations to speed up caluclations +groupshared float4 sharedData[SHARED_DATA_SIZE]; + +#define TIME_FACTOR 0.05 + +[shader("compute")] +[numthreads(256, 1, 1)] +void main(uint3 GlobalInvocationID : SV_DispatchThreadID, uint3 LocalInvocationID : SV_GroupThreadID) +{ + // Current SSBO index + uint index = GlobalInvocationID.x; + if (index >= ubo.particleCount) + return; + + float4 position = particles[index].pos; + float4 velocity = particles[index].vel; + float4 acceleration = float4(0, 0, 0, 0); + int3 workgroupSize = WorkgroupSize(); + + for (int i = 0; i < ubo.particleCount; i += SHARED_DATA_SIZE) + { + if (i + LocalInvocationID.x < ubo.particleCount) + { + sharedData[LocalInvocationID.x] = particles[i + LocalInvocationID.x].pos; + } + else + { + sharedData[LocalInvocationID.x] = float4(0, 0, 0, 0); + } + + GroupMemoryBarrierWithGroupSync(); + + for (int j = 0; j < workgroupSize.x; j++) + { + float4 other = sharedData[j]; + float3 len = other.xyz - position.xyz; + acceleration.xyz += GRAVITY * len * other.w / pow(dot(len, len) + SOFTEN, POWER); + } + + GroupMemoryBarrierWithGroupSync(); + } + + particles[index].vel.xyz += ubo.deltaT * TIME_FACTOR * acceleration.xyz; + + // Gradient texture position + particles[index].vel.w += 0.1 * TIME_FACTOR * ubo.deltaT; + if (particles[index].vel.w > 1.0) + { + particles[index].vel.w -= 1.0; + } +} \ No newline at end of file diff --git a/shaders/synchronization_2/slang/particle_calculate.comp.spv b/shaders/synchronization_2/slang/particle_calculate.comp.spv new file mode 100644 index 0000000000..1c0b7bfb94 Binary files /dev/null and b/shaders/synchronization_2/slang/particle_calculate.comp.spv differ diff --git a/shaders/synchronization_2/slang/particle_integrate.comp.slang b/shaders/synchronization_2/slang/particle_integrate.comp.slang new file mode 100644 index 0000000000..559a357dff --- /dev/null +++ b/shaders/synchronization_2/slang/particle_integrate.comp.slang @@ -0,0 +1,43 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct Particle +{ + float4 pos; + float4 vel; +}; +RWStructuredBuffer particles; + +struct UBO +{ + float deltaT; + int particleCount; +}; +ConstantBuffer ubo; + +#define TIME_FACTOR 0.05 + +[shader("compute")] +[numthreads(256, 1, 1)] +void main(uint3 GlobalInvocationID : SV_DispatchThreadID) +{ + int index = int(GlobalInvocationID.x); + float4 position = particles[index].pos; + float4 velocity = particles[index].vel; + position += ubo.deltaT * TIME_FACTOR * velocity; + particles[index].pos = position; +} \ No newline at end of file diff --git a/shaders/synchronization_2/slang/particle_integrate.comp.spv b/shaders/synchronization_2/slang/particle_integrate.comp.spv new file mode 100644 index 0000000000..325e3af7ae Binary files /dev/null and b/shaders/synchronization_2/slang/particle_integrate.comp.spv differ diff --git a/shaders/tensor_and_data_graph/glsl/blit.frag b/shaders/tensor_and_data_graph/glsl/blit.frag new file mode 100644 index 0000000000..971796a09b --- /dev/null +++ b/shaders/tensor_and_data_graph/glsl/blit.frag @@ -0,0 +1,32 @@ +#version 460 + +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Simple blitting fragment shader. Output is sampled from a texture using UVs that are passed from the vertex shader + +layout(location = 0) in vec2 in_uv; + +layout(set = 0, binding = 0) uniform sampler2D in_texture; + +layout(location = 0) out vec4 out_color; + +void main() +{ + out_color = texture(in_texture, in_uv); +} + diff --git a/shaders/tensor_and_data_graph/glsl/blit.frag.spv b/shaders/tensor_and_data_graph/glsl/blit.frag.spv new file mode 100644 index 0000000000..345dd5e45e Binary files /dev/null and b/shaders/tensor_and_data_graph/glsl/blit.frag.spv differ diff --git a/shaders/tensor_and_data_graph/glsl/fullscreen.vert b/shaders/tensor_and_data_graph/glsl/fullscreen.vert new file mode 100644 index 0000000000..3d9507eb8b --- /dev/null +++ b/shaders/tensor_and_data_graph/glsl/fullscreen.vert @@ -0,0 +1,36 @@ +#version 460 + +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Simple fullscreen triangle procedural vertex shader. UVs are also output for consumption by the blit.frag fragment shader. + +layout (location = 0) out vec2 out_uv; + +void main() +{ + vec2 vertices[] = + { + vec2(-1.0f, 3.0f), + vec2(-1.0f, -1.0f), + vec2( 3.0f, -1.0f), + }; + vec2 vertex = vertices[gl_VertexIndex % 3].xy; + gl_Position = vec4(vertex, 0.0f, 1.0f); + out_uv = (vertex + 1.0) / 2.0f; +} + diff --git a/shaders/tensor_and_data_graph/glsl/fullscreen.vert.spv b/shaders/tensor_and_data_graph/glsl/fullscreen.vert.spv new file mode 100644 index 0000000000..c0c251629b Binary files /dev/null and b/shaders/tensor_and_data_graph/glsl/fullscreen.vert.spv differ diff --git a/shaders/tensor_and_data_graph/glsl/visualization_two_tensors.comp b/shaders/tensor_and_data_graph/glsl/visualization_two_tensors.comp new file mode 100644 index 0000000000..0274ad59be --- /dev/null +++ b/shaders/tensor_and_data_graph/glsl/visualization_two_tensors.comp @@ -0,0 +1,95 @@ +#version 460 + +/* Copyright (c) 2024-2025, Arm Limited and Contributors + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Compute shader which reads from two tensors representing RGB images (input_tensor and output_tensor) +// and draws them to an output image. + +// Enable the extension that allows us to read from Tensors. +#extension GL_ARM_tensors : enable + +// Our two input tensors, each being a 4-dimensional array of floats +layout (set = 0, binding = 0) uniform tensorARM input_tensor; +layout (set = 0, binding = 1) uniform tensorARM output_tensor; + +// Output image to write to +layout(rgba8, set = 0, binding = 2) writeonly uniform image2D output_image; + +// Push constants to provide the size of the output image, so that we can position things correctly +layout(push_constant) uniform push_constants +{ + ivec2 output_image_size; +}; + +// If the given pixel_coord is within the rectangle described by (left,top,width, height), then updates +// `color` with data from the `input_tensor` at an interpolated location based on the position in the rectangle. +void draw_input_tensor(inout vec4 color, ivec2 pixel_coord, int left, int top, int width, int height) +{ + if (pixel_coord.x >= left && pixel_coord.x < left + width && pixel_coord.y >= top && pixel_coord.y < top + height) + { + // Query the size of the tensor, in dimensions 2 (width) and 1 (height) + uint tensor_width = tensorSizeARM(input_tensor, 2); + uint tensor_height = tensorSizeARM(input_tensor, 1); + // Work out the location in the tensor to read from + uint[4] tensor_coords = { 0, + uint(float(pixel_coord.y - top) / height * tensor_height), + uint(float(pixel_coord.x - left) / width * tensor_width), + 0 }; + // Read three values from the tensor, starting from this location and moving along the least-significant dimension. + // This gives us the red, green and blue values. + float[3] value; + tensorReadARM(input_tensor, tensor_coords, value); + color = vec4(value[0], value[1], value[2], 1.0f); + } +} + +// As above, but reads from the output_tensor. +void draw_output_tensor(inout vec4 color, ivec2 pixel_coord, int left, int top, int width, int height) +{ + if (pixel_coord.x >= left && pixel_coord.x < left + width && pixel_coord.y >= top && pixel_coord.y < top + height) + { + uint tensor_width = tensorSizeARM(output_tensor, 2); + uint tensor_height = tensorSizeARM(output_tensor, 1); + uint[4] tensor_coords = { 0, + uint(float(pixel_coord.y - top) / height * tensor_height), + uint(float(pixel_coord.x - left) / width * tensor_width), + 0 }; + float[3] value; + tensorReadARM(output_tensor, tensor_coords, value); + color = vec4(value[0], value[1], value[2], 1.0f); + } +} + + +layout(local_size_x = 8, local_size_y = 8) in; +void main() +{ + ivec2 pixel_coord = ivec2(gl_GlobalInvocationID.xy); + if (pixel_coord.x >= output_image_size.x || pixel_coord.y >= output_image_size.y) + { + return; // Out-of-bounds + } + + vec4 out_color = vec4(0.0f, 0.0f, 0.0f, 1.0f); + + // Position the input_tensor to the left of the middle, and the output_tensor to the right of the middle + draw_input_tensor(out_color, pixel_coord, output_image_size.x / 2 - 300, output_image_size.y / 2 - 100, 200, 200); + draw_output_tensor(out_color, pixel_coord, output_image_size.x / 2 + 100, output_image_size.y / 2 - 100, 200, 200); + + imageStore(output_image, ivec2(pixel_coord), out_color); +} diff --git a/shaders/tensor_and_data_graph/glsl/visualization_two_tensors.comp.spv b/shaders/tensor_and_data_graph/glsl/visualization_two_tensors.comp.spv new file mode 100644 index 0000000000..4ff8ebb517 Binary files /dev/null and b/shaders/tensor_and_data_graph/glsl/visualization_two_tensors.comp.spv differ diff --git a/shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm b/shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm new file mode 100644 index 0000000000..c7c9124543 --- /dev/null +++ b/shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm @@ -0,0 +1,86 @@ +; Copyright (c) 2024-2025, Arm Limited and Contributors +; +; SPDX-License-Identifier: Apache-2.0 +; +; Licensed under the Apache License, Version 2.0 the "License"; +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; + +; A simple neural network with a single pooling layer, expressed in SPIR-V assembly. +; See simple_tensor_and_data_graph/README.adoc for a more detailed explanation of this code. + + ; Boilerplate + OpCapability Shader + OpCapability TensorsARM + OpCapability GraphARM + OpExtension "SPV_ARM_tensors" + OpExtension "SPV_ARM_graph" + + ; Import TOSA instructions for neural network operations + %tosa = OpExtInstImport "TOSA.001000.1" + + ; More boilerplate + OpMemoryModel Logical GLSL450 + + ; Descriptor set interface + OpDecorate %input_tensor_ptr DescriptorSet 0 + OpDecorate %input_tensor_ptr Binding 0 + OpDecorate %output_tensor_ptr DescriptorSet 0 + OpDecorate %output_tensor_ptr Binding 1 + + ; Types and constants + %uint = OpTypeInt 32 0 + %float = OpTypeFloat 32 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %uint_4 = OpConstant %uint 4 + %input_width = OpConstant %uint 10 + %input_height = OpConstant %uint 10 + %output_width = OpConstant %uint 5 + %output_height = OpConstant %uint 5 + %float_0 = OpConstant %float 0 + %uint_array_l1 = OpTypeArray %uint %uint_1 + %uint_array_l4 = OpTypeArray %uint %uint_4 + %uint_array_l1_1 = OpConstantComposite %uint_array_l1 %uint_1 + %uint_array_l1_2 = OpConstantComposite %uint_array_l1 %uint_2 + %uint_array_l1_4 = OpConstantComposite %uint_array_l1 %uint_4 + %uint_array_l4_1_ih_iw_3 = OpConstantComposite %uint_array_l4 %uint_1 %input_height %input_width %uint_3 + %uint_array_l4_1_oh_ow_3 = OpConstantComposite %uint_array_l4 %uint_1 %output_height %output_width %uint_3 + %float_tensor_r1_s1 = OpTypeTensorARM %float %uint_1 %uint_array_l1_1 + %uint_tensor_r1_s2 = OpTypeTensorARM %uint %uint_1 %uint_array_l1_2 + %uint_tensor_r1_s4 = OpTypeTensorARM %uint %uint_1 %uint_array_l1_4 + %float_tensor_r4_s_1_ih_iw_3 = OpTypeTensorARM %float %uint_4 %uint_array_l4_1_ih_iw_3 + %float_tensor_r4_s_1_oh_ow_3 = OpTypeTensorARM %float %uint_4 %uint_array_l4_1_oh_ow_3 +%ptr_float_tensor_r4_s_1_ih_iw_3 = OpTypePointer UniformConstant %float_tensor_r4_s_1_ih_iw_3 +%ptr_float_tensor_r4_s_1_oh_ow_3 = OpTypePointer UniformConstant %float_tensor_r4_s_1_oh_ow_3 + + ; Parameters for pooling layer + %avg_pool_kernel = OpConstantComposite %uint_tensor_r1_s2 %uint_3 %uint_3 + %avg_pool_stride = OpConstantComposite %uint_tensor_r1_s2 %uint_2 %uint_2 + %avg_pool_pad = OpConstantComposite %uint_tensor_r1_s4 %uint_0 %uint_0 %uint_0 %uint_0 + %avg_pool_input_zero_point = OpConstantComposite %float_tensor_r1_s1 %float_0 + %avg_pool_output_zero_point = OpConstantComposite %float_tensor_r1_s1 %float_0 + + ; Graph type and interface variables + %graph_type = OpTypeGraphARM 1 %float_tensor_r4_s_1_ih_iw_3 %float_tensor_r4_s_1_oh_ow_3 + %input_tensor_ptr = OpVariable %ptr_float_tensor_r4_s_1_ih_iw_3 UniformConstant + %output_tensor_ptr = OpVariable %ptr_float_tensor_r4_s_1_oh_ow_3 UniformConstant + + ; Neural network layers defined as a graph + OpGraphEntryPointARM %graph "main" %input_tensor_ptr %output_tensor_ptr + %graph = OpGraphARM %graph_type + %in = OpGraphInputARM %float_tensor_r4_s_1_ih_iw_3 %uint_0 + %out = OpExtInst %float_tensor_r4_s_1_oh_ow_3 %tosa AVG_POOL2D %avg_pool_kernel %avg_pool_stride %avg_pool_pad %uint_2 %in %avg_pool_input_zero_point %avg_pool_output_zero_point + OpGraphSetOutputARM %out %uint_0 + OpGraphEndARM diff --git a/shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm.spv b/shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm.spv new file mode 100644 index 0000000000..9e01041da8 Binary files /dev/null and b/shaders/tensor_and_data_graph/simple_tensor_and_data_graph/spirv/pooling.spvasm.spv differ diff --git a/shaders/tensor_and_data_graph/spirv/conv2d.spvasm b/shaders/tensor_and_data_graph/spirv/conv2d.spvasm new file mode 100644 index 0000000000..f1adb0c53e --- /dev/null +++ b/shaders/tensor_and_data_graph/spirv/conv2d.spvasm @@ -0,0 +1,89 @@ +; Copyright (c) 2025, Arm Limited and Contributors +; +; SPDX-License-Identifier: Apache-2.0 +; +; Licensed under the Apache License, Version 2.0 the "License"; +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; + +; A simple neural network with a single conv2d layer, expressed in SPIR-V assembly. + + ; Boilerplate + OpCapability Shader + OpCapability TensorsARM + OpCapability GraphARM + OpExtension "SPV_ARM_tensors" + OpExtension "SPV_ARM_graph" + + ; Import TOSA instructions for neural network operations + %tosa = OpExtInstImport "TOSA.001000.1" + + ; More boilerplate + OpMemoryModel Logical GLSL450 + + ; Descriptor set interface + OpDecorate %input_tensor_ptr DescriptorSet 0 + OpDecorate %input_tensor_ptr Binding 0 + OpDecorate %output_tensor_ptr DescriptorSet 0 + OpDecorate %output_tensor_ptr Binding 1 + + ; Types and constants + %bool = OpTypeBool + %false = OpConstantFalse %bool + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %uint_4 = OpConstant %uint 4 + %width = OpConstant %uint 20 + %height = OpConstant %uint 20 + %float = OpTypeFloat 32 + %float_0 = OpConstant %float 0 + %uint_array_l1 = OpTypeArray %uint %uint_1 + %uint_array_l4 = OpTypeArray %uint %uint_4 + %uint_array_l1_1 = OpConstantComposite %uint_array_l1 %uint_1 + %uint_array_l1_2 = OpConstantComposite %uint_array_l1 %uint_2 + %uint_array_l1_3 = OpConstantComposite %uint_array_l1 %uint_3 + %uint_array_l1_4 = OpConstantComposite %uint_array_l1 %uint_4 + %uint_array_l4_3_3_3_3 = OpConstantComposite %uint_array_l4 %uint_3 %uint_3 %uint_3 %uint_3 + %uint_array_l4_1_h_w_3 = OpConstantComposite %uint_array_l4 %uint_1 %height %width %uint_3 + %float_tensor_r1_s1 = OpTypeTensorARM %float %uint_1 %uint_array_l1_1 + %uint_tensor_r1_s2 = OpTypeTensorARM %uint %uint_1 %uint_array_l1_2 + %float_tensor_r1_s3 = OpTypeTensorARM %float %uint_1 %uint_array_l1_3 + %uint_tensor_r1_s4 = OpTypeTensorARM %uint %uint_1 %uint_array_l1_4 + %float_tensor_r4_s_3_3_3_3 = OpTypeTensorARM %float %uint_4 %uint_array_l4_3_3_3_3 + %float_tensor_r4_s_1_h_w_3 = OpTypeTensorARM %float %uint_4 %uint_array_l4_1_h_w_3 +%ptr_float_tensor_r4_s_1_h_w_3 = OpTypePointer UniformConstant %float_tensor_r4_s_1_h_w_3 + + ; Parameters for conv2d layer + %conv_pad = OpConstantComposite %uint_tensor_r1_s4 %uint_1 %uint_1 %uint_1 %uint_1 + %conv_stride = OpConstantComposite %uint_tensor_r1_s2 %uint_1 %uint_1 + %conv_dilation = OpConstantComposite %uint_tensor_r1_s2 %uint_1 %uint_1 + %conv_input_zero_point = OpConstantComposite %float_tensor_r1_s1 %float_0 + %conv_weight_zero_point = OpConstantComposite %float_tensor_r1_s1 %float_0 + + %conv_weights = OpGraphConstantARM %float_tensor_r4_s_3_3_3_3 0 + %conv_biases = OpGraphConstantARM %float_tensor_r1_s3 1 + + ; Graph type and interface variables + %graph_type = OpTypeGraphARM 1 %float_tensor_r4_s_1_h_w_3 %float_tensor_r4_s_1_h_w_3 + %input_tensor_ptr = OpVariable %ptr_float_tensor_r4_s_1_h_w_3 UniformConstant + %output_tensor_ptr = OpVariable %ptr_float_tensor_r4_s_1_h_w_3 UniformConstant + + ; Neural network layers defined as a graph + OpGraphEntryPointARM %graph "main" %input_tensor_ptr %output_tensor_ptr + %graph = OpGraphARM %graph_type + %in = OpGraphInputARM %float_tensor_r4_s_1_h_w_3 %uint_0 + %out = OpExtInst %float_tensor_r4_s_1_h_w_3 %tosa CONV2D %conv_pad %conv_stride %conv_dilation %uint_2 %false %in %conv_weights %conv_biases %conv_input_zero_point %conv_weight_zero_point + OpGraphSetOutputARM %out %uint_0 + OpGraphEndARM \ No newline at end of file diff --git a/shaders/tensor_and_data_graph/spirv/conv2d.spvasm.spv b/shaders/tensor_and_data_graph/spirv/conv2d.spvasm.spv new file mode 100644 index 0000000000..e38cff3434 Binary files /dev/null and b/shaders/tensor_and_data_graph/spirv/conv2d.spvasm.spv differ diff --git a/shaders/terrain_tessellation/glsl/skysphere.frag.spv b/shaders/terrain_tessellation/glsl/skysphere.frag.spv new file mode 100644 index 0000000000..c0fc65c65f Binary files /dev/null and b/shaders/terrain_tessellation/glsl/skysphere.frag.spv differ diff --git a/shaders/terrain_tessellation/glsl/skysphere.vert.spv b/shaders/terrain_tessellation/glsl/skysphere.vert.spv new file mode 100644 index 0000000000..d78803b327 Binary files /dev/null and b/shaders/terrain_tessellation/glsl/skysphere.vert.spv differ diff --git a/shaders/terrain_tessellation/glsl/terrain.frag.spv b/shaders/terrain_tessellation/glsl/terrain.frag.spv new file mode 100644 index 0000000000..64f4965b62 Binary files /dev/null and b/shaders/terrain_tessellation/glsl/terrain.frag.spv differ diff --git a/shaders/terrain_tessellation/glsl/terrain.tesc.spv b/shaders/terrain_tessellation/glsl/terrain.tesc.spv new file mode 100644 index 0000000000..46e38d2cce Binary files /dev/null and b/shaders/terrain_tessellation/glsl/terrain.tesc.spv differ diff --git a/shaders/terrain_tessellation/glsl/terrain.tese.spv b/shaders/terrain_tessellation/glsl/terrain.tese.spv new file mode 100644 index 0000000000..05e67b28b0 Binary files /dev/null and b/shaders/terrain_tessellation/glsl/terrain.tese.spv differ diff --git a/shaders/terrain_tessellation/glsl/terrain.vert.spv b/shaders/terrain_tessellation/glsl/terrain.vert.spv new file mode 100644 index 0000000000..4fa43175e2 Binary files /dev/null and b/shaders/terrain_tessellation/glsl/terrain.vert.spv differ diff --git a/shaders/terrain_tessellation/hlsl/terrain.frag.spv b/shaders/terrain_tessellation/hlsl/terrain.frag.spv index 833764ae4e..59022cb0bc 100644 Binary files a/shaders/terrain_tessellation/hlsl/terrain.frag.spv and b/shaders/terrain_tessellation/hlsl/terrain.frag.spv differ diff --git a/shaders/terrain_tessellation/hlsl/terrain.tesc.spv b/shaders/terrain_tessellation/hlsl/terrain.tesc.spv index 03a48f97ec..f5ee3ca1bb 100644 Binary files a/shaders/terrain_tessellation/hlsl/terrain.tesc.spv and b/shaders/terrain_tessellation/hlsl/terrain.tesc.spv differ diff --git a/shaders/terrain_tessellation/hlsl/terrain.tese.spv b/shaders/terrain_tessellation/hlsl/terrain.tese.spv index ae84070023..f85bb09cb4 100644 Binary files a/shaders/terrain_tessellation/hlsl/terrain.tese.spv and b/shaders/terrain_tessellation/hlsl/terrain.tese.spv differ diff --git a/shaders/terrain_tessellation/slang/skysphere.frag.slang b/shaders/terrain_tessellation/slang/skysphere.frag.slang new file mode 100644 index 0000000000..dc61d4f605 --- /dev/null +++ b/shaders/terrain_tessellation/slang/skysphere.frag.slang @@ -0,0 +1,25 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] Sampler2D samplerColorMap; + +[shader("fragment")] +float4 main(float2 inUV) +{ + float4 color = samplerColorMap.Sample(inUV); + return float4(color.rgb, 1.0); +} diff --git a/shaders/terrain_tessellation/slang/skysphere.frag.spv b/shaders/terrain_tessellation/slang/skysphere.frag.spv new file mode 100644 index 0000000000..0f4614a050 Binary files /dev/null and b/shaders/terrain_tessellation/slang/skysphere.frag.spv differ diff --git a/shaders/hlsl_shaders/hlsl_shader.vert b/shaders/terrain_tessellation/slang/skysphere.vert.slang similarity index 64% rename from shaders/hlsl_shaders/hlsl_shader.vert rename to shaders/terrain_tessellation/slang/skysphere.vert.slang index d64df6f3e1..0317834ac0 100644 --- a/shaders/hlsl_shaders/hlsl_shader.vert +++ b/shaders/terrain_tessellation/slang/skysphere.vert.slang @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Sascha Willems +/* Copyright (c) 2025, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * @@ -17,30 +17,29 @@ struct VSInput { -[[vk::location(0)]] float3 Pos : POSITION0; -[[vk::location(1)]] float2 UV : TEXCOORD0; -[[vk::location(2)]] float3 Normal : NORMAL0; + float3 Pos : POSITION0; + float3 Normal; + float2 UV; }; -struct UBO +struct VSOutput { - float4x4 projection; - float4x4 model; - float4 viewPos; + float4 Pos : SV_POSITION; + float2 UV; }; -cbuffer ubo : register(b0) { UBO ubo; } - -struct VSOutput +struct UBO { - float4 Pos : SV_POSITION; -[[vk::location(0)]] float2 UV : TEXCOORD0; + float4x4 mvp; }; +ConstantBuffer ubo; +[shader("vertex")] VSOutput main(VSInput input) { - VSOutput output = (VSOutput)0; + VSOutput output; + output.Pos = mul(ubo.mvp, float4(input.Pos, 1.0)); output.UV = input.UV; - output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + output.UV.y = 1.0 - output.UV.y; return output; } diff --git a/shaders/terrain_tessellation/slang/skysphere.vert.spv b/shaders/terrain_tessellation/slang/skysphere.vert.spv new file mode 100644 index 0000000000..67e4cc8db0 Binary files /dev/null and b/shaders/terrain_tessellation/slang/skysphere.vert.spv differ diff --git a/shaders/terrain_tessellation/slang/terrain.frag.slang b/shaders/terrain_tessellation/slang/terrain.frag.slang new file mode 100644 index 0000000000..e67fb67458 --- /dev/null +++ b/shaders/terrain_tessellation/slang/terrain.frag.slang @@ -0,0 +1,79 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] Sampler2D samplerHeight; +[[vk::binding(2, 0)]] Sampler2DArray samplerLayers; + +struct DSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; + float3 EyePos; + float3 WorldPos; +}; + +float3 sampleTerrainLayer(float2 inUV) +{ + // Define some layer ranges for sampling depending on terrain height + float2 layers[6]; + layers[0] = float2(-10.0, 10.0); + layers[1] = float2(5.0, 45.0); + layers[2] = float2(45.0, 80.0); + layers[3] = float2(75.0, 100.0); + layers[4] = float2(95.0, 150.0); + layers[5] = float2(140.0, 290.0); + + float3 color = float3(0.0, 0.0, 0.0); + + // Get height from displacement map + float height = samplerHeight.SampleLevel(inUV, 0.0).r * 255.0; + + for (int i = 0; i < 6; i++) + { + float range = layers[i].y - layers[i].x; + float weight = (range - abs(height - layers[i].y)) / range; + weight = max(0.0, weight); + color += weight * samplerLayers.Sample(float3(inUV * 16.0, i)).rgb; + } + + return color; +} + +float fog(float density, float4 FragCoord) +{ + const float LOG2 = -1.442695; + float dist = FragCoord.z / FragCoord.w * 0.1; + float d = density * dist; + return 1.0 - clamp(exp2(d * d * LOG2), 0.0, 1.0); +} + +[shader("fragment")] +float4 main(DSOutput input) +{ + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 ambient = float3(0.5, 0.5, 0.5); + float3 diffuse = max(dot(N, L), 0.0) * float3(1.0, 1.0, 1.0); + + float4 color = float4((ambient + diffuse) * sampleTerrainLayer(input.UV), 1.0); + + const float4 fogColor = float4(0.47, 0.5, 0.67, 0.0); + return lerp(color, fogColor, fog(0.25, input.Pos)); +} diff --git a/shaders/terrain_tessellation/slang/terrain.frag.spv b/shaders/terrain_tessellation/slang/terrain.frag.spv new file mode 100644 index 0000000000..7ac894a2ef Binary files /dev/null and b/shaders/terrain_tessellation/slang/terrain.frag.spv differ diff --git a/shaders/terrain_tessellation/slang/terrain.tesc.slang b/shaders/terrain_tessellation/slang/terrain.tesc.slang new file mode 100644 index 0000000000..8c9a1c16f7 --- /dev/null +++ b/shaders/terrain_tessellation/slang/terrain.tesc.slang @@ -0,0 +1,156 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4 lightPos; + float4 frustumPlanes[6]; + float displacementFactor; + float tessellationFactor; + float2 viewportDim; + float tessellatedEdgeSize; +}; +ConstantBuffer ubo; + +Sampler2D samplerHeight; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; +}; + +struct HSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; +}; + +struct ConstantsHSOutput +{ + float TessLevelOuter[4] : SV_TessFactor; + float TessLevelInner[2] : SV_InsideTessFactor; +}; + +// Calculate the tessellation factor based on screen space +// dimensions of the edge +float screenSpaceTessFactor(float4 p0, float4 p1) +{ + // Calculate edge mid point + float4 midPoint = 0.5 * (p0 + p1); + // Sphere radius as distance between the control points + float radius = distance(p0, p1) / 2.0; + + // View space + float4 v0 = mul(ubo.modelview, midPoint); + + // Project into clip space + float4 clip0 = mul(ubo.projection, (v0 - float4(radius, float3(0.0, 0.0, 0.0)))); + float4 clip1 = mul(ubo.projection, (v0 + float4(radius, float3(0.0, 0.0, 0.0)))); + + // Get normalized device coordinates + clip0 /= clip0.w; + clip1 /= clip1.w; + + // Convert to viewport coordinates + clip0.xy *= ubo.viewportDim; + clip1.xy *= ubo.viewportDim; + + // Return the tessellation factor based on the screen size + // given by the distance of the two edge control points in screen space + // and a reference (min.) tessellation size for the edge set by the application + return clamp(distance(clip0, clip1) / ubo.tessellatedEdgeSize * ubo.tessellationFactor, 1.0, 64.0); +} + +// Checks the current's patch visibility against the frustum using a sphere check +// Sphere radius is given by the patch size +bool frustumCheck(float4 Pos, float2 inUV) +{ + // Fixed radius (increase if patch size is increased in example) + const float radius = 8.0f; + float4 pos = Pos; + pos.y -= samplerHeight.SampleLevel(inUV, 0.0).r * ubo.displacementFactor; + + // Check sphere against frustum planes + for (int i = 0; i < 6; i++) { + if (dot(pos, ubo.frustumPlanes[i]) + radius < 0.0) + { + return false; + } + } + return true; +} + +ConstantsHSOutput ConstantsHS(InputPatch patch) +{ + ConstantsHSOutput output; + + if (!frustumCheck(patch[0].Pos, patch[0].UV)) + { + output.TessLevelInner[0] = 0.0; + output.TessLevelInner[1] = 0.0; + output.TessLevelOuter[0] = 0.0; + output.TessLevelOuter[1] = 0.0; + output.TessLevelOuter[2] = 0.0; + output.TessLevelOuter[3] = 0.0; + } + else + { + if (ubo.tessellationFactor > 0.0) + { + output.TessLevelOuter[0] = screenSpaceTessFactor(patch[3].Pos, patch[0].Pos); + output.TessLevelOuter[1] = screenSpaceTessFactor(patch[0].Pos, patch[1].Pos); + output.TessLevelOuter[2] = screenSpaceTessFactor(patch[1].Pos, patch[2].Pos); + output.TessLevelOuter[3] = screenSpaceTessFactor(patch[2].Pos, patch[3].Pos); + output.TessLevelInner[0] = lerp(output.TessLevelOuter[0], output.TessLevelOuter[3], 0.5); + output.TessLevelInner[1] = lerp(output.TessLevelOuter[2], output.TessLevelOuter[1], 0.5); + } + else + { + // Tessellation factor can be set to zero by example + // to demonstrate a simple passthrough + output.TessLevelInner[0] = 1.0; + output.TessLevelInner[1] = 1.0; + output.TessLevelOuter[0] = 1.0; + output.TessLevelOuter[1] = 1.0; + output.TessLevelOuter[2] = 1.0; + output.TessLevelOuter[3] = 1.0; + } + } + + return output; +} + +[domain("quad")] +[partitioning("integer")] +[outputtopology("triangle_cw")] +[outputcontrolpoints(4)] +[patchconstantfunc("ConstantsHS")] +[maxtessfactor(20.0f)] +[shader("hull")] +HSOutput main(InputPatch patch, uint InvocationID : SV_OutputControlPointID) +{ + HSOutput output; + output.Pos = patch[InvocationID].Pos; + output.Normal = patch[InvocationID].Normal; + output.UV = patch[InvocationID].UV; + return output; +} diff --git a/shaders/terrain_tessellation/slang/terrain.tesc.spv b/shaders/terrain_tessellation/slang/terrain.tesc.spv new file mode 100644 index 0000000000..3962ddcc05 Binary files /dev/null and b/shaders/terrain_tessellation/slang/terrain.tesc.spv differ diff --git a/shaders/terrain_tessellation/slang/terrain.tese.slang b/shaders/terrain_tessellation/slang/terrain.tese.slang new file mode 100644 index 0000000000..c35d1d5987 --- /dev/null +++ b/shaders/terrain_tessellation/slang/terrain.tese.slang @@ -0,0 +1,86 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4 lightPos; + float4 frustumPlanes[6]; + float displacementFactor; + float tessellationFactor; + float2 viewportDim; + float tessellatedEdgeSize; +}; +ConstantBuffer ubo; + +Sampler2D displacementMapSampler; + +struct HSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; +}; + +struct ConstantsHSOutput +{ + float TessLevelOuter[4] : SV_TessFactor; + float TessLevelInner[2] : SV_InsideTessFactor; +}; + +struct DSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; + float3 EyePos; + float3 WorldPos; +}; + +[domain("quad")] +[shader("domain")] +DSOutput main(ConstantsHSOutput input, float2 TessCoord : SV_DomainLocation, const OutputPatch patch) +{ + // Interpolate UV coordinates + DSOutput output; + float2 uv1 = lerp(patch[0].UV, patch[1].UV, TessCoord.x); + float2 uv2 = lerp(patch[3].UV, patch[2].UV, TessCoord.x); + output.UV = lerp(uv1, uv2, TessCoord.y); + + float3 n1 = lerp(patch[0].Normal, patch[1].Normal, TessCoord.x); + float3 n2 = lerp(patch[3].Normal, patch[2].Normal, TessCoord.x); + output.Normal = lerp(n1, n2, TessCoord.y); + + // Interpolate positions + float4 pos1 = lerp(patch[0].Pos, patch[1].Pos, TessCoord.x); + float4 pos2 = lerp(patch[3].Pos, patch[2].Pos, TessCoord.x); + float4 pos = lerp(pos1, pos2, TessCoord.y); + // Displace + pos.y -= displacementMapSampler.SampleLevel(output.UV, 0.0).r * ubo.displacementFactor; + // Perspective projection + output.Pos = mul(ubo.projection, mul(ubo.modelview, pos)); + + // Calculate vectors for lighting based on tessellated position + output.ViewVec = -pos.xyz; + output.LightVec = normalize(ubo.lightPos.xyz + output.ViewVec); + output.WorldPos = pos.xyz; + output.EyePos = mul(ubo.modelview, pos).xyz; + return output; +} \ No newline at end of file diff --git a/shaders/terrain_tessellation/slang/terrain.tese.spv b/shaders/terrain_tessellation/slang/terrain.tese.spv new file mode 100644 index 0000000000..35edf75f84 Binary files /dev/null and b/shaders/terrain_tessellation/slang/terrain.tese.spv differ diff --git a/shaders/terrain_tessellation/slang/terrain.vert.slang b/shaders/terrain_tessellation/slang/terrain.vert.slang new file mode 100644 index 0000000000..0a79a9f08c --- /dev/null +++ b/shaders/terrain_tessellation/slang/terrain.vert.slang @@ -0,0 +1,40 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.Pos = float4(input.Pos.xyz, 1.0); + output.UV = input.UV; + output.Normal = input.Normal; + return output; +} \ No newline at end of file diff --git a/shaders/terrain_tessellation/slang/terrain.vert.spv b/shaders/terrain_tessellation/slang/terrain.vert.spv new file mode 100644 index 0000000000..019baffd30 Binary files /dev/null and b/shaders/terrain_tessellation/slang/terrain.vert.spv differ diff --git a/shaders/texture_compression_basisu/glsl/texture.frag.spv b/shaders/texture_compression_basisu/glsl/texture.frag.spv new file mode 100644 index 0000000000..db50761444 Binary files /dev/null and b/shaders/texture_compression_basisu/glsl/texture.frag.spv differ diff --git a/shaders/texture_compression_basisu/glsl/texture.vert.spv b/shaders/texture_compression_basisu/glsl/texture.vert.spv new file mode 100644 index 0000000000..ab2eb19846 Binary files /dev/null and b/shaders/texture_compression_basisu/glsl/texture.vert.spv differ diff --git a/shaders/texture_compression_basisu/slang/texture.frag.slang b/shaders/texture_compression_basisu/slang/texture.frag.slang new file mode 100644 index 0000000000..e83631d2a3 --- /dev/null +++ b/shaders/texture_compression_basisu/slang/texture.frag.slang @@ -0,0 +1,30 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] Sampler2D samplerColor; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + return samplerColor.Sample( input.UV); +} \ No newline at end of file diff --git a/shaders/texture_compression_basisu/slang/texture.frag.spv b/shaders/texture_compression_basisu/slang/texture.frag.spv new file mode 100644 index 0000000000..7a3e003c10 Binary files /dev/null and b/shaders/texture_compression_basisu/slang/texture.frag.spv differ diff --git a/shaders/texture_compression_basisu/slang/texture.vert.slang b/shaders/texture_compression_basisu/slang/texture.vert.slang new file mode 100644 index 0000000000..406f5d5bb2 --- /dev/null +++ b/shaders/texture_compression_basisu/slang/texture.vert.slang @@ -0,0 +1,44 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float2 UV; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + return output; +} \ No newline at end of file diff --git a/shaders/texture_compression_basisu/slang/texture.vert.spv b/shaders/texture_compression_basisu/slang/texture.vert.spv new file mode 100644 index 0000000000..eb626139ce Binary files /dev/null and b/shaders/texture_compression_basisu/slang/texture.vert.spv differ diff --git a/shaders/texture_loading/glsl/texture.frag.spv b/shaders/texture_loading/glsl/texture.frag.spv new file mode 100644 index 0000000000..e0bc54e6d3 Binary files /dev/null and b/shaders/texture_loading/glsl/texture.frag.spv differ diff --git a/shaders/texture_loading/glsl/texture.vert.spv b/shaders/texture_loading/glsl/texture.vert.spv new file mode 100644 index 0000000000..4938ff8d5c Binary files /dev/null and b/shaders/texture_loading/glsl/texture.vert.spv differ diff --git a/shaders/texture_loading/hlsl/texture.frag.spv b/shaders/texture_loading/hlsl/texture.frag.spv index 89478fad6c..3b16872f1b 100644 Binary files a/shaders/texture_loading/hlsl/texture.frag.spv and b/shaders/texture_loading/hlsl/texture.frag.spv differ diff --git a/shaders/texture_loading/slang/texture.frag.slang b/shaders/texture_loading/slang/texture.frag.slang new file mode 100644 index 0000000000..b1cf7750f4 --- /dev/null +++ b/shaders/texture_loading/slang/texture.frag.slang @@ -0,0 +1,41 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] Sampler2D samplerColor; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + float LodBias; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float4 color = samplerColor.SampleBias(input.UV, input.LodBias); + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float3 diffuse = max(dot(N, L), 0.0); + float3 specular = (pow(max(dot(R, V), 0.0), 16.0)) * color.a; + return float4(diffuse * color.rgb + specular, 1.0); +} \ No newline at end of file diff --git a/shaders/texture_loading/slang/texture.frag.spv b/shaders/texture_loading/slang/texture.frag.spv new file mode 100644 index 0000000000..55fdbcb2cc Binary files /dev/null and b/shaders/texture_loading/slang/texture.frag.spv differ diff --git a/shaders/texture_loading/slang/texture.vert.slang b/shaders/texture_loading/slang/texture.vert.slang new file mode 100644 index 0000000000..0437516015 --- /dev/null +++ b/shaders/texture_loading/slang/texture.vert.slang @@ -0,0 +1,57 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float2 UV; + float3 Normal; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 viewPos; + float lodBias; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; + float LodBias; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + float3 vecPos = mul((float3x3) ubo.model, input.Pos); + float3 lightPos = mul((float3x3) ubo.model, (1.0).xxx); + output.UV = input.UV; + output.LodBias = ubo.lodBias; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos, 1.0))); + output.Normal = mul((float3x3) ubo.model, input.Normal); + output.LightVec = lightPos - vecPos; + output.ViewVec = ubo.viewPos.xyz - vecPos; + return output; +} \ No newline at end of file diff --git a/shaders/texture_loading/slang/texture.vert.spv b/shaders/texture_loading/slang/texture.vert.spv new file mode 100644 index 0000000000..eeb941dcd3 Binary files /dev/null and b/shaders/texture_loading/slang/texture.vert.spv differ diff --git a/shaders/texture_mipmap_generation/glsl/texture.frag.spv b/shaders/texture_mipmap_generation/glsl/texture.frag.spv new file mode 100644 index 0000000000..93d7aba11f Binary files /dev/null and b/shaders/texture_mipmap_generation/glsl/texture.frag.spv differ diff --git a/shaders/texture_mipmap_generation/glsl/texture.vert.spv b/shaders/texture_mipmap_generation/glsl/texture.vert.spv new file mode 100644 index 0000000000..1717e92b32 Binary files /dev/null and b/shaders/texture_mipmap_generation/glsl/texture.vert.spv differ diff --git a/shaders/texture_mipmap_generation/slang/texture.frag.slang b/shaders/texture_mipmap_generation/slang/texture.frag.slang new file mode 100644 index 0000000000..8cc99a5d62 --- /dev/null +++ b/shaders/texture_mipmap_generation/slang/texture.frag.slang @@ -0,0 +1,41 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct UBO +{ + float4x4 projection; + float4x4 model; + float lodBias; + int samplerIndex; +}; +ConstantBuffer ubo; + +Texture2D textureColor; +SamplerState samplers[3]; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("fragment")] +float4 main(VSOutput input) +{ + float3 color = textureColor.SampleBias(samplers[ubo.samplerIndex], input.UV * float2(2.0, 0.25), ubo.lodBias).rgb; + return float4(color, 1.0); +} \ No newline at end of file diff --git a/shaders/texture_mipmap_generation/slang/texture.frag.spv b/shaders/texture_mipmap_generation/slang/texture.frag.spv new file mode 100644 index 0000000000..473dc71c8c Binary files /dev/null and b/shaders/texture_mipmap_generation/slang/texture.frag.spv differ diff --git a/shaders/texture_mipmap_generation/slang/texture.vert.slang b/shaders/texture_mipmap_generation/slang/texture.vert.slang new file mode 100644 index 0000000000..dc52863116 --- /dev/null +++ b/shaders/texture_mipmap_generation/slang/texture.vert.slang @@ -0,0 +1,46 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float2 UV; +}; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float lodBias; + int samplerIndex; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(input.Pos.xyz, 1.0))); + return output; +} \ No newline at end of file diff --git a/shaders/texture_mipmap_generation/slang/texture.vert.spv b/shaders/texture_mipmap_generation/slang/texture.vert.spv new file mode 100644 index 0000000000..e3c95ef755 Binary files /dev/null and b/shaders/texture_mipmap_generation/slang/texture.vert.spv differ diff --git a/shaders/timeline_semaphore/game_of_life_init.comp b/shaders/timeline_semaphore/glsl/game_of_life_init.comp similarity index 96% rename from shaders/timeline_semaphore/game_of_life_init.comp rename to shaders/timeline_semaphore/glsl/game_of_life_init.comp index 1e0f680c79..1e4ac47a27 100644 --- a/shaders/timeline_semaphore/game_of_life_init.comp +++ b/shaders/timeline_semaphore/glsl/game_of_life_init.comp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/timeline_semaphore/glsl/game_of_life_init.comp.spv b/shaders/timeline_semaphore/glsl/game_of_life_init.comp.spv new file mode 100644 index 0000000000..64192ec3b3 Binary files /dev/null and b/shaders/timeline_semaphore/glsl/game_of_life_init.comp.spv differ diff --git a/shaders/timeline_semaphore/game_of_life_mutate.comp b/shaders/timeline_semaphore/glsl/game_of_life_mutate.comp similarity index 95% rename from shaders/timeline_semaphore/game_of_life_mutate.comp rename to shaders/timeline_semaphore/glsl/game_of_life_mutate.comp index fe93757d2e..7d37c41ba3 100644 --- a/shaders/timeline_semaphore/game_of_life_mutate.comp +++ b/shaders/timeline_semaphore/glsl/game_of_life_mutate.comp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/timeline_semaphore/glsl/game_of_life_mutate.comp.spv b/shaders/timeline_semaphore/glsl/game_of_life_mutate.comp.spv new file mode 100644 index 0000000000..e2c79be7d3 Binary files /dev/null and b/shaders/timeline_semaphore/glsl/game_of_life_mutate.comp.spv differ diff --git a/shaders/timeline_semaphore/game_of_life_update.comp b/shaders/timeline_semaphore/glsl/game_of_life_update.comp similarity index 97% rename from shaders/timeline_semaphore/game_of_life_update.comp rename to shaders/timeline_semaphore/glsl/game_of_life_update.comp index e79d0fb42a..d4d69dd4d3 100644 --- a/shaders/timeline_semaphore/game_of_life_update.comp +++ b/shaders/timeline_semaphore/glsl/game_of_life_update.comp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/timeline_semaphore/glsl/game_of_life_update.comp.spv b/shaders/timeline_semaphore/glsl/game_of_life_update.comp.spv new file mode 100644 index 0000000000..402c5662d8 Binary files /dev/null and b/shaders/timeline_semaphore/glsl/game_of_life_update.comp.spv differ diff --git a/shaders/timeline_semaphore/render.frag b/shaders/timeline_semaphore/glsl/render.frag similarity index 94% rename from shaders/timeline_semaphore/render.frag rename to shaders/timeline_semaphore/glsl/render.frag index 881821a2ae..b5301adcf1 100644 --- a/shaders/timeline_semaphore/render.frag +++ b/shaders/timeline_semaphore/glsl/render.frag @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/timeline_semaphore/glsl/render.frag.spv b/shaders/timeline_semaphore/glsl/render.frag.spv new file mode 100644 index 0000000000..6a1eb5ffdb Binary files /dev/null and b/shaders/timeline_semaphore/glsl/render.frag.spv differ diff --git a/shaders/timeline_semaphore/render.vert b/shaders/timeline_semaphore/glsl/render.vert similarity index 94% rename from shaders/timeline_semaphore/render.vert rename to shaders/timeline_semaphore/glsl/render.vert index b07652f98d..3c47228dbf 100644 --- a/shaders/timeline_semaphore/render.vert +++ b/shaders/timeline_semaphore/glsl/render.vert @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, Arm Limited and Contributors +/* Copyright (c) 2021-2025, Arm Limited and Contributors * * SPDX-License-Identifier: Apache-2.0 * diff --git a/shaders/timeline_semaphore/glsl/render.vert.spv b/shaders/timeline_semaphore/glsl/render.vert.spv new file mode 100644 index 0000000000..f3f20fa583 Binary files /dev/null and b/shaders/timeline_semaphore/glsl/render.vert.spv differ diff --git a/shaders/timeline_semaphore/slang/game_of_life_init.comp.slang b/shaders/timeline_semaphore/slang/game_of_life_init.comp.slang new file mode 100644 index 0000000000..b23655717b --- /dev/null +++ b/shaders/timeline_semaphore/slang/game_of_life_init.comp.slang @@ -0,0 +1,56 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::image_format("rgba8")]] RWTexture2D Image; + +// Slang/HLSL do not have GLSL's (not)equal functions +bool2 equal(int2 a, int2 b) { + return bool2(a.x == b.x, a.y == b.y); +} + +bool2 notEqual(int2 a, int2 b) { + return bool2(a.x != b.x, a.y != b.y); +} + +[shader("compute")] +[numthreads(8, 8, 1)] +void main(uint3 globalInvocationID: SV_DispatchThreadID) +{ + int2 index = globalInvocationID.xy; + bool is_alive; + + // Create an arbitrary pattern which happens to create a desirable result. + + int2 mask = lerp(int2(3), int2(7), notEqual(index & 16, int2(0))); + + int2 wrapped_index = index & mask; + if (all(equal(wrapped_index, int2(1, 0))) || + all(equal(wrapped_index, int2(2, 1))) || + all(equal(wrapped_index, int2(0, 2))) || + all(equal(wrapped_index, int2(1, 2))) || + all(equal(wrapped_index, int2(2, 2)))) + { + is_alive = true; + } + else + { + is_alive = false; + } + + Image[int2(globalInvocationID.xy)] = is_alive ? float4(1.0, 1.0, 1.0, 0.0) : float4(0.0); +} diff --git a/shaders/timeline_semaphore/slang/game_of_life_init.comp.spv b/shaders/timeline_semaphore/slang/game_of_life_init.comp.spv new file mode 100644 index 0000000000..31ff86916d Binary files /dev/null and b/shaders/timeline_semaphore/slang/game_of_life_init.comp.spv differ diff --git a/shaders/timeline_semaphore/slang/game_of_life_mutate.comp.slang b/shaders/timeline_semaphore/slang/game_of_life_mutate.comp.slang new file mode 100644 index 0000000000..03137e4a60 --- /dev/null +++ b/shaders/timeline_semaphore/slang/game_of_life_mutate.comp.slang @@ -0,0 +1,40 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::image_format("rgba8")]] RWTexture2D ImageOutput; +[[vk::binding(0, 1)]] Sampler2D ImageInput; + +// Slang/HLSL do not have GLSL's (not)equal functions +bool3 notEqual(float3 a, float3 b) { + return bool3(a.x != b.x, a.y != b.y, a.z != b.z); +} + +[shader("compute")] +[numthreads(8, 8, 1)] +void main(uint3 globalInvocationID: SV_DispatchThreadID, uniform float counter) +{ + float4 v = ImageInput.Load(int3(globalInvocationID.xy, 0)); + + // Increase intensity over time until the cell dies. + if (any(notEqual(v.rgb, float3(0.0)))) + v.w = max(v.w, counter); + else + v.w = 0.0; + + ImageOutput[globalInvocationID.xy] = v; +} diff --git a/shaders/timeline_semaphore/slang/game_of_life_mutate.comp.spv b/shaders/timeline_semaphore/slang/game_of_life_mutate.comp.spv new file mode 100644 index 0000000000..1995c350b4 Binary files /dev/null and b/shaders/timeline_semaphore/slang/game_of_life_mutate.comp.spv differ diff --git a/shaders/timeline_semaphore/slang/game_of_life_update.comp.slang b/shaders/timeline_semaphore/slang/game_of_life_update.comp.slang new file mode 100644 index 0000000000..1dbde10c66 --- /dev/null +++ b/shaders/timeline_semaphore/slang/game_of_life_update.comp.slang @@ -0,0 +1,86 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::image_format("rgba8")]] RWTexture2D ImageOutput; +[[vk::binding(0, 1)]] Sampler2D ImageInput; + +// Slang/HLSL do not have GLSL's (not)equal functions +bool3 notEqual(float3 a, float3 b) { + return bool3(a.x != b.x, a.y != b.y, a.z != b.z); +} + +[shader("compute")] +[numthreads(8, 8, 1)] +void main(uint3 globalInvocationID: SV_DispatchThreadID) +{ + float2 textureSize; + ImageInput.GetDimensions(textureSize.x, textureSize.y); + + int2 index = int2(globalInvocationID.xy); + float2 uv = (float2(index) + 0.5) / textureSize; + int neighbors = 0; + + float4 self = ImageInput.SampleLevel(uv, 0.0); + bool is_alive = any(notEqual(self.rgb, float3(0.0))); + float3 total = self.rgb; + +#define CHECK_OFFSET(x, y) { \ + float3 tmp; \ + tmp = ImageInput.SampleLevel(uv, 0.0, int2(x, y)).rgb; \ + if (any(notEqual(tmp, float3(0.0)))) { \ + neighbors++; \ + total += tmp.rgb; \ + } \ +} + CHECK_OFFSET(-1, -1) + CHECK_OFFSET( 0, -1) + CHECK_OFFSET(+1, -1) + CHECK_OFFSET(-1, 0) + CHECK_OFFSET(+1, 0) + CHECK_OFFSET(-1, +1) + CHECK_OFFSET( 0, +1) + CHECK_OFFSET(+1, +1) + + if (is_alive) + { + is_alive = neighbors == 2u || neighbors == 3u; + if (is_alive) + { + total /= float(neighbors); + } + else + { + total = float3(0.0); + } + } + else + { + is_alive = neighbors == 3u; + if (is_alive) + { + float3 fresh_color = float3(uv.x, uv.y, 1.0 - uv.x - uv.y); + total = fresh_color; + } + else + { + total = float3(0.0); + } + } + + ImageOutput[int2(globalInvocationID.xy)] = float4(total, 0.0); +} diff --git a/shaders/timeline_semaphore/slang/game_of_life_update.comp.spv b/shaders/timeline_semaphore/slang/game_of_life_update.comp.spv new file mode 100644 index 0000000000..8cbb92db68 Binary files /dev/null and b/shaders/timeline_semaphore/slang/game_of_life_update.comp.spv differ diff --git a/shaders/timeline_semaphore/slang/render.frag.slang b/shaders/timeline_semaphore/slang/render.frag.slang new file mode 100644 index 0000000000..0fd35caf21 --- /dev/null +++ b/shaders/timeline_semaphore/slang/render.frag.slang @@ -0,0 +1,37 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + float2 UV; +} + +Sampler2D in_image; + +float4 convert_color(float4 value) +{ + float gray = dot(value.rgb, float3(0.3, 0.6, 0.1)); + return float4(lerp(float3(gray), value.rgb, value.a), 1.0); +} + +[shader("fragment")] +float4 main(VSOutput input) +{ + return convert_color(in_image.SampleLevel(input.UV, 0.0)); +} diff --git a/shaders/timeline_semaphore/slang/render.frag.spv b/shaders/timeline_semaphore/slang/render.frag.spv new file mode 100644 index 0000000000..7089d35069 Binary files /dev/null and b/shaders/timeline_semaphore/slang/render.frag.spv differ diff --git a/shaders/timeline_semaphore/slang/render.vert.slang b/shaders/timeline_semaphore/slang/render.vert.slang new file mode 100644 index 0000000000..782e7a3860 --- /dev/null +++ b/shaders/timeline_semaphore/slang/render.vert.slang @@ -0,0 +1,37 @@ +/* Copyright (c) 2021-2025, Arm Limited and Contributors + * Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSOutput +{ + float4 Pos : SV_Position; + float2 UV; +} + +[shader("vertex")] +VSOutput main(uint vertexIndex: SV_VertexID) +{ + VSOutput output; + if (vertexIndex == 0) + output.Pos = float4(-1.0, -1.0, 0.0, 1.0); + else if (vertexIndex == 1) + output.Pos = float4(-1.0, 3.0, 0.0, 1.0); + else + output.Pos = float4(3.0, -1.0, 0.0, 1.0); + output.UV = output.Pos.xy * 0.5 + 0.5; + return output; +} diff --git a/shaders/timeline_semaphore/slang/render.vert.spv b/shaders/timeline_semaphore/slang/render.vert.spv new file mode 100644 index 0000000000..d094b4bcd6 Binary files /dev/null and b/shaders/timeline_semaphore/slang/render.vert.spv differ diff --git a/shaders/triangle.frag.spv b/shaders/triangle.frag.spv new file mode 100644 index 0000000000..ea9d3732d5 Binary files /dev/null and b/shaders/triangle.frag.spv differ diff --git a/shaders/triangle.vert.spv b/shaders/triangle.vert.spv new file mode 100644 index 0000000000..47a4a12123 Binary files /dev/null and b/shaders/triangle.vert.spv differ diff --git a/shaders/uioverlay/uioverlay.frag.spv b/shaders/uioverlay/uioverlay.frag.spv new file mode 100644 index 0000000000..ecf01e05d2 Binary files /dev/null and b/shaders/uioverlay/uioverlay.frag.spv differ diff --git a/shaders/uioverlay/uioverlay.vert.spv b/shaders/uioverlay/uioverlay.vert.spv new file mode 100644 index 0000000000..6eee68e4c5 Binary files /dev/null and b/shaders/uioverlay/uioverlay.vert.spv differ diff --git a/shaders/vertex_dynamic_state/glsl/gbuffer.frag.spv b/shaders/vertex_dynamic_state/glsl/gbuffer.frag.spv new file mode 100644 index 0000000000..e5f69dfb71 Binary files /dev/null and b/shaders/vertex_dynamic_state/glsl/gbuffer.frag.spv differ diff --git a/shaders/vertex_dynamic_state/glsl/gbuffer.vert.spv b/shaders/vertex_dynamic_state/glsl/gbuffer.vert.spv new file mode 100644 index 0000000000..5fbdae77ab Binary files /dev/null and b/shaders/vertex_dynamic_state/glsl/gbuffer.vert.spv differ diff --git a/shaders/vertex_dynamic_state/hlsl/gbuffer.frag.spv b/shaders/vertex_dynamic_state/hlsl/gbuffer.frag.spv index 1456b573ed..63c4e335e4 100644 Binary files a/shaders/vertex_dynamic_state/hlsl/gbuffer.frag.spv and b/shaders/vertex_dynamic_state/hlsl/gbuffer.frag.spv differ diff --git a/shaders/vertex_dynamic_state/slang/gbuffer.frag.slang b/shaders/vertex_dynamic_state/slang/gbuffer.frag.slang new file mode 100644 index 0000000000..71c0b240e1 --- /dev/null +++ b/shaders/vertex_dynamic_state/slang/gbuffer.frag.slang @@ -0,0 +1,113 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +[[vk::binding(1, 0)]] SamplerCube samplerEnvMap; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +struct FSOutput +{ + float4 Color0; +}; + +[[SpecializationConstant]] const int type = 0; + +struct UBOMatrices +{ + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float4x4 inverseModelView; + float modelscale; +}; +ConstantBuffer uboMatrices; + +[shader("fragment")] +FSOutput main(VSOutput input) +{ + FSOutput output; + float4 color; + float3 wcNormal; + + switch (type) + { + case 0: // Skybox + { + float3 normal = normalize(input.UVW); + color = samplerEnvMap.Sample(normal); + } + break; + + case 1: // Reflect + { + float3 wViewVec = mul((float3x3) uboMatrices.inverseModelView, normalize(input.ViewVec)); + float3 normal = normalize(input.Normal); + float3 wNormal = mul((float3x3) uboMatrices.inverseModelView, normal).xyz; + + float NdotL = max(dot(normal, input.LightVec), 0.0); + + float3 eyeDir = normalize(input.ViewVec); + float3 halfVec = normalize(input.LightVec + eyeDir); + float NdotH = max(dot(normal, halfVec), 0.0); + float NdotV = max(dot(normal, eyeDir), 0.0); + float VdotH = max(dot(eyeDir, halfVec), 0.0); + + // Geometric attenuation + float NH2 = 2.0 * NdotH; + float g1 = (NH2 * NdotV) / VdotH; + float g2 = (NH2 * NdotL) / VdotH; + float geoAtt = min(1.0, min(g1, g2)); + + const float F0 = 0.6; + const float k = 0.2; + + // Fresnel (schlick approximation) + float fresnel = pow(1.0 - VdotH, 5.0); + fresnel *= (1.0 - F0); + fresnel += F0; + + float spec = (fresnel * geoAtt) / (NdotV * NdotL * 3.14); + + color = samplerEnvMap.Sample(reflect(-wViewVec, wNormal)); + + color = float4(color.rgb * NdotL * (k + spec * (1.0 - k)), 1.0); + } + break; + + case 2: // Refract + { + float3 wViewVec = mul((float3x3) uboMatrices.inverseModelView, normalize(input.ViewVec)); + float3 wNormal = mul((float3x3)uboMatrices.inverseModelView, input.Normal); + color = samplerEnvMap.Sample(refract(-wViewVec, wNormal, 1.0 / 1.6)); + } + break; + } + + + // Color with manual exposure into attachment 0 + const float exposure = 1.0; + output.Color0.rgb = float3(1.0, 1.0, 1.0) - exp(-color.rgb * exposure); + + return output; +} diff --git a/shaders/vertex_dynamic_state/slang/gbuffer.frag.spv b/shaders/vertex_dynamic_state/slang/gbuffer.frag.spv new file mode 100644 index 0000000000..51bfcd3bc5 Binary files /dev/null and b/shaders/vertex_dynamic_state/slang/gbuffer.frag.spv differ diff --git a/shaders/vertex_dynamic_state/slang/gbuffer.vert.slang b/shaders/vertex_dynamic_state/slang/gbuffer.vert.slang new file mode 100644 index 0000000000..30c8a9e03c --- /dev/null +++ b/shaders/vertex_dynamic_state/slang/gbuffer.vert.slang @@ -0,0 +1,69 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 the "License"; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +struct VSInput +{ + float3 Pos : POSITION0; + float3 Normal; +}; + +[[SpecializationConstant]] const int type = 0; + +struct UBO +{ + float4x4 projection; + float4x4 modelview; + float4x4 skyboxModelview; + float4x4 inverseModelView; + float modelscale; +}; +ConstantBuffer ubo; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 UVW; + float3 Normal; + float3 ViewVec; + float3 LightVec; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.UVW = input.Pos; + float3 worldPos; + + switch (type) + { + case 0: // Skybox + worldPos = mul((float3x3) ubo.skyboxModelview, input.Pos); + output.Pos = mul(ubo.projection, float4(worldPos, 1.0)); + break; + case 1: // Object + worldPos = mul(ubo.modelview, float4(input.Pos * ubo.modelscale, 1.0)).xyz; + output.Pos = mul(ubo.projection, mul(ubo.modelview, float4(input.Pos * ubo.modelscale, 1.0))); + break; + } + output.Normal = mul((float3x3) ubo.modelview, input.Normal); + + float3 lightPos = float3(0.0f, -5.0f, 5.0f); + output.LightVec = lightPos - worldPos; + output.ViewVec = -worldPos; + return output; +} diff --git a/shaders/vertex_dynamic_state/slang/gbuffer.vert.spv b/shaders/vertex_dynamic_state/slang/gbuffer.vert.spv new file mode 100644 index 0000000000..946544f133 Binary files /dev/null and b/shaders/vertex_dynamic_state/slang/gbuffer.vert.spv differ diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index c8571ff944..4a769b4fb0 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -1,4 +1,5 @@ -# Copyright (c) 2019-2024, Arm Limited and Contributors +# Copyright (c) 2019-2025, Arm Limited and Contributors +# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # @@ -50,7 +51,7 @@ target_include_directories(vulkan SYSTEM INTERFACE ${VULKAN_INCLUDE_DIR}) target_compile_definitions(vulkan INTERFACE VK_NO_PROTOTYPES) if(VKB_ENABLE_PORTABILITY) - # When portability is enabled, must enable Vulkan beta extensions for access to VK_KHR_portability_subset + # When portability is enabled, must enable Vulkan beta extensions for access to VK_KHR_portability_subset target_compile_definitions(vulkan INTERFACE VK_ENABLE_BETA_EXTENSIONS) endif() @@ -59,7 +60,7 @@ if(ANDROID) elseif(WIN32) target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_WIN32_KHR) elseif(APPLE) - target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_METAL_EXT) + target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_METAL_EXT) elseif(UNIX) # Choose WSI based on VKB_WSI_SELECTION if (VKB_WSI_SELECTION STREQUAL XCB OR VKB_WSI_SELECTION STREQUAL XLIB OR VKB_WSI_SELECTION STREQUAL WAYLAND) @@ -154,6 +155,7 @@ set(KTX_SOURCES ${KTX_DIR}/lib/vkformat_enum.h ${KTX_DIR}/lib/vkformat_str.c ${KTX_DIR}/lib/vkformat_typesize.c + ${KTX_DIR}/lib/vkformat_check_variant.c ${KTX_DIR}/lib/vk_funcs.c ${KTX_DIR}/lib/vk_funcs.h ${KTX_DIR}/lib/vkloader.c @@ -228,55 +230,6 @@ target_include_directories(imgui SYSTEM PUBLIC ${IMGUI_DIR}) set_target_properties(imgui PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON) -# glslang -option(ENABLE_SPVREMAPPER OFF) -option(ENABLE_GLSLANG_BINARIES OFF) -set(ENABLE_HLSL ON) -option(ENABLE_OPT OFF) -option(BUILD_TESTING OFF) -option(BUILD_EXTERNAL OFF) -if(IOS) - option(ENABLE_PCH OFF) -endif () - -add_subdirectory(glslang) - -if (TARGET GenericCodeGen) - set_target_properties(GenericCodeGen PROPERTIES FOLDER "ThirdParty") -endif() -if (TARGET MachineIndependent) - set_target_properties(MachineIndependent PROPERTIES FOLDER "ThirdParty") -endif() -if (TARGET HLSL) - set_target_properties(HLSL PROPERTIES FOLDER "ThirdParty") -endif() - - -if (NOT TARGET glslang-default-resource-limits) - add_library(glslang-default-resource-limits - glslang/StandAlone/ResourceLimits.cpp) - - set_target_properties(glslang-default-resource-limits PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON) - - target_include_directories(glslang-default-resource-limits - SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/glslang) -endif() - -if(NOT MSVC) - target_compile_options(glslang PRIVATE - "-Wno-logical-op-parentheses" - "-Wno-unused-parameter") - - target_compile_options(SPIRV PRIVATE - "-Wno-logical-op-parentheses" - "-Wno-unused-parameter") -endif() - -set_target_properties(glslang PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON) -set_target_properties(OGLCompiler PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON) -set_target_properties(OSDependent PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON) -set_target_properties(SPIRV PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON) - # spirv-cross add_subdirectory(spirv-cross) @@ -303,18 +256,33 @@ target_include_directories(stb SYSTEM INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/stb # Allow the user to specify the ASTC architecture explicitly if building for a platform # other than the host architecture (i.e. x86 on an x64 CPU) if (NOT (DEFINED ASTC_ARCH)) - # On an x86_64 macbook, AVX2 is selected, but linking fails with this message, - # `ld: object file .../libastcdec-avx2-static.a was built for different x86_64 sub-type (8) than link command line (3)` - # so we fallback to native. If we're on an ARM based mac, there's no need for any SIMD extension, because they support - # ASTC_LDR natively, so this library won't even be used. if (APPLE) - set(ASTC_ARCH NATIVE) + # Always use NEON when host is arm64 or cross-compiling to iOS physical devices, + # otherwise look for supported vector instructions based on x86_64 host processor. + # Don't use AVX2 since it builds for x86_64h which does not match x86_64 project, + # and lastly fall back to NATIVE if no matches found. + if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "arm64" OR ${CMAKE_OSX_SYSROOT} STREQUAL "iphoneos") + set(ASTC_ARCH NEON) + else() + include( FindSSE41 ) + include( FindSSE2 ) + if (${SSE41_FOUND}) + set(ASTC_ARCH SSE41) + elseif(${SSE2_FOUND}) + set(ASTC_ARCH SSE2) + else() + set(ASTC_ARCH NATIVE) + endif() + endif() else() include( FindAVX2 ) + include( FindSSE41 ) include( FindSSE2 ) include( FindNEON ) if (${AVX2_FOUND}) set(ASTC_ARCH AVX2) + elseif(${SSE41_FOUND}) + set(ASTC_ARCH SSE41) elseif(${SSE2_FOUND}) set(ASTC_ARCH SSE2) elseif(${NEON_FOUND}) @@ -327,6 +295,10 @@ endif() string(TOUPPER ${ASTC_ARCH} ASTC_ARCH) string(TOLOWER ${ASTC_ARCH} ASTC_ARCH_LOWER) +# This is seemingly inconsistent, but the target library for SSE41 has a "." in its name +if(${ASTC_ARCH_LOWER} STREQUAL "sse41") + set(ASTC_ARCH_LOWER "sse4.1") +endif() set(ASTCENC_ISA_${ASTC_ARCH} ON) set(ASTCENC_CLI OFF) @@ -339,21 +311,6 @@ set(ASTC_TARGET ${ASTC_RAW_TARGET} PARENT_SCOPE) # astc add_subdirectory(astc) -# ASTC apparently tries to build for x86_64 even on Mac arm64 architectures, -# but we can force it to build for the correct arch -# Upstream bug: https://github.com/ARM-software/astc-encoder/issues/458 -if(IOS) - if(${CMAKE_OSX_SYSROOT} STREQUAL "iphonesimulator") - # handle iOS Simulator case, which should always match CMAKE_HOST_SYSTEM_PROCESSOR - set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR}) - else() - set(CMAKE_SYSTEM_PROCESSOR arm64) - endif() -endif () -if (APPLE AND (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")) - set_target_properties(${ASTC_RAW_TARGET} PROPERTIES OSX_ARCHITECTURES "arm64") -endif() - # astc doesn't have separate directories for it's source code and public interface. Additionally, it includes it's # own copy of STB. In order to avoid conflicts, we copy the only header we need to the build directory and alter the # INTERFACE_INCLUDE_DIRECTORIES of the target @@ -393,7 +350,7 @@ if(NOT ANDROID AND NOT IOS) option(GLFW_INSTALL OFF) option(BUILD_SHARED_LIBS ON) if (VKB_WSI_SELECTION STREQUAL WAYLAND) - set(GLFW_USE_WAYLAND ON) + set(GLFW_BUILD_WAYLAND ON) endif() add_subdirectory(glfw) @@ -414,39 +371,12 @@ set(SPDLOG_FMT_EXTERNAL ON) add_subdirectory(spdlog) set_property(TARGET spdlog PROPERTY FOLDER "ThirdParty") -# ctpl -add_library(ctpl INTERFACE) -set(CTPL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/CTPL) -target_sources(ctpl INTERFACE ${CTPL_DIR}/ctpl_stl.h) -target_include_directories(ctpl SYSTEM INTERFACE ${CTPL_DIR}) - -# cli11 -set(CLI11_SANITIZERS OFF) -set(CLI11_BUILD_DOCS OFF) -set(CLI11_BUILD_TESTS OFF) -set(CLI11_BUILD_EXAMPLES OFF) -set(CLI11_BUILD_EXAMPLES_JSON OFF) -set(CLI11_SINGLE_FILE_TESTS OFF) -set(CLI11_INSTALL OFF) -set(CLI11_FORCE_LIBCXX OFF) -set(CLI11_CUDA_TESTS OFF) -set(CLI11_CLANG_TIDY OFF) -add_subdirectory(cli11) -if (TARGET CLI11 AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.19) - set_property(TARGET CLI11 PROPERTY FOLDER "ThirdParty") -endif() - # OpenCL add_library(opencl INTERFACE) set(OPENCL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/opencl) target_sources(opencl INTERFACE ${OPENCL_INCLUDE_DIR}/CL/opencl.h) target_include_directories(opencl SYSTEM INTERFACE ${OPENCL_INCLUDE_DIR}) -# Catch2 -add_subdirectory(catch2) -set_property(TARGET Catch2 PROPERTY FOLDER "ThirdParty") -set_property(TARGET Catch2WithMain PROPERTY FOLDER "ThirdParty") - # Tracy if (VKB_PROFILING) set(TRACY_ENABLE ${VKB_PROFILING}) diff --git a/third_party/CTPL b/third_party/CTPL deleted file mode 160000 index 437e135dbd..0000000000 --- a/third_party/CTPL +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 437e135dbd94eb65b45533d9ce8ee28b5bd37b6d diff --git a/third_party/README.adoc b/third_party/README.adoc index 43cf624e93..4e84726ffb 100644 --- a/third_party/README.adoc +++ b/third_party/README.adoc @@ -1,5 +1,5 @@ //// -- Copyright (c) 2019-2024, Arm Limited and Contributors +- Copyright (c) 2019-2025, Arm Limited and Contributors - - SPDX-License-Identifier: Apache-2.0 - @@ -23,9 +23,7 @@ This project has multiple third-party dependencies, each of which may have independent licensing: * https://github.com/ARM-software/astc-encoder[astc-encoder]: ASTC Evaluation Codec -* https://github.com/catchorg/Catch2[Catch2]: Modern C++ test framework * https://github.com/CLIUtils/CLI11[CLI11] Command line parser for C++11 and beyond -* https://github.com/vit-vit/CTPL[CTPL]: Thread Pool Library * https://github.com/fmtlib/fmt[fmt]: A modern formating library * https://github.com/glfw/glfw[glfw]: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input * https://github.com/g-truc/glm[glm]: OpenGL Mathematics diff --git a/third_party/astc b/third_party/astc index 1a51f29151..30aabb3f42 160000 --- a/third_party/astc +++ b/third_party/astc @@ -1 +1 @@ -Subproject commit 1a51f2915121275038677317c8bf61f1a78b590c +Subproject commit 30aabb3f42406df45a910d8496f9bee17eeba9bb diff --git a/third_party/catch2 b/third_party/catch2 deleted file mode 160000 index 3f0283de7a..0000000000 --- a/third_party/catch2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3f0283de7a9c43200033da996ff9093be3ac84dc diff --git a/third_party/cli11 b/third_party/cli11 deleted file mode 160000 index a6c48261d4..0000000000 --- a/third_party/cli11 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a6c48261d4fb62b232c46277acbcc3d14d5b7e14 diff --git a/third_party/fmt b/third_party/fmt index dd6f657a79..40626af88b 160000 --- a/third_party/fmt +++ b/third_party/fmt @@ -1 +1 @@ -Subproject commit dd6f657a79104101a2e4ea6ba90f69e0dc114822 +Subproject commit 40626af88bd7df9a5fb80be7b25ac85b122d6c21 diff --git a/third_party/glfw b/third_party/glfw index 8f470597d6..21fea01161 160000 --- a/third_party/glfw +++ b/third_party/glfw @@ -1 +1 @@ -Subproject commit 8f470597d625ae28758c16b4293dd42d63e8a83a +Subproject commit 21fea01161e0d6b70c0c5c1f52dc8e7a7df14a50 diff --git a/third_party/glslang b/third_party/glslang deleted file mode 160000 index 54726b3c1c..0000000000 --- a/third_party/glslang +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 54726b3c1c5cb70043174365750ab0f1b7e1a6a0 diff --git a/third_party/hwcpipe b/third_party/hwcpipe index 0116b700a8..e4cfb5557a 160000 --- a/third_party/hwcpipe +++ b/third_party/hwcpipe @@ -1 +1 @@ -Subproject commit 0116b700a8d73189ece070279b62ca1b744cc965 +Subproject commit e4cfb5557aaa9e95a32f8b3d2f0f3f3f781f48ea diff --git a/third_party/ktx b/third_party/ktx index a46e85fdc4..a3603eda5c 160000 --- a/third_party/ktx +++ b/third_party/ktx @@ -1 +1 @@ -Subproject commit a46e85fdc4852cbdf46813695c4dabb4ee1d1b58 +Subproject commit a3603eda5c068cd91ab9729b3dddd81e5967ed88 diff --git a/third_party/spdlog b/third_party/spdlog index 7e635fca68..6fa36017cf 160000 --- a/third_party/spdlog +++ b/third_party/spdlog @@ -1 +1 @@ -Subproject commit 7e635fca68d014934b4af8a1cf874f63989352b7 +Subproject commit 6fa36017cfd5731d617e1a934f0e5ea9c4445b13 diff --git a/third_party/spirv-cross b/third_party/spirv-cross index 7512345f61..d8e3e2b141 160000 --- a/third_party/spirv-cross +++ b/third_party/spirv-cross @@ -1 +1 @@ -Subproject commit 7512345f61e5f9b543ebb87df678f3fe7735587b +Subproject commit d8e3e2b141b8c8a167b2e3984736a6baacff316c diff --git a/third_party/tinygltf b/third_party/tinygltf index c0d0251e2c..37250b3470 160000 --- a/third_party/tinygltf +++ b/third_party/tinygltf @@ -1 +1 @@ -Subproject commit c0d0251e2c7f2273a894aa1b125af9313a88eae4 +Subproject commit 37250b3470b517fd6823ee82d6e0495695bb7924 diff --git a/third_party/volk b/third_party/volk index 01986ac85f..a8da8ef336 160000 --- a/third_party/volk +++ b/third_party/volk @@ -1 +1 @@ -Subproject commit 01986ac85fa2e5c70df09aeae9c907e27c5d50b2 +Subproject commit a8da8ef3368482b0ee9b0ec0c6079a16a89c6924 diff --git a/third_party/vulkan b/third_party/vulkan index d91597a82f..2cd90f9d20 160000 --- a/third_party/vulkan +++ b/third_party/vulkan @@ -1 +1 @@ -Subproject commit d91597a82f881d473887b560a03a7edf2720b72c +Subproject commit 2cd90f9d20df57eac214c148f3aed885372ddcfe